λ§μ JavaScript λΌμ΄λΈλ¬λ¦¬κ° λΉλκΈ°μμ΄λ©° WebAssemblyκ° μμ§ Promiseλ₯Ό μ§μνλ κ²μ λ³΄μ§ λͺ»νμ΅λλ€.
JS μμ½μμ€ν
μ νμ©νλ κ³ μ±λ₯ μ ν리μΌμ΄μ
μ μ½κ² μμ±νλ €λ©΄ κ°μ Έμ¨ ν¨μμ promise μ§μμ μΆκ°νλ κ²μ΄ μ’μ΅λλ€.
μλ₯Ό λ€μ΄ λ€μκ³Ό κ°μ΄ μλν΄μΌ ν©λλ€.
const importObject = {
returnOneAsync: () => new Promise(done => done(1))
};
extern "C" int returnOneAsync();
int main(){
int x = returnOneAsync(); // should suspend main until promise resolved.
return x+x;
}
JS μ½μμ λͺ¨λ μ§μμ JS νΈμ€νΈ λ°μΈλ© μ μμ μΌλΆμ¬μΌ ν©λλ€.
κ·Έλ¬λ C μμ²΄κ° λΉλκΈ° μ€ν λ° μΌμ μ€λ¨μ μ΄ν΄ν΄μΌ νκΈ° λλ¬Έμ κ·νμ μμμ μ μν κ²μ²λΌ μλνμ§ μμ μ μμ΅λλ€. λν κ·νμ μμ μλ λΉλκΈ°κ° μμΌλ©° λ¨μ§ μ½μμ μμ±νλ―λ‘ λλ±ν μ½λλ JS μ체μμ μΌμ μ€λ¨λμ§ μκ³ "[object Promise][object Promise]"
μ κ°μ λ¬Έμμ΄μ μμ±ν©λλ€.
λν κ·νμ μμλ λΉλκΈ°κ° μμ΅λλ€.
μ, μ΄λ²€νΈ 루νκ° μ½μμ μ²λ¦¬ν λκΉμ§ κ°μ μ¬μ©ν μ μμ΅λλ€.
μμ΄λμ΄λ κ°μ μ¬μ©ν μ μμ λκΉμ§ μΉ μ΄μ
λΈλ¦¬ μμ§μ μ€νμ μΌμ μ€λ¨νλ κ²μ
λλ€.
μ 곡λ μλ λ¬Όλ‘ λ§€μ° μ¬μν©λλ€. λ³΄λ€ κ΅¬μ²΄μ μΈ μλ λ€νΈμν¬λ₯Ό ν΅ν΄ db 쿼리λ₯Ό λ§λλ κ²μ
λλ€. getAgeOf: (name) => db.find({name}).then(x=>x.age)
C μ체λ λΉλκΈ° μ€ν λ° μΌμ μ€λ¨μ μ΄ν΄νμ§ λͺ»νμ§λ§
κ·Έκ²μ μλͺ»λ κ²μ
λλ€. Cμ λν λ€μν μ½λ£¨ν΄ ꡬνμ΄ μμ΅λλ€.
λν LLVM-5.0 μ΄μμ μ½λ£¨ν΄ λ° async/awaitλ₯Ό μ§μν©λλ€.
https://llvm.org/docs/Coroutines.html
κ·Έλ¦¬κ³ C++17μ λΆλ‘μΌλ‘ clang-5.0λΆν° ꡬνλ μ½λ£¨ν΄ -tκ° μμ΅λλ€.
μ΄λ―Έ μ¬μ© μ€μΈ λͺ κ°μ§ μ€ν λΌμ΄λΈλ¬λ¦¬κ° μμ΅λλ€.
https://github.com/lewissbaker/cppcoro#generator
Cμμ μ½λ£¨ν΄ ꡬνμ JavaScriptμ μ΄λ²€νΈ 루νμ λ§μ μ²λΌ μνΈ μ΄μ©λμ§ μμ΅λλ€. λν μΌλ°μ μΌλ‘ ꡬνλ³ λμμ μμ‘΄ν©λλ€. μ½λ£¨ν΄μ΄λ λΉλκΈ°μ κ°μ κ²μ μμ μ μ΄κ³ μ΄μ κ°λ₯νκ² κ΅¬ννλ €λ©΄ μΈμ΄μμ ꡬλΆλ μ°μ ννκ° νμν©λλ€. Cκ° μ 곡ν΄μΌ νλ κ°μ₯ κ°κΉμ΄ κ²μ longjmpμΈλ°, μΆ©λΆνμ§ μκ³ νμ¬ Wasm μ체μμ ꡬνν μ μμ΅λλ€(Emscriptenμ μ¬μ©νλ©΄ longjmpλ JS μμΈκ° μλ JSμμ ꡬνλ¨). Wasmμ νμ¬ μ€λ¨μ ννν μ μμ§λ§ κ²°κ΅ μ΄λ¬ν λΌμΈμ λ°λΌ 무μΈκ°λ₯Ό μΆκ°ν κ³νμ΄ μμ΅λλ€. C++ μ½λ£¨ν΄μ μμ§ νμ€μ΄ μλλ©° Emscripten AFAICTμμ μ²λ¦¬ν μ μμ΅λλ€.
λλ λΉμ μ΄ μ΄λμμ μ€λμ§ λ΄
λλ€.
μ μκ°μ μΆ©λΆν νννμ§ λͺ»ν κ² κ°μμ.
C/C++μμ μ½λ£¨ν΄μ΄λ μ½μμ μ§μνκ±°λ wasm λ°μ΄νΈμ½λμμ μ΄λ₯Ό μ€ννμλ κ²μ΄ μλλλ€.
κ·Έλ¬λ C μμ²΄κ° λΉλκΈ° μ€ν λ° μΌμ μ€λ¨μ μ΄ν΄ν΄μΌ νκΈ° λλ¬Έμ κ·νμ μμμ μ μν κ²μ²λΌ μλνμ§ μμ μ μμ΅λλ€.
Cκ° λΉλκΈ° μ€νμ μ΄ν΄νλ κ²μ΄ μ νμνλ€κ³ μκ°ν©λκΉ?
μ½μμ΄ ν΄κ²°λ λκΉμ§ wasm μ€ν μμ§μ μΌμ μ€λ¨νλ κΈ°μ μ μΈ μ΄λ €μμ 무μμ λκΉ?
wasmμ 미리 x86μΌλ‘ μ»΄νμΌν΄μΌ νμ§λ§ μ€ν νλ¦μ μ μ΄ν μ μλ€λ μλ―Έλ μλλλ€.
μ€νμ μ€μ§νλ μΌλ°μ μΈ λ°©λ²μ ptraceμ κ°μ νλμ¨μ΄ μΈν°λ½νΈ λ° μμ€ν
νΈμΆμ μ¬μ©νλ κ²μ
λλ€. μ΄κ²μ΄ λλ²κ±°κ° μλνλ λ°©μμ
λλ€. μ°λ¦¬λ μ΄λ€ ν¨μλ₯Ό κ°μ Έμλμ§ μ νν μκ³ μμΌλ©° μ΄λ₯Ό μννκΈ° μν΄ μ μ ν (x86) opcodeλ₯Ό μ£Όμ
ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ ν΄λΉ ν¨μμ μ€ν μλκ° λλ €μ§μ§λ§ μ΄μ¨λ μ½μμ΄ ν΄κ²°λκΈ°λ₯Ό κΈ°λ€λ¦¬λ κ²½μ°μλ λ¬Έμ κ° λμ§ μμ΅λλ€.
μ΄κ²μ΄ LLVM κΈ°λ° C++JIT/AoTμμ μΌμ μ€λ¨/λλ²κ·Έ/μ¬κ°λ₯Ό ꡬνν λ°©λ²μ
λλ€.
μ΄ λ¬Έμ λ νΈμ€νΈ λ°μΈλ© 리ν¬μ§ν 리μ μ μΆν΄μΌ νλ€κ³ μκ°ν©λλ€...
λλ λΉμ μ΄ μΉμ κ³μ° λͺ¨λΈμ μλͺ» μ΄ν΄νκ³ μλ€κ³ μκ°ν©λλ€. JavaScriptλ λ€μ€ μ€λ λκ° μλλ―λ‘ κ³μ°μ μΌμ μ€λ¨νλ©΄ μμ§κ³Ό μ€μ λ‘ μ΄λ₯Ό νΈμ€ν νλ μ 체 λ λλ¬κ° μ€λ¨λ©λλ€. νμ΄μ§κ° μ μ§λκ³ λ€λ₯Έ μ½λλ μ€νν μ μμ΅λλ€(λ³λμ μμ μ μ μΈ). νκ°μ₯μΉκ° λ μκ°λλ‘ νλ €λ©΄ μ°μμ±μ ꡬ체ννκ³ λμ€μ 볡μνλ λ°©λ²μ΄ νμν©λλ€. μ΄λ νμ¬ μμ§μ΄ ν μ μλ μμ μ΄ μλλλ€.
λλ λΉμ μ΄ μΉμ κ³μ° λͺ¨λΈμ μλͺ» μ΄ν΄νκ³ μλ€κ³ μκ°ν©λλ€. JavaScriptλ λ€μ€ μ€λ λκ° μλλ―λ‘ κ³μ°μ μΌμ μ€λ¨νλ©΄ μμ§κ³Ό μ€μ λ‘ μ΄λ₯Ό νΈμ€ν νλ μ 체 λ λλ¬κ° μ€λ¨λ©λλ€. νμ΄μ§κ° μ μ§λκ³ λ€λ₯Έ μ½λλ μ€νν μ μμ΅λλ€(λ³λμ μμ μ μ μΈ). νκ°μ₯μΉκ° λ μκ°λλ‘ νλ €λ©΄ μ°μμ±μ ꡬ체ννκ³ λμ€μ 볡μνλ λ°©λ²μ΄ νμν©λλ€. μ΄λ νμ¬ μμ§μ΄ ν μ μλ μμ μ΄ μλλλ€.
μ ννλ, wasmμ λͺ¨λ UIλ₯Ό λ€λ£¨κΈ° 보λ€λ κ³μ° μμ μ μν΄ μμ±λμκΈ° λλ¬Έμ μμ μ λ΄λΆμμ μ€νλμ΄μΌ ν©λλ€.
κ°μ₯ μ μ©ν λκΈ
λλ λΉμ μ΄ μΉμ κ³μ° λͺ¨λΈμ μλͺ» μ΄ν΄νκ³ μλ€κ³ μκ°ν©λλ€. JavaScriptλ λ€μ€ μ€λ λκ° μλλ―λ‘ κ³μ°μ μΌμ μ€λ¨νλ©΄ μμ§κ³Ό μ€μ λ‘ μ΄λ₯Ό νΈμ€ν νλ μ 체 λ λλ¬κ° μ€λ¨λ©λλ€. νμ΄μ§κ° μ μ§λκ³ λ€λ₯Έ μ½λλ μ€νν μ μμ΅λλ€(λ³λμ μμ μ μ μΈ). νκ°μ₯μΉκ° λ μκ°λλ‘ νλ €λ©΄ μ°μμ±μ ꡬ체ννκ³ λμ€μ 볡μνλ λ°©λ²μ΄ νμν©λλ€. μ΄λ νμ¬ μμ§μ΄ ν μ μλ μμ μ΄ μλλλ€.