WebAssembly 컀μ€ν μΉμ μ κ°λ ₯ν κΈ°λ₯μ μμ보μΈμ. .wasm νμΌμ μ€μν λ©νλ°μ΄ν°, DWARFμ κ°μ λλ²κ·Έ μ 보, λκ΅¬λ³ λ°μ΄ν°λ₯Ό μ§μ ν¬ν¨νλ λ°©λ²μ λ°°μλλ€.
.wasmμ λΉλ° νκΈ°: WebAssembly 컀μ€ν μΉμ κ°μ΄λ
WebAssembly(Wasm)λ μΉκ³Ό κ·Έ λλ¨Έμμ κ³ μ±λ₯ μ½λμ λν μ°λ¦¬μ μκ°μ κ·Όλ³Έμ μΌλ‘ λ°κΎΈμμ΅λλ€. μ΄λ μ’ μ’ C++, Rust, Goμ κ°μ μΈμ΄λ₯Ό μν μ΄μμ± μκ³ , ν¨μ¨μ μ΄λ©°, μμ ν μ»΄νμΌ λμμΌλ‘ μΉμ‘λ°μ΅λλ€. νμ§λ§ Wasm λͺ¨λμ λ¨μν μ μμ€ λͺ λ Ήμ΄μ λμ΄ κ·Έ μ΄μμ λλ€. WebAssembly λ°μ΄λ리 ν¬λ§·μ μ€νλΏλ§ μλλΌ νμ₯μ±κΉμ§ κ³ λ €νμ¬ μ€κ³λ μ κ΅ν ꡬ쑰μ λλ€. μ΄λ¬ν νμ₯μ±μ μ£Όλ‘ κ°λ ₯νμ§λ§ μ’ μ’ κ°κ³Όλλ κΈ°λ₯μΈ μ»€μ€ν μΉμ (custom sections)μ ν΅ν΄ λ¬μ±λ©λλ€.
λΈλΌμ°μ κ°λ°μ λꡬμμ C++ μ½λλ₯Ό λλ²κΉ ν΄ λ³Έ μ μ΄ μκ±°λ Wasm νμΌμ΄ μ΄λ€ μ»΄νμΌλ¬λ‘ λ§λ€μ΄μ‘λμ§ μ΄λ»κ² μλμ§ κΆκΈνλ€λ©΄, μ¬λ¬λΆμ μ΄λ―Έ 컀μ€ν μΉμ μ κ²°κ³Όλ¬Όμ μ ν κ²μ λλ€. 컀μ€ν μΉμ μ κ°λ°μ κ²½νμ νλΆνκ² νκ³ μ 체 ν΄μ²΄μΈ μνκ³λ₯Ό κ°ννλ λ©νλ°μ΄ν°, λλ²κ·Έ μ 보 λ° κΈ°ν λΉνμ λ°μ΄ν°λ₯Ό μν μ§μ λ 곡κ°μ λλ€. μ΄ κΈμμλ WebAssembly 컀μ€ν μΉμ μ΄ λ¬΄μμΈμ§, μ νμμ μΈμ§, κ·Έλ¦¬κ³ μμ μ νλ‘μ νΈμμ μ΄λ»κ² νμ©ν μ μλμ§μ λν΄ μ’ ν©μ μΌλ‘ μ¬μΈ΅ λΆμν©λλ€.
WebAssembly λͺ¨λμ ꡬ쑰
컀μ€ν
μΉμ
μ κ°μΉλ₯Ό μ λλ‘ μ΄ν΄νλ €λ©΄ λ¨Όμ .wasm λ°μ΄λ리 νμΌμ κΈ°λ³Έ ꡬ쑰λ₯Ό μμμΌ ν©λλ€. Wasm λͺ¨λμ μ μ μλ μΌλ ¨μ "μΉμ
"μΌλ‘ ꡬμ±λ©λλ€. κ° μΉμ
μ νΉμ λͺ©μ μ κ°μ§λ©° μ«μ IDλ‘ μλ³λ©λλ€.
WebAssembly λͺ μΈλ Wasm μμ§μ΄ μ½λλ₯Ό μ€ννλ λ° νμν μΌλ ¨μ νμ€, μ¦ "μλ €μ§" μΉμ μ μ μν©λλ€. μ¬κΈ°μλ λ€μμ΄ ν¬ν¨λ©λλ€:
- Type (ID 1): λͺ¨λμμ μ¬μ©λλ ν¨μ μκ·Έλμ²(νλΌλ―Έν° λ° λ°ν νμ )λ₯Ό μ μν©λλ€.
- Import (ID 2): λͺ¨λμ΄ νΈμ€νΈ νκ²½(μ: JavaScript ν¨μ)μμ κ°μ Έμ€λ ν¨μ, λ©λͺ¨λ¦¬ λλ ν μ΄λΈμ μ μΈν©λλ€.
- Function (ID 3): λͺ¨λμ κ° ν¨μλ₯Ό Type μΉμ μ μκ·Έλμ²μ μ°κ²°ν©λλ€.
- Table (ID 4): μ£Όλ‘ κ°μ ν¨μ νΈμΆμ ꡬννλ λ° μ¬μ©λλ ν μ΄λΈμ μ μν©λλ€.
- Memory (ID 5): λͺ¨λμμ μ¬μ©νλ μ ν λ©λͺ¨λ¦¬λ₯Ό μ μν©λλ€.
- Global (ID 6): λͺ¨λμ μ μ λ³μλ₯Ό μ μΈν©λλ€.
- Export (ID 7): λͺ¨λμ ν¨μ, λ©λͺ¨λ¦¬, ν μ΄λΈ λλ μ μ λ³μλ₯Ό νΈμ€νΈ νκ²½μμ μ¬μ©ν μ μλλ‘ ν©λλ€.
- Start (ID 8): λͺ¨λμ΄ μΈμ€ν΄μ€νλ λ μλμΌλ‘ μ€νλ ν¨μλ₯Ό μ§μ ν©λλ€.
- Element (ID 9): ν μ΄λΈμ ν¨μ μ°Έμ‘°λ‘ μ΄κΈ°νν©λλ€.
- Code (ID 10): λͺ¨λμ κ° ν¨μμ λν μ€μ μ€ν κ°λ₯ν λ°μ΄νΈμ½λλ₯Ό ν¬ν¨ν©λλ€.
- Data (ID 11): μ ν λ©λͺ¨λ¦¬μ μΈκ·Έλ¨ΌνΈλ₯Ό μ΄κΈ°ννλ©°, μ’ μ’ μ μ λ°μ΄ν°μ λ¬Έμμ΄μ μ¬μ©λ©λλ€.
μ΄λ¬ν νμ€ μΉμ λ€μ λͺ¨λ Wasm λͺ¨λμ ν΅μ¬μ λλ€. Wasm μμ§μ νλ‘κ·Έλ¨μ μ΄ν΄νκ³ μ€ννκΈ° μν΄ μ΄λ€μ μ격νκ² νμ±ν©λλ€. νμ§λ§ ν΄μ²΄μΈμ΄λ μΈμ΄κ° μ€νμ νμνμ§ μμ μΆκ° μ 보λ₯Ό μ μ₯ν΄μΌ νλ€λ©΄ μ΄λ¨κΉμ? λ°λ‘ μ΄λ 컀μ€ν μΉμ μ΄ μ¬μ©λ©λλ€.
컀μ€ν μΉμ μ΄λ μ νν 무μμΈκ°?
컀μ€ν μΉμ μ Wasm λͺ¨λ λ΄μ μμ λ°μ΄ν°λ₯Ό μν λ²μ© 컨ν μ΄λμ λλ€. μ΄λ λͺ μΈμ λ°λΌ νΉλ³ν μΉμ ID 0μΌλ‘ μ μλ©λλ€. ꡬ쑰λ κ°λ¨νμ§λ§ κ°λ ₯ν©λλ€:
- μΉμ ID: νμ 0μ΄λ©°, 컀μ€ν μΉμ μμ μλ―Έν©λλ€.
- μΉμ ν¬κΈ°: λ€λ°λ₯΄λ λ΄μ©μ μ 체 ν¬κΈ°(λ°μ΄νΈ λ¨μ)μ λλ€.
- μ΄λ¦: 컀μ€ν μΉμ μ λͺ©μ μ μλ³νλ UTF-8 μΈμ½λ© λ¬Έμμ΄μ λλ€(μ: "name", ".debug_info").
- νμ΄λ‘λ: μΉμ μ μ€μ λ°μ΄ν°λ₯Ό ν¬ν¨νλ λ°μ΄νΈ μνμ€μ λλ€.
컀μ€ν μΉμ μ λν κ°μ₯ μ€μν κ·μΉμ λ€μκ³Ό κ°μ΅λλ€: 컀μ€ν μΉμ μ μ΄λ¦μ μΈμνμ§ λͺ»νλ WebAssembly μμ§μ ν΄λΉ νμ΄λ‘λλ₯Ό 무μν΄μΌ ν©λλ€. μμ§μ λ¨μν μΉμ ν¬κΈ°μ μ μλ λ°μ΄νΈλ§νΌ 건λλλλ€. μ΄ μ°μν μ€κ³λ λͺ κ°μ§ μ£Όμ μ΄μ μ μ 곡ν©λλ€:
- μ λ°© νΈνμ±: μλ‘μ΄ λκ΅¬κ° κΈ°μ‘΄ Wasm λ°νμμ λ§κ°λ¨λ¦¬μ§ μκ³ μλ‘μ΄ μ»€μ€ν μΉμ μ λμ ν μ μμ΅λλ€.
- μνκ³ νμ₯μ±: μΈμ΄ ꡬνμ, λꡬ κ°λ°μ, λ²λ€λ¬κ° ν΅μ¬ Wasm λͺ μΈλ₯Ό λ³κ²½ν νμ μμ΄ μμ λ§μ λ©νλ°μ΄ν°λ₯Ό ν¬ν¨ν μ μμ΅λλ€.
- λ컀νλ§: μ€ν λ‘μ§μ΄ λ©νλ°μ΄ν°μ μμ ν λΆλ¦¬λ©λλ€. 컀μ€ν μΉμ μ μ 무λ νλ‘κ·Έλ¨μ λ°νμ λμμ μν₯μ λ―ΈμΉμ§ μμ΅λλ€.
컀μ€ν μΉμ μ JPEG μ΄λ―Έμ§μ EXIF λ°μ΄ν°λ MP3 νμΌμ ID3 νκ·Έμ κ°λ€κ³ μκ°νλ©΄ λ©λλ€. μ΄λ μ μ©ν 컨ν μ€νΈλ₯Ό μ 곡νμ§λ§ μ΄λ―Έμ§λ₯Ό νμνκ±°λ μμ μ μ¬μνλ λ° νμλ μλλλ€.
μΌλ°μ μΈ μ¬μ© μ¬λ‘ 1: μ¬λμ΄ μ½μ μ μλ λλ²κΉ μ μν "name" μΉμ
κ°μ₯ λ리 μ¬μ©λλ 컀μ€ν
μΉμ
μ€ νλλ name μΉμ
μ
λλ€. κΈ°λ³Έμ μΌλ‘ Wasm ν¨μ, λ³μ λ° κΈ°ν νλͺ©μ μ«μ μΈλ±μ€λ‘ μ°Έμ‘°λ©λλ€. μμ Wasm λμ€μ΄μ
λΈλ¦¬λ₯Ό 보면 call $func42μ κ°μ κ²μ λ³Ό μ μμ΅λλ€. μ΄λ κΈ°κ³μκ²λ ν¨μ¨μ μ΄μ§λ§, μΈκ° κ°λ°μμκ²λ λμμ΄ λμ§ μμ΅λλ€.
name μΉμ
μ μΈλ±μ€μ μ¬λμ΄ μ½μ μ μλ λ¬Έμμ΄ μ΄λ¦ κ°μ λ§΅μ μ 곡νμ¬ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€. μ΄λ₯Ό ν΅ν΄ λμ€μ΄μ
λΈλ¬λ λλ²κ±°μ κ°μ λκ΅¬κ° μλ³Έ μμ€ μ½λμ μλ―Έ μλ μλ³μλ₯Ό νμν μ μμ΅λλ€.
μλ₯Ό λ€μ΄, λ€μκ³Ό κ°μ C ν¨μλ₯Ό μ»΄νμΌνλ€κ³ κ°μ ν΄ λ΄ μλ€:
int calculate_total(int items, int price) {
return items * price;
}
μ»΄νμΌλ¬λ λ΄λΆ ν¨μ μΈλ±μ€(μ: 42)λ₯Ό λ¬Έμμ΄ "calculate_total"κ³Ό μ°κ²°νλ name μΉμ
μ μμ±ν μ μμ΅λλ€. λν μ§μ λ³μμ μ΄λ¦μ "items"μ "price"λ‘ μ§μ ν μλ μμ΅λλ€. μ΄ μΉμ
μ μ§μνλ λꡬμμ Wasm λͺ¨λμ κ²μ¬νλ©΄ λλ²κΉ
κ³Ό λΆμμ λμμ΄ λλ ν¨μ¬ λ μ μ©ν μ 보λ₯Ό λ³Ό μ μμ΅λλ€.
`name` μΉμ μ ꡬ쑰
name μΉμ
μ체λ κ°κ° λ¨μΌ λ°μ΄νΈλ‘ μλ³λλ νμ μΉμ
μΌλ‘ λλ©λλ€:
- λͺ¨λ μ΄λ¦ (ID 0): μ 체 λͺ¨λμ μ΄λ¦μ μ 곡ν©λλ€.
- ν¨μ μ΄λ¦ (ID 1): ν¨μ μΈλ±μ€λ₯Ό ν΄λΉ μ΄λ¦μ λ§€νν©λλ€.
- μ§μ λ³μ μ΄λ¦ (ID 2): κ° ν¨μ λ΄μ μ§μ λ³μ μΈλ±μ€λ₯Ό ν΄λΉ μ΄λ¦μ λ§€νν©λλ€.
- λ μ΄λΈ μ΄λ¦, νμ μ΄λ¦, ν μ΄λΈ μ΄λ¦ λ±: Wasm λͺ¨λ λ΄μ κ±°μ λͺ¨λ μν°ν°μ μ΄λ¦μ μ§μ νκΈ° μν λ€λ₯Έ νμ μΉμ μ΄ μ‘΄μ¬ν©λλ€.
name μΉμ
μ μ’μ κ°λ°μ κ²½νμ ν₯ν 첫걸μμ΄μ§λ§, μ΄λ μμμ λΆκ³Όν©λλ€. μ§μ ν μμ€ λ 벨 λλ²κΉ
μ μν΄μλ ν¨μ¬ λ κ°λ ₯ν κ²μ΄ νμν©λλ€.
λλ²κΉ μ ν΅μ¬: 컀μ€ν μΉμ μμ DWARF
Wasm κ°λ°μ μ±λ°°λ μμ€ λ 벨 λλ²κΉ μ λλ€: λΈλΌμ°μ κ°λ°μ λꡬ λ΄μμ μ§μ μλ³Έ C++, Rust λλ Go μ½λμ μ€λ¨μ μ μ€μ νκ³ , λ³μλ₯Ό κ²μ¬νλ©°, μ½λλ₯Ό ν λ¨κ³μ© μ€ννλ λ₯λ ₯μ λλ€. μ΄ λ§λ² κ°μ κ²½νμ κ±°μ μ μ μΌλ‘ DWARF λλ²κ·Έ μ 보λ₯Ό μΌλ ¨μ 컀μ€ν μΉμ λ΄μ ν¬ν¨ν¨μΌλ‘μ¨ κ°λ₯ν΄μ§λλ€.
DWARFλ 무μμΈκ°?
DWARF(Debugging With Attributed Record Formats)λ νμ€νλ, μΈμ΄μ ꡬμ λ°μ§ μλ λλ²κΉ λ°μ΄ν° νμμ λλ€. μ΄λ GCC λ° Clangκ³Ό κ°μ λ€μ΄ν°λΈ μ»΄νμΌλ¬κ° GDB λ° LLDBμ κ°μ λλ²κ±°λ₯Ό νμ±ννκΈ° μν΄ μ¬μ©νλ κ²κ³Ό λμΌν νμμ λλ€. μ΄λ λ§€μ° νλΆνλ©° λ€μκ³Ό κ°μ λ°©λν μμ μ 보λ₯Ό μΈμ½λ©ν μ μμ΅λλ€:
- μμ€ λ§€ν: λͺ¨λ WebAssembly λͺ λ Ήμ΄λ₯Ό μλ³Έ μμ€ νμΌ, μ€ λ²νΈ, μ΄ λ²νΈλ‘ μ ννκ² λ§€νν©λλ€.
- λ³μ μ 보: μ§μ λ° μ μ λ³μμ μ΄λ¦, νμ , λ²μ. μ½λμ νΉμ μ§μ μμ λ³μκ° μ΄λμ μ μ₯λμ΄ μλμ§(λ μ§μ€ν°, μ€ν λ±)λ₯Ό μκ³ μμ΅λλ€.
- νμ μ μ: μμ€ μΈμ΄μ ꡬ쑰체, ν΄λμ€, μ΄κ±°ν, 곡μ©μ²΄μ κ°μ 볡μ‘ν νμ μ λν μμ ν μ€λͺ .
- ν¨μ μ 보: νλΌλ―Έν° μ΄λ¦κ³Ό νμ μ ν¬ν¨ν ν¨μ μκ·Έλμ²μ λν μΈλΆ μ 보.
- μΈλΌμΈ ν¨μ λ§€ν: μ΅μ ν νλ‘κ·Έλ¨μ μν΄ ν¨μκ° μΈλΌμΈλμμ λλ νΈμΆ μ€νμ μ¬κ΅¬μ±νκΈ° μν μ 보.
DWARFκ° WebAssemblyμ ν¨κ» μλνλ λ°©μ
Emscripten(Clang/LLVM μ¬μ©) λ° `rustc`μ κ°μ μ»΄νμΌλ¬μλ Wasm λ°μ΄νΈμ½λμ ν¨κ» DWARF μ 보λ₯Ό μμ±νλλ‘ μ§μνλ νλκ·Έ(μΌλ°μ μΌλ‘ -g λλ -g4)κ° μμ΅λλ€. κ·Έλ° λ€μ ν΄μ²΄μΈμ μ΄ DWARF λ°μ΄ν°λ₯Ό κ°μ Έμ λ
Όλ¦¬μ λΆλΆμΌλ‘ λΆν νκ³ κ° λΆλΆμ .wasm νμΌ λ΄μ λ³λ 컀μ€ν
μΉμ
μ ν¬ν¨μν΅λλ€. κ΄λ‘μ λ°λΌ μ΄λ¬ν μΉμ
μ μ΄λ¦μ μ μΌλ‘ μμν©λλ€:
.debug_info: κΈ°λ³Έ λλ²κ·Έ νλͺ©μ ν¬ν¨νλ ν΅μ¬ μΉμ ..debug_abbrev:.debug_infoμ ν¬κΈ°λ₯Ό μ€μ΄κΈ° μν μ½μ΄λ₯Ό ν¬ν¨ν©λλ€..debug_line: Wasm μ½λλ₯Ό μμ€ μ½λλ‘ λ§€ννκΈ° μν μ€ λ²νΈ ν μ΄λΈ..debug_str: λ€λ₯Έ DWARF μΉμ μμ μ¬μ©νλ λ¬Έμμ΄ ν μ΄λΈ..debug_ranges,.debug_locλ° κΈ°ν λ€μ.
μ΄ Wasm λͺ¨λμ Chromeμ΄λ Firefoxμ κ°μ μ΅μ λΈλΌμ°μ μμ λ‘λνκ³ κ°λ°μ λꡬλ₯Ό μ΄λ©΄, λꡬ λ΄μ DWARF νμκ° μ΄λ¬ν 컀μ€ν μΉμ μ μ½μ΅λλ€. κ·Έλ¬λ©΄ μλ³Έ μμ€ μ½λμ λ·°λ₯Ό μ 곡νλ λ° νμν λͺ¨λ μ 보λ₯Ό μ¬κ΅¬μ±νμ¬, λ§μΉ λ€μ΄ν°λΈμμ μ€νλλ κ²μ²λΌ λλ²κΉ ν μ μκ² ν΄μ€λλ€.
μ΄κ²μ κ²μ 체μΈμ μ λλ€. 컀μ€ν μΉμ μ DWARFκ° μλ€λ©΄ Wasm λλ²κΉ μ μμ λ©λͺ¨λ¦¬μ ν΄λ λΆκ°λ₯ν λμ€μ΄μ λΈλ¦¬λ₯Ό μ³λ€λ³΄λ κ³ ν΅μ€λ¬μ΄ κ³Όμ μ΄ λ κ²μ λλ€. μ΄κ²μ΄ μμΌλ©΄ κ°λ° 루νκ° JavaScriptλ₯Ό λλ²κΉ νλ κ²λ§νΌμ΄λ μνν΄μ§λλ€.
λλ²κΉ μ λμ΄μ: 컀μ€ν μΉμ μ λ€λ₯Έ μ©λ
λλ²κΉ μ΄ μ£Όμ μ¬μ© μ¬λ‘μ΄μ§λ§, 컀μ€ν μΉμ μ μ μ°μ± λλΆμ κ΄λ²μν ν΄λ§ λ° μΈμ΄λ³ μꡬμ μ±νλμμ΅λλ€.
λκ΅¬λ³ λ©νλ°μ΄ν°: `producers` μΉμ
μ£Όμ΄μ§ Wasm λͺ¨λμ λ§λλ λ° μ΄λ€ λκ΅¬κ° μ¬μ©λμλμ§ μλ κ²μ μ’ μ’ μ μ©ν©λλ€. `producers` μΉμ μ μ΄λ₯Ό μν΄ μ€κ³λμμ΅λλ€. μ΄ μΉμ μλ μ»΄νμΌλ¬, λ§μ»€ λ° ν΄λΉ λ²μ κ³Ό κ°μ ν΄μ²΄μΈμ λν μ λ³΄κ° μ μ₯λ©λλ€. μλ₯Ό λ€μ΄, `producers` μΉμ μλ λ€μμ΄ ν¬ν¨λ μ μμ΅λλ€:
- μΈμ΄: "C++ 17", "Rust 1.65.0"
- μ²λ¦¬ λꡬ: "Clang 16.0.0", "binaryen 111"
- SDK: "Emscripten 3.1.25"
μ΄ λ©νλ°μ΄ν°λ λΉλλ₯Ό μ¬ννκ³ , μ¬λ°λ₯Έ ν΄μ²΄μΈ μμ±μμκ² λ²κ·Έλ₯Ό λ³΄κ³ νκ³ , Wasm λ°μ΄λ리μ μΆμ²λ₯Ό μ΄ν΄ν΄μΌ νλ μλνλ μμ€ν μ λ§€μ° μ€μν©λλ€.
λ§νΉ λ° λμ λΌμ΄λΈλ¬λ¦¬
μλ ννμ WebAssembly λͺ μΈμλ λ§νΉ κ°λ μ΄ μμμ΅λλ€. μ μ λ° λμ λΌμ΄λΈλ¬λ¦¬ μμ±μ νμ±ννκΈ° μν΄ μ»€μ€ν μΉμ μ μ¬μ©νλ κ΄λ‘κ° ν립λμμ΅λλ€. `linking` 컀μ€ν μΉμ μ Wasmμ μΈμνλ λ§μ»€(μ: `wasm-ld`)κ° μ¬λ³Όμ ν΄μνκ³ , μ¬λ°°μΉλ₯Ό μ²λ¦¬νλ©°, 곡μ λΌμ΄λΈλ¬λ¦¬ μ’ μμ±μ κ΄λ¦¬νλ λ° νμν λ©νλ°μ΄ν°λ₯Ό 보μ ν©λλ€. μ΄λ₯Ό ν΅ν΄ λκ·λͺ¨ μ ν리μΌμ΄μ μ λ€μ΄ν°λΈ κ°λ°μμμ²λΌ λ μκ³ κ΄λ¦¬νκΈ° μ¬μ΄ λͺ¨λλ‘ λλ μ μμ΅λλ€.
μΈμ΄λ³ λ°νμ
Go, Swift λλ Kotlinκ³Ό κ°μ΄ κ΄λ¦¬ν λ°νμμ΄ μλ μΈμ΄λ μ’ μ’ ν΅μ¬ Wasm λͺ¨λΈμ μΌλΆκ° μλ λ©νλ°μ΄ν°λ₯Ό νμλ‘ ν©λλ€. μλ₯Ό λ€μ΄, κ°λΉμ§ 컬λ ν°(GC)λ ν¬μΈν°λ₯Ό μλ³νκΈ° μν΄ λ©λͺ¨λ¦¬μ μλ λ°μ΄ν° ꡬ쑰μ λ μ΄μμμ μμμΌ ν©λλ€. μ΄ λ μ΄μμ μ 보λ 컀μ€ν μΉμ μ μ μ₯λ μ μμ΅λλ€. λ§μ°¬κ°μ§λ‘, Goμ 리νλ μ κ³Ό κ°μ κΈ°λ₯μ μ»΄νμΌ νμμ νμ μ΄λ¦κ³Ό λ©νλ°μ΄ν°λ₯Ό μ μ₯νκΈ° μν΄ μ»€μ€ν μΉμ μ μμ‘΄ν μ μμΌλ©°, Wasm λͺ¨λμ Go λ°νμμ μ€ν μ€μ μ΄λ₯Ό μ½μ μ μμ΅λλ€.
λ―Έλ: WebAssembly μ»΄ν¬λνΈ λͺ¨λΈ
WebAssemblyμ κ°μ₯ ν₯λ―Έλ‘μ΄ λ―Έλ λ°©ν₯ μ€ νλλ μ»΄ν¬λνΈ λͺ¨λΈμ λλ€. μ΄ μ μμ Wasm λͺ¨λ κ°μ μ§μ ν μΈμ΄μ ꡬμ λ°μ§ μλ μνΈ μ΄μ©μ±μ κ°λ₯νκ² νλ κ²μ λͺ©νλ‘ ν©λλ€. Rust μ»΄ν¬λνΈκ° Python μ»΄ν¬λνΈλ₯Ό μννκ² νΈμΆνκ³ , μ΄ Python μ»΄ν¬λνΈλ λ€μ C++ μ»΄ν¬λνΈλ₯Ό μ¬μ©νλ, νλΆν λ°μ΄ν° νμ μ΄ μ€κ°λ μ₯λ©΄μ μμν΄ λ³΄μμμ€.
μ»΄ν¬λνΈ λͺ¨λΈμ κ³ μμ€ μΈν°νμ΄μ€, νμ λ° μλ(worlds)λ₯Ό μ μνκΈ° μν΄ μ»€μ€ν μΉμ μ ν¬κ² μμ‘΄ν©λλ€. μ΄ λ©νλ°μ΄ν°λ μ»΄ν¬λνΈκ° μ΄λ»κ² ν΅μ νλμ§ μ€λͺ νμ¬, λκ΅¬κ° νμν κΈλ£¨ μ½λλ₯Ό μλμΌλ‘ μμ±ν μ μλλ‘ ν©λλ€. μ΄λ 컀μ€ν μΉμ μ΄ ν΅μ¬ Wasm νμ€ μμ μ κ΅ν μ κΈ°λ₯μ ꡬμΆνκΈ° μν κΈ°λ°μ μ 곡νλ λνμ μΈ μμ λλ€.
μ€μ© κ°μ΄λ: 컀μ€ν μΉμ κ²μ¬ λ° μ‘°μνκΈ°
컀μ€ν μΉμ μ μ΄ν΄νλ κ²μ μ’μ§λ§, μ€μ λ‘ μ΄λ»κ² λ€λ£° μ μμκΉμ? μ΄ λͺ©μ μ μν΄ μ¬λ¬ νμ€ λꡬλ₯Ό μ¬μ©ν μ μμ΅λλ€.
νμ λꡬ
- WABT (The WebAssembly Binary Toolkit): μ΄ λꡬ λͺ¨μμ λͺ¨λ Wasm κ°λ°μμκ² νμμ μ
λλ€. νΉν
wasm-objdumpμ νΈλ¦¬ν°κ° μ μ©ν©λλ€.wasm-objdump -h your_module.wasmμ μ€ννλ©΄ 컀μ€ν μΉμ μ ν¬ν¨ν λͺ¨λμ λͺ¨λ μΉμ μ΄ λμ΄λ©λλ€. - Binaryen: Wasmμ μν κ°λ ₯ν μ»΄νμΌλ¬ λ° ν΄μ²΄μΈ μΈνλΌμ
λλ€. λͺ¨λμμ 컀μ€ν
μΉμ
μ μ κ±°νλ μ νΈλ¦¬ν°μΈ
wasm-stripμ ν¬ν¨ν©λλ€. - Dwarfdump: DWARF λλ²κ·Έ μΉμ μ λ΄μ©μ μ¬λμ΄ μ½μ μ μλ νμμΌλ‘ νμ±νκ³ μΆλ ₯νλ νμ€ μ νΈλ¦¬ν°μ λλ€(μ’ μ’ Clang/LLVMκ³Ό ν¨κ» ν¨ν€μ§λ¨).
μμ μν¬νλ‘μ°: λΉλ, κ²μ¬, μ κ±°
κ°λ¨ν C++ νμΌμΈ main.cppλ₯Ό μ¬μ©νμ¬ μΌλ°μ μΈ κ°λ° μν¬νλ‘μ°λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
#include
int main() {
std::cout << "Hello from WebAssembly!" << std::endl;
return 0;
}
1. λλ²κ·Έ μ 보μ ν¨κ» μ»΄νμΌ:
Emscriptenμ μ¬μ©νμ¬ μ΄λ₯Ό WasmμΌλ‘ μ»΄νμΌνλ©°, -g νλκ·Έλ₯Ό μ¬μ©νμ¬ DWARF λλ²κ·Έ μ 보λ₯Ό ν¬ν¨ν©λλ€.
emcc main.cpp -g -o main.wasm
2. μΉμ
κ²μ¬:
μ΄μ wasm-objdumpλ₯Ό μ¬μ©νμ¬ λ΄λΆμ 무μμ΄ μλμ§ νμΈν΄ λ³΄κ² μ΅λλ€.
wasm-objdump -h main.wasm
μΆλ ₯μλ νμ€ μΉμ
(Type, Function, Code λ±)λΏλ§ μλλΌ name, .debug_info, .debug_line λ±κ³Ό κ°μ κΈ΄ 컀μ€ν
μΉμ
λͺ©λ‘μ΄ νμλ©λλ€. νμΌ ν¬κΈ°λ₯Ό μ£Όλͺ©νμμμ€. λλ²κ·Έκ° μλ λΉλλ³΄λ€ ν¨μ¬ ν΄ κ²μ
λλ€.
3. νλ‘λμ
μ μν΄ μ κ±°:
νλ‘λμ
릴리μ€μ κ²½μ°, λͺ¨λ λλ²κ·Έ μ λ³΄κ° ν¬ν¨λ μ΄ ν° νμΌμ λ°°ν¬νκ³ μΆμ§ μμ΅λλ€. wasm-stripμ μ¬μ©νμ¬ μ΄λ₯Ό μ κ±°ν©λλ€.
wasm-strip main.wasm -o main.stripped.wasm
4. λ€μ κ²μ¬:
wasm-objdump -h main.stripped.wasmμ μ€ννλ©΄ λͺ¨λ 컀μ€ν
μΉμ
μ΄ μ¬λΌμ§ κ²μ λ³Ό μ μμ΅λλ€. main.stripped.wasmμ νμΌ ν¬κΈ°λ μλ³Έμ μΌλΆμ λΆκ³Όνμ¬ λ€μ΄λ‘λ λ° λ‘λ μλκ° ν¨μ¬ λΉ¨λΌμ§λλ€.
μ₯λ¨μ : ν¬κΈ°, μ±λ₯, κ·Έλ¦¬κ³ μ¬μ©μ±
컀μ€ν μΉμ , νΉν DWARFμ κ²½μ° ν κ°μ§ μ£Όμ λ¨μ μ΄ μμ΅λλ€: νμΌ ν¬κΈ°μ λλ€. DWARF λ°μ΄ν°κ° μ€μ Wasm μ½λλ³΄λ€ 5~10λ°° λ ν° κ²μ λλ¬Έ μΌμ΄ μλλλ€. μ΄λ λ€μ΄λ‘λ μκ°μ΄ μ€μν μΉ μ ν리μΌμ΄μ μ μλΉν μν₯μ λ―ΈμΉ μ μμ΅λλ€.
μ΄κ²μ΄ λ°λ‘ "νλ‘λμ μ μν΄ μ κ±°" μν¬νλ‘μ°κ° μ€μν μ΄μ μ λλ€. κ°μ₯ μ’μ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€:
- κ°λ° μ€: νλΆν μμ€ λ 벨 λλ²κΉ κ²½νμ μν΄ μ 체 DWARF μ λ³΄κ° ν¬ν¨λ λΉλλ₯Ό μ¬μ©ν©λλ€.
- νλ‘λμ μ©: μ¬μ©μμκ² μμ ν μ κ±°λ(stripped) Wasm λ°μ΄λ리λ₯Ό λ°°ν¬νμ¬ κ°λ₯ν κ°μ₯ μμ ν¬κΈ°μ κ°μ₯ λΉ λ₯Έ λ‘λ μκ°μ 보μ₯ν©λλ€.
μΌλΆ κ³ κΈ μ€μ μμλ λλ²κ·Έ λ²μ μ λ³λμ μλ²μμ νΈμ€ν νκΈ°λ ν©λλ€. κ°λ°μκ° νλ‘λμ λ¬Έμ λ₯Ό λλ²κΉ νκ³ μΆμ λ λΈλΌμ°μ κ°λ°μ λꡬλ₯Ό ꡬμ±νμ¬ μ΄ λ ν° νμΌμ νμμ λ°λΌ κ°μ Έμ€λλ‘ ν μ μμ΄ λ κ°μ§ μ₯μ μ λͺ¨λ λ릴 μ μμ΅λλ€. μ΄λ JavaScriptμ μμ€ λ§΅ μλ λ°©μκ³Ό μ μ¬ν©λλ€.
컀μ€ν μΉμ μ λ°νμ μ±λ₯μ κ±°μ μν₯μ λ―ΈμΉμ§ μλλ€λ μ μ μ μνλ κ²μ΄ μ€μν©λλ€. Wasm μμ§μ ID 0μΌλ‘ μ΄λ₯Ό μ μνκ² μλ³νκ³ νμ± μ€μ νμ΄λ‘λλ₯Ό λ¨μν 건λλλλ€. λͺ¨λμ΄ λ‘λλλ©΄ 컀μ€ν μΉμ λ°μ΄ν°λ μμ§μμ μ¬μ©λμ§ μμΌλ―λ‘ μ½λ μ€ν μλλ₯Ό λ¦μΆμ§ μμ΅λλ€.
κ²°λ‘
WebAssembly 컀μ€ν μΉμ μ νμ₯ κ°λ₯ν λ°μ΄λ리 ν¬λ§· μ€κ³μ κ±Έμμ λλ€. μ΄λ ν΅μ¬ λͺ μΈλ₯Ό 볡μ‘νκ² λ§λ€κ±°λ λ°νμ μ±λ₯μ μν₯μ μ£Όμ§ μμΌλ©΄μ νλΆν λ©νλ°μ΄ν°λ₯Ό ν¬ν¨ν μ μλ νμ€νλκ³ μ λ°© νΈν κ°λ₯ν λ©μ»€λμ¦μ μ 곡ν©λλ€. μ΄λ νλ Wasm κ°λ°μ κ²½νμ λ·λ°μΉ¨νλ 보μ΄μ§ μλ μμ§μΌλ‘, λλ²κΉ μ λν΄ν κΈ°μ μμ μννκ³ μμ°μ μΈ νλ‘μΈμ€λ‘ λ³νμν΅λλ€.
κ°λ¨ν ν¨μ μ΄λ¦μμλΆν° ν¬κ΄μ μΈ DWARFμ μΈκ³μ μ»΄ν¬λνΈ λͺ¨λΈμ λ―Έλμ μ΄λ₯΄κΈ°κΉμ§, 컀μ€ν μΉμ μ WebAssemblyλ₯Ό λ¨μν μ»΄νμΌ λμμμ λ²μ±νλ, λꡬ μΉνμ μΈ μνκ³λ‘ 격μμν€λ μμμ λλ€. λ€μμ λΈλΌμ°μ μμ μ€ν μ€μΈ Rust μ½λμ μ€λ¨μ μ μ€μ ν λ, κ·Έκ²μ κ°λ₯νκ² ν 컀μ€ν μΉμ μ μ‘°μ©νκ³ κ°λ ₯ν μμ μ μ μ κ°μν΄ λ³΄μμμ€.