Design: μ œμ•ˆ: Async/Await JS API

에 λ§Œλ“  2021λ…„ 07μ›” 26일  Β·  16μ½”λ©˜νŠΈ  Β·  좜처: WebAssembly/design

이 μ œμ•ˆμ€ @fmccabe , @thibaudmichaud , @lukewagner 및 @kripken 과의 ν˜‘λ ₯으둜 κ°œλ°œλ˜μ—ˆμœΌλ©° Stacks ν•˜μœ„ 그룹의 ν”Όλ“œλ°±κ³Ό ν•¨κ»˜ κ°œλ°œλ˜μ—ˆμŠ΅λ‹ˆλ‹€(였늘 0λ‹¨κ³„λ‘œ μ§„ν–‰ν•˜λŠ” 것을 μŠΉμΈν•˜λŠ” 비곡식 νˆ¬ν‘œ 포함). μ‹œκ°„ μ œμ•½μœΌλ‘œ 인해 κ³„νšμ€ 맀우 λΉ λ₯Έ(즉, 5λΆ„) ν”„λ ˆμ  ν…Œμ΄μ…˜μ„ ν•˜κ³  8μ›” 3일에 1λ‹¨κ³„λ‘œ μ§„ν–‰ν•˜κΈ° μœ„ν•΄ νˆ¬ν‘œν•  μ˜ˆμ •μž…λ‹ˆλ‹€. 이λ₯Ό μ΄‰μ§„ν•˜κΈ° μœ„ν•΄ μ‚¬λžŒλ“€μ΄ 미리 여기에 우렀 사항을 μ œκΈ°ν•˜μ—¬ ν”„λ ˆμ  ν…Œμ΄μ…˜+νˆ¬ν‘œλ₯Ό 더 λ§Žμ€ μ‹œκ°„κ³Ό ν•¨κ»˜ λ‚˜μ€‘μ— λ‚ μ§œλ‘œ λ―Έλ£° λ§Œν•œ μ£Όμš” 우렀 사항이 μžˆλŠ”μ§€ κ²°μ •ν•  수 μžˆλ„λ‘ κ°•λ ₯히 ꢌμž₯ν•©λ‹ˆλ‹€.

이 μ œμ•ˆμ˜ λͺ©μ μ€ JavaScript Promise와 WebAssembly 간에 μƒλŒ€μ μœΌλ‘œ 효율적이고 μƒλŒ€μ μœΌλ‘œ 인체곡학적인 μƒν˜Έ μš΄μš©μ„±μ„ μ œκ³΅ν•˜μ§€λ§Œ 핡심 wasm이 μ•„λ‹Œ JS API에 λŒ€ν•œ λ³€κ²½ μ‚¬ν•­λ§Œ μžˆλ‹€λŠ” μ œμ•½ 쑰건 ν•˜μ—μ„œ μž‘μ—…ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
Stack-Switching μ œμ•ˆ 이 κ²°κ΅­ 핡심 WebAssemblyλ₯Ό ν™•μž₯ν•˜μ—¬ 이 μ œμ•ˆμ—μ„œ μ œκ³΅ν•˜λŠ” μž‘μ—…μ„ WebAssembly λ‚΄μ—μ„œ 직접 κ΅¬ν˜„ν•˜λŠ” κΈ°λŠ₯κ³Ό ν•¨κ»˜ λ‹€λ₯Έ λ§Žμ€ κ°€μΉ˜ μžˆλŠ” μŠ€νƒ μ „ν™˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  κ²ƒμœΌλ‘œ κΈ°λŒ€ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μŠ€νƒ μ „ν™˜μ— λŒ€ν•œ 이 νŠΉμ • μ‚¬μš© μ‚¬λ‘€λŠ” JS APIλ₯Ό 톡해 더 λΉ λ₯Έ 경둜λ₯Ό μ œκ³΅ν•˜κΈ°μ— μΆ©λΆ„ν•œ κΈ΄κΈ‰μ„±μž…λ‹ˆλ‹€.
μžμ„Έν•œ λ‚΄μš© 은 2021λ…„ 6μ›” 28일 μŠ€νƒ ν•˜μœ„ κ·Έλ£Ή 회의 의 λ…ΈνŠΈμ™€ μŠ¬λΌμ΄λ“œλ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. μ—¬κΈ°μ—μ„œλŠ” μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€μ™€ κ³ λ €ν•œ μš”μ†Œλ₯Ό μžμ„Ένžˆ μ„€λͺ…ν•˜κ³  λ‹€μŒ 섀계에 λ„λ‹¬ν•œ κ·Όκ±°λ₯Ό μš”μ•½ν•©λ‹ˆλ‹€.

μ—…λ°μ΄νŠΈ: Stacks Subgroup이 TC39λ‘œλΆ€ν„° 받은 ν”Όλ“œλ°±μ— 따라 이 μ œμ•ˆμ€ WebAssembly μŠ€νƒ 만 μΌμ‹œ μ€‘λ‹¨ν•˜λ„λ‘ ν—ˆμš©ν•©λ‹ˆλ‹€. JavaScript μ–Έμ–΄λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©° 특히 λΆ„λ¦¬λœ asycn λŒ€ν•œ 지원을 κ°„μ ‘μ μœΌλ‘œ ν™œμ„±ν™”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ await .

이것은 WebAssembly.Function λ₯Ό Function 의 ν•˜μœ„ 클래슀둜 μ†Œκ°œν•˜λŠ” js-types μ œμ•ˆμ— (λŠμŠ¨ν•˜κ²Œ) μ˜μ‘΄ν•©λ‹ˆλ‹€.

μƒν˜Έ μž‘μš©

μ œμ•ˆμ€ λ‹€μŒκ³Ό 같은 μΈν„°νŽ˜μ΄μŠ€, μƒμ„±μž 및 λ©”μ„œλ“œλ₯Ό JS API에 μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ μ•„λž˜μ—μ„œ μ„€λͺ…ν•©λ‹ˆλ‹€.

interface Suspender {
   constructor();
   Function suspendOnReturnedPromise(Function func); // import wrapper
   // overloaded: WebAssembly.Function suspendOnReturnedPromise(WebAssembly.Function func);
   WebAssembly.Function returnPromiseOnSuspend(WebAssembly.Function func); // export wrapper
}

μ˜ˆμ‹œ

λ‹€μŒμ€ 이 APIλ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μ˜ μ˜ˆμž…λ‹ˆλ‹€.
우리의 μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ WebAssembly λͺ¨λ“ˆμ΄ κ°œλ…μ μœΌλ‘œ "동기" 및 "비동기" κ°€μ Έμ˜€κΈ° 및 내보내기λ₯Ό κ°–λŠ” 것을 κ³ λ €ν•˜λŠ” 것이 μœ μš©ν•˜λ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.
ν˜„μž¬ JS APIλŠ” "동기" κ°€μ Έμ˜€κΈ° 및 λ‚΄λ³΄λ‚΄κΈ°λ§Œ μ§€μ›ν•©λ‹ˆλ‹€.
Suspender μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œλŠ” "비동기"λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ κ΄€λ ¨ κ°€μ Έμ˜€κΈ° 및 내보내기λ₯Ό λž˜ν•‘ν•˜λŠ” 데 μ‚¬μš©λ˜λ©° Suspender 개체 μžμ²΄λŠ” κ΅¬ν˜„κ³Ό ꡬ성 κ°€λŠ₯성을 μš©μ΄ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ μ΄λŸ¬ν•œ κ°€μ Έμ˜€κΈ° 및 내보내기λ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν•¨κ»˜ μ—°κ²°ν•©λ‹ˆλ‹€.

μ›Ή μ–΄μ…ˆλΈ”λ¦¬( demo.wasm ):

(module
    (import "js" "init_state" (func $init_state (result f64)))
    (import "js" "compute_delta" (func $compute_delta (result f64)))
    (global $state f64)
    (func $init (global.set $state (call $init_state)))
    (start $init)
    (func $get_state (export "get_state") (result f64) (global.get $state))
    (func $update_state (export "update_state") (result f64)
      (global.set (f64.add (global.get $state) (call $compute_delta)))
      (global.get $state)
    )
)

ν…μŠ€νŠΈ( data.txt ):

19827.987

μžλ°”μŠ€ν¬λ¦½νŠΈ:

var suspender = new Suspender();
var init_state = () => 2.71;
var compute_delta = () => fetch('data.txt').then(res => res.text()).then(txt => parseFloat(txt));
var importObj = {js: {
    init_state: init_state,
    compute_delta: suspender.suspendOnReturnedPromise(compute_delta)
}};

fetch('demo.wasm').then(response =>
    response.arrayBuffer()
).then(buffer =>
    WebAssembly.instantiate(buffer, importObj)
).then(({module, instance}) => {
    var get_state = instance.exports.get_state;
    var update_state = suspender.returnPromiseOnSuspend(instance.exports.update_state);
    ...
});

이 μ˜ˆμ œμ—λŠ” 맀우 λ‹¨μˆœν•œ μƒνƒœ 머신인 WebAssembly λͺ¨λ“ˆμ΄ μžˆμŠ΅λ‹ˆλ‹€. μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•  λ•Œλ§ˆλ‹€ μƒνƒœμ— μΆ”κ°€ν•  델타λ₯Ό κ³„μ‚°ν•˜κΈ° μœ„ν•΄ κ°€μ Έμ˜€κΈ°λ₯Ό ν˜ΈμΆœν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ JavaScript μΈ‘μ—μ„œλŠ” 델타λ₯Ό κ³„μ‚°ν•˜λŠ” 데 μ‚¬μš©ν•˜λ €λŠ” ν•¨μˆ˜λ₯Ό λΉ„λ™κΈ°μ‹μœΌλ‘œ μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. 즉, 숫자 μžμ²΄κ°€ μ•„λ‹Œ 숫자의 약속을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

μš°λ¦¬λŠ” μƒˆλ‘œμš΄ JS APIλ₯Ό μ‚¬μš©ν•˜μ—¬ 이 동기화 간격을 λ©”μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.
μ˜ˆμ œμ—μ„œ WebAssembly λͺ¨λ“ˆμ˜ κ°€μ Έμ˜€κΈ°λŠ” suspender.suspendOnReturnedPromise μ‚¬μš©ν•˜μ—¬ λž˜ν•‘λ˜κ³  λ‚΄λ³΄λ‚΄κΈ°λŠ” suspender.returnPromiseOnSuspend μ‚¬μš©ν•˜μ—¬ λž˜ν•‘λ©λ‹ˆλ‹€. λ‘˜ λ‹€ λ™μΌν•œ suspender ν•©λ‹ˆλ‹€.
κ·Έ suspender λŠ” λ‘˜μ„ ν•¨κ»˜ μ—°κ²°ν•©λ‹ˆλ‹€.
(λž˜ν•‘λ˜μ§€ μ•Šμ€) κ°€μ Έμ˜€κΈ°κ°€ Promiseλ₯Ό λ°˜ν™˜ν•˜λŠ” 경우 (λž˜ν•‘λœ) 내보내기가 Promiseλ₯Ό λ°˜ν™˜ν•˜λ„λ‘ ν•˜λ©°, κ·Έ μ‚¬μ΄μ˜ λͺ¨λ“  계산은 κ°€μ Έμ˜€κΈ°μ˜ Promiseκ°€ 해결될 λ•ŒκΉŒμ§€ "μΌμ‹œ 쀑단"λ©λ‹ˆλ‹€.
내보내기 λž˜ν•‘μ€ 기본적으둜 async 마컀λ₯Ό μΆ”κ°€ν•˜κ³  κ°€μ Έμ˜€κΈ° λž˜ν•‘μ€ 기본적으둜 await 마컀λ₯Ό μΆ”κ°€ν•˜μ§€λ§Œ JavaScript와 달리 λͺ…μ‹œμ μœΌλ‘œ async μŠ€λ ˆλ“œν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€ await λͺ¨λ“  쀑간 WebAssembly κΈ°λŠ₯을 톡해!

ν•œνŽΈ, μ΄ˆκΈ°ν™” 쀑에 init_state λŒ€ν•œ ν˜ΈμΆœμ€ λ°˜λ“œμ‹œ μΌμ‹œ 쀑단 없이 λ°˜ν™˜λ˜κ³  내보내기 get_state 에 λŒ€ν•œ ν˜ΈμΆœλ„ 항상 μΌμ‹œ 쀑단 없이 λ°˜ν™˜λ˜λ―€λ‘œ μ œμ•ˆμ„œλŠ” μ—¬μ „νžˆ κΈ°μ‘΄ "동기식" κ°€μ Έμ˜€κΈ° 및 내보내기λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. WebAssembly μƒνƒœκ³„λŠ” μ˜€λŠ˜λ‚  μ‚¬μš©ν•©λ‹ˆλ‹€.
λ¬Όλ‘  동기 내보내기가 비동기 κ°€μ Έμ˜€κΈ°λ₯Ό ν˜ΈμΆœν•˜λŠ” 경우 κ°€μ Έμ˜€κΈ°κ°€ μΌμ‹œ μ€‘λ‹¨λ˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ νŠΈλž©λœλ‹€λŠ” 사싀과 같이 훑어보고 μžˆλŠ” λ§Žμ€ μ„ΈλΆ€ 사항이 μžˆμŠ΅λ‹ˆλ‹€.
λ‹€μŒμ€ 보닀 μžμ„Έν•œ 사양과 일뢀 κ΅¬ν˜„ μ „λž΅μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

사양

Suspender λŠ” λ‹€μŒ μƒνƒœ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

  • λΉ„ν™œμ„± - ν˜„μž¬ μ‚¬μš©λ˜μ§€ μ•ŠμŒ
  • ν™œμ„± [ caller ] - μ»¨νŠΈλ‘€μ€ Suspender 에 있으며 caller λŠ” Suspender λ₯Ό ν˜ΈμΆœν•˜κ³  externref κΈ°λŒ€ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€
  • μΌμ‹œ 쀑단됨 - ν˜„μž¬ 일뢀 약속이 ν•΄κ²°λ˜κΈ°λ₯Ό 기닀리고 μžˆμŠ΅λ‹ˆλ‹€.

상기 방법은 suspender.returnPromiseOnSuspend(func) μ£Όμž₯ func AλŠ” WebAssembly.Function ν˜•νƒœμ˜ ν•¨μˆ˜ μœ ν˜• [ti*] -> [to] ν›„ 리턴 WebAssembly.Function 와 ν•¨μˆ˜ ν˜•μ‹ [ti*] -> [externref] μΈμˆ˜μ™€ ν•¨κ»˜ 호좜될 λ•Œ λ‹€μŒμ„ μˆ˜ν–‰ν•˜λŠ” args :

  1. suspender 의 μƒνƒœκ°€ λΉ„ν™œμ„± 이 μ•„λ‹Œ 경우 트랩
  2. suspender 의 μƒνƒœλ₯Ό ν™œμ„± [ caller ]으둜 λ³€κ²½ν•©λ‹ˆλ‹€(μ—¬κΈ°μ„œ caller λŠ” ν˜„μž¬ ν˜ΈμΆœμžμž„).
  3. result func(args) (λ˜λŠ” λͺ¨λ“  트랩 λ˜λŠ” throw된 μ˜ˆμ™Έ)λ₯Ό ν˜ΈμΆœν•œ 결과둜 μ„€μ •ν•©λ‹ˆλ‹€.
  4. μ£Όμž₯ suspender 의 μƒνƒœκ°€ ν™œμ„± 인 [ caller' ]에 λŒ€ν•œ λͺ‡ 가지 caller' (보μž₯λ˜μ–΄μ•Όν•œλ‹€, ν˜ΈμΆœμžκ°€ λ³€κ²½λ˜μ—ˆμ„ 수 μžˆμ§€λ§Œ)
  5. suspender 의 μƒνƒœλ₯Ό λΉ„ν™œμ„±μœΌλ‘œ λ³€κ²½
  6. result λ₯Ό caller' λ°˜ν™˜(λ˜λŠ” λ‹€μ‹œ 던짐)

방법 suspender.suspendOnReturnedPromise(func)

  • func κ°€ WebAssembly.Function 인 경우 ν•¨μˆ˜ μœ ν˜•μ΄ [t*] -> [externref] ν˜•μ‹μ΄λΌκ³  μ£Όμž₯ν•˜κ³  [t*] -> [externref] ν•¨μˆ˜ μœ ν˜•μ„ 가진 WebAssembly.Function λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. ;
  • 그렇지 μ•ŠμœΌλ©΄ func κ°€ Function 라고 μ£Όμž₯ν•˜κ³  Function λ°˜ν™˜ν•©λ‹ˆλ‹€.

두 경우 λͺ¨λ‘ suspender.suspendOnReturnedPromise(func) λ°˜ν™˜λœ ν•¨μˆ˜λŠ” args μΈμˆ˜μ™€ ν•¨κ»˜ 호좜될 λ•Œ λ‹€μŒμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  1. result κ°€ func(args) (λ˜λŠ” λͺ¨λ“  트랩 λ˜λŠ” throw된 μ˜ˆμ™Έ)λ₯Ό ν˜ΈμΆœν•œ κ²°κ³Όκ°€ λ˜λ„λ‘ ν•©λ‹ˆλ‹€.
  2. result κ°€ λ°˜ν™˜λœ Promiseκ°€ μ•„λ‹ˆλ©΄ result λ₯Ό λ°˜ν™˜(λ˜λŠ” λ‹€μ‹œ 던짐)ν•©λ‹ˆλ‹€.
  3. suspender 의 μƒνƒœκ°€ caller λŒ€ν•΄ [ caller ] ν™œμ„± 이 μ•„λ‹Œ 경우 트랩
  4. 수 μžˆμŠ΅λ‹ˆλ‹€ frames 이후 μŠ€νƒ ν”„λ ˆμž„ 수 caller
  5. frames μΌμ‹œ 쀑단할 수 μ—†λŠ” ν•¨μˆ˜μ˜ ν”„λ ˆμž„μ΄ μžˆλŠ” 경우 트랩
  6. suspender 의 μƒνƒœλ₯Ό Suspended둜 λ³€κ²½
  7. λ‹€μŒμ„ μˆ˜ν–‰ν•˜λŠ” onFulfilled 및 onRejected ν•¨μˆ˜κ°€ μžˆλŠ” result.then(onFulfilled, onRejected) 의 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    1. suspender 의 μƒνƒœκ°€ Suspended μž„μ„ ν™•μΈν•©λ‹ˆλ‹€(보μž₯λ˜μ–΄μ•Ό 함).

    2. suspender 의 μƒνƒœλ₯Ό ν™œμ„± [ caller' ]으둜 λ³€κ²½ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ caller' λŠ” onFulfilled / onRejected 의 ν˜ΈμΆœμžμž…λ‹ˆλ‹€.



      • 의 κ²½μš°μ—λŠ” onFulfilled 둜 μ§€μ •λœ 값을 λ³€ν™˜ externref λ˜λŒμ•„ 것과 frames


      • onRejected 의 경우 Exception Handling μ œμ•ˆμ˜ JS API에 따라 μ΅œλŒ€ frames κΉŒμ§€ 주어진 값을 μ˜ˆμ™Έλ‘œ λ˜μ§‘λ‹ˆλ‹€.



λ‹€μŒκ³Ό 같은 경우 κΈ°λŠ₯이 μΌμ‹œ 쀑단 κ°€λŠ₯ν•©λ‹ˆλ‹€.

  • WebAssembly λͺ¨λ“ˆμ— μ˜ν•΄ μ •μ˜λ˜λ©°,
  • suspendOnReturnedPromise μ—μ„œ λ°˜ν™˜ ,
  • returnPromiseOnSuspend μ—μ„œ λ°˜ν™˜ ,
  • λ˜λŠ” μΌμ‹œ 쀑단 κ°€λŠ₯ν•œ κΈ°λŠ₯에 λŒ€ν•œ 생성

μ€‘μš”ν•œ 것은 JavaScript둜 μž‘μ„±λœ ν•¨μˆ˜λŠ” TC39 λ©€λ²„μ˜ ν”Όλ“œλ°±μ„ μ€€μˆ˜ν•˜μ—¬ μΌμ‹œ 쀑단할 수 μ—†μœΌλ©° , 호슀트 κΈ°λŠ₯(μœ„μ— λ‚˜μ—΄λœ λͺ‡ 가지 μ œμ™Έ)은 엔진 μœ μ§€ κ΄€λ¦¬μžμ˜ ν”Όλ“œλ°±μ„ μ€€μˆ˜ν•˜μ—¬ μΌμ‹œ 쀑단할 수 μ—†μŠ΅λ‹ˆλ‹€ .

κ΅¬ν˜„

λ‹€μŒμ€ 이 μ œμ•ˆμ— λŒ€ν•œ μ‹€ν–‰ μ „λž΅μž…λ‹ˆλ‹€.
그것은 λ¬Όλ‘  μ£Όμš” κ΅¬ν˜„ κ³Όμ œκ°€ μžˆλŠ” μŠ€νƒ μŠ€μœ„μΉ­μ— λŒ€ν•œ 엔진 지원을 κ°€μ •ν•©λ‹ˆλ‹€.

μŠ€νƒμ—λŠ” 호슀트(및 JavaScript) μŠ€νƒκ³Ό WebAssembly μŠ€νƒμ˜ 두 가지 μ’…λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  WebAssembly μŠ€νƒμ—λŠ” suspender λΌλŠ” μ„œμŠ€νŽœλ” ν•„λ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  μŠ€λ ˆλ“œμ—λŠ” 호슀트 μŠ€νƒμ΄ μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  Suspender μ—λŠ” 두 개의 μŠ€νƒ μ°Έμ‘° ν•„λ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€. ν•˜λ‚˜λŠ” caller 이고 λ‹€λ₯Έ ν•˜λ‚˜λŠ” suspended μž…λ‹ˆλ‹€.

  • λΉ„ν™œμ„± μƒνƒœμ—μ„œλŠ” 두 ν•„λ“œκ°€ λͺ¨λ‘ nullμž…λ‹ˆλ‹€.
  • ν™œμ„± μƒνƒœμ—μ„œ caller ν•„λ“œλŠ” 호좜자의 (μΌμ‹œ μ€‘λ‹¨λœ) μŠ€νƒμ„ μ°Έμ‘°ν•˜κ³  suspended ν•„λ“œλŠ” nullμž…λ‹ˆλ‹€.
  • Suspended μƒνƒœμ—μ„œ suspended ν•„λ“œλŠ” ν˜„μž¬ suspender와 μ—°κ²°λœ (suspended) WebAssembly μŠ€νƒμ„ μ°Έμ‘°ν•˜κ³  caller ν•„λ“œλŠ” nullμž…λ‹ˆλ‹€.

suspender.returnPromiseOnSuspend(func)(args) λŠ” λ‹€μŒμ— μ˜ν•΄ κ΅¬ν˜„λ©λ‹ˆλ‹€.

  1. suspender.caller 및 suspended.suspended κ°€ null인지 확인(그렇지 μ•ŠμœΌλ©΄ νŠΈλž˜ν•‘)
  2. stack λ₯Ό suspender 와 μ—°κ²°λœ μƒˆλ‘œ ν• λ‹Ήλœ WebAssembly μŠ€νƒμœΌλ‘œ μ„€μ •
  3. stack μ „ν™˜ν•˜κ³  이전 μŠ€νƒμ„ suspender.caller
  4. result κ°€ func(args) (λ˜λŠ” λͺ¨λ“  트랩 λ˜λŠ” throw된 μ˜ˆμ™Έ)의 κ²°κ³Όκ°€ λ˜λ„λ‘ ν•©λ‹ˆλ‹€.
  5. suspender.caller μ „ν™˜ν•˜κ³  null둜 μ„€μ •
  6. stack ν•΄μ œ
  7. λ°˜ν™˜(λ˜λŠ” λ‹€μ‹œ 던짐) result

suspender.suspendOnReturnedPromise(func)(args) λŠ” λ‹€μŒμ— μ˜ν•΄ κ΅¬ν˜„λ©λ‹ˆλ‹€.

  1. func(args) 호좜 , 트랩 λ˜λŠ” throw된 μ˜ˆμ™Έ 작기
  2. result κ°€ λ°˜ν™˜λœ Promiseκ°€ μ•„λ‹ˆλ©΄ result λ°˜ν™˜(λ˜λŠ” λ‹€μ‹œ 던짐)
  3. suspender.caller κ°€ null이 μ•„λ‹Œμ§€ 확인(그렇지 μ•ŠμœΌλ©΄ νŠΈλž˜ν•‘)
  4. stack ν˜„μž¬ μŠ€νƒμœΌλ‘œ λ‘‘λ‹ˆλ‹€.
  5. stack λŠ” suspender 와 μ—°κ²°λœ WebAssembly μŠ€νƒμ΄ μ•„λ‹™λ‹ˆλ‹€.

    • stack κ°€ WebAssembly μŠ€νƒμΈμ§€ 확인(그렇지 μ•ŠμœΌλ©΄ νŠΈλž˜ν•‘)

    • stack 을 stack.suspender.caller

  6. suspender.caller μ „ν™˜ν•˜κ³  null둜 μ„€μ •ν•˜κ³  이전 μŠ€νƒμ„ suspender.suspended
  7. onFulfilled 및 onRejected ν•¨μˆ˜κ°€ κ΅¬ν˜„λœ result.then(onFulfilled, onRejected) 의 κ²°κ³Ό λ°˜ν™˜

    1. suspender.suspended μ „ν™˜ν•˜κ³  null둜 μ„€μ •ν•˜κ³  이전 μŠ€νƒμ„ suspender.caller



      • onFulfilled 경우 주어진 값을 externref 둜 λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜


      • onRejected 경우 주어진 값을 λ‹€μ‹œ λ˜μ§‘λ‹ˆλ‹€.



μΌμ‹œ 쀑단 κ°€λŠ₯ν•œ ν•¨μˆ˜μ— λŒ€ν•œ μƒμ„±ν•˜μ—¬ μƒμ„±λœ ν•¨μˆ˜μ˜ κ΅¬ν˜„μ€ λ¨Όμ € ν˜„μž¬ μŠ€λ ˆλ“œμ˜ 호슀트 μŠ€νƒ(아직 μžˆμ§€ μ•Šμ€ 경우)으둜 μ „ν™˜ν•˜κ³  λ§ˆμ§€λ§‰μœΌλ‘œ 이전 μŠ€νƒμœΌλ‘œ λ‹€μ‹œ μ „ν™˜ν•˜λ„λ‘ λ³€κ²½λ©λ‹ˆλ‹€.

λͺ¨λ“  16 λŒ“κΈ€

비동기 ν•¨μˆ˜/생성기(동기화 λ˜λŠ” 비동기화)λ₯Ό μˆ˜μ‹ ν•œ APIλ₯Ό λ…ΈμΆœν•œ λ‹€μŒ μΌμ‹œ 쀑단 κ°€λŠ₯ν•œ ν•¨μˆ˜λ‘œ μ „ν™˜ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

μ˜μ‚¬ μ½”λ“œλ‚˜ μ‚¬μš© 사둀λ₯Ό 톡해 무슨 말인지 λͺ…ν™•νžˆ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? μ •ν™•ν•œ 닡변을 λ“œλ¦¬κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

Suspender 이 JS의 일뢀가 될 μ˜λ„μž…λ‹ˆκΉŒ μ•„λ‹ˆλ©΄ λ³„λ„μ˜ APIμž…λ‹ˆκΉŒ? wasm μ „μš©μΈκ°€μš”( WebAssembly.Suspender )? 이 μ œμ•ˆμ€ TC39μ—μ„œ λ…Όμ˜λ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

νŠΉλ³„νžˆ JS ν”„λ‘œκ·Έλž¨μ— 영ν–₯을 미치기 μœ„ν•œ 것이 μ•„λ‹™λ‹ˆλ‹€. 보닀 μ •ν™•ν•˜κ²ŒλŠ” JS κΈ°λŠ₯을 μΌμ‹œ μ€‘λ‹¨ν•˜λ €κ³  ν•˜λ©΄ 트랩이 λ°œμƒν•©λ‹ˆλ‹€. 이λ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄ λͺ‡ 가지 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” Shu-yu와 ν•¨κ»˜ 그것을 μ œκΈ°ν•˜μ—¬ 그의 μ˜κ²¬μ„ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

μ£„μ†‘ν•©λ‹ˆλ‹€. @chicoxyzzy , Stacks ν•˜μœ„ 그룹의 일뢀 μ»¨ν…μŠ€νŠΈ/μ—…λ°μ΄νŠΈλ₯Ό ν¬ν•¨ν•˜λŠ” 것을 μžŠμ—ˆμŠ΅λ‹ˆλ‹€. 이전 μŠ€νƒ μ „ν™˜ μ œμ•ˆμ€ μΌμ‹œ μ€‘λ‹¨λœ μŠ€νƒμ—μ„œ JavaScript/호슀트 ν”„λ ˆμž„μ„ μΊ‘μ²˜ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€λŠ” μ˜ˆμƒμœΌλ‘œ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” TC39의 μ‚¬λžŒλ“€λ‘œλΆ€ν„° 이것이 JS μƒνƒœκ³„μ— λ„ˆλ¬΄ 큰 영ν–₯을 λ―ΈμΉ  κ²ƒμ΄λΌλŠ” μš°λ €κ°€ μžˆλ‹€λŠ” ν”Όλ“œλ°±μ„ λ°›μ•˜κ³  호슀트 κ΅¬ν˜„μžλ“€λ‘œλΆ€ν„° λͺ¨λ“  호슀트 ν”„λ ˆμž„μ΄ μΌμ‹œ 쀑단을 ν—ˆμš©ν•  수 μ—†λ‹€λŠ” μš°λ €κ°€ μžˆλ‹€λŠ” ν”Όλ“œλ°±μ„ λ°›μ•˜μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ Stacks Subgroup은 κ·Έ μ΄ν›„λ‘œ 섀계가 μ€‘λ‹¨λœ μŠ€νƒμ—μ„œ WebAssembly(κ΄€λ ¨) ν”„λ ˆμž„λ§Œ μΊ‘μ²˜ν•˜λ„λ‘ ν–ˆμœΌλ©° 이 μ œμ•ˆμ€ ν•΄λ‹Ή 속성을 μΆ©μ‘±ν•©λ‹ˆλ‹€. 이 μ€‘μš”ν•œ λ©”λͺ¨λ₯Ό ν¬ν•¨ν•˜λ„λ‘ OPλ₯Ό μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ—μ„œ 진행 상황을 λ³΄λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 이것이 Wasm용 ESM ν†΅ν•©μ—μ„œ μ–΄λ–»κ²Œ μ‚¬μš©λ˜λŠ”μ§€μ— λŒ€ν•œ μ˜ˆκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

λ‚˜μœ μ†Œμ‹μ€ 이것이 λͺ¨λ‘ JS API에 있기 λ•Œλ¬Έμ— λ‹¨μˆœνžˆ ESM wasm λͺ¨λ“ˆμ„ κ°€μ Έμ˜€κ³  μ΄λŸ¬ν•œ 약속에 λŒ€ν•œ μŠ€νƒ μ „ν™˜ 지원을 얻을 수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 쒋은 μ†Œμ‹μ€ 일뢀 JS ESM λͺ¨λ“ˆμ„ μ ‘μ°©μ œλ‘œ μ‚¬μš©ν•˜μ—¬ 이 API와 ν•¨κ»˜ ESM λͺ¨λ“ˆμ„ 계속 μ‚¬μš©ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

특히 foo-exports.js , foo-wasm.wasm 및 foo-imports.js μ„Έ 가지 ESM λͺ¨λ“ˆμ„ μ„€μ •ν•©λ‹ˆλ‹€. foo-imports.js λͺ¨λ“ˆμ€ μ„œμŠ€νŽœλ”λ₯Ό μƒμ„±ν•˜κ³  이λ₯Ό μ‚¬μš©ν•˜μ—¬ foo-wasm.wasm ν•„μš”ν•œ λͺ¨λ“  "비동기식" 약속 생성 κ°€μ Έμ˜€κΈ°λ₯Ό λž˜ν•‘ν•˜κ³  μ„œμŠ€νŽœλ”μ™€ ν•΄λ‹Ή κ°€μ Έμ˜€κΈ°λ₯Ό λ‚΄λ³΄λƒ…λ‹ˆλ‹€. foo-wasm.wasm 그런 λ‹€μŒ foo-imports.js μ—μ„œ λͺ¨λ“  "비동기" κ°€μ Έμ˜€κΈ°λ₯Ό κ°€μ Έμ˜€κ³  ν•΄λ‹Ή λͺ¨λ“ˆμ—μ„œ λͺ¨λ“  "동기" κ°€μ Έμ˜€κΈ°λ₯Ό 직접 κ°€μ Έμ˜΅λ‹ˆλ‹€(λ˜λŠ” foo-imports.js 톡해 ν”„λ‘μ‹œν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€ foo-exports.js λŠ” foo-imports.js μ—μ„œ μ„œμŠ€νŽœλ”λ₯Ό κ°€μ Έμ˜€κ³  foo-wasm.wasm 의 내보내기λ₯Ό κ°€μ Έμ˜€κ³  μ„œμŠ€νŽœλ”λ₯Ό μ‚¬μš©ν•˜μ—¬ "비동기식" 내보내기λ₯Ό λž˜ν•‘ν•œ λ‹€μŒ (λž˜ν•‘λ˜μ§€ μ•Šμ€) "동기식" 내보내기λ₯Ό λ‚΄λ³΄λƒ…λ‹ˆλ‹€. 내보내기 및 λž˜ν•‘λœ "비동기" 내보내기. 그런 λ‹€μŒ ν΄λΌμ΄μ–ΈνŠΈλŠ” foo-exports.js μ—μ„œ κ°€μ Έμ˜€κ³  foo-wasm.wasm λ˜λŠ” foo-imports.js 직접 λ§Œμ§€κ±°λ‚˜ 이에 λŒ€ν•œ 지식이 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λΆˆν–‰ν•œ μž₯μ• λ¬Όμ΄μ§€λ§Œ 핡심 wasm을 μˆ˜μ •ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ œμ•½ 쑰건을 κ°μ•ˆν•  λ•Œ μš°λ¦¬κ°€ 달성할 수 μžˆλŠ” μ΅œμ„ μ΄μ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” 이 λ””μžμΈμ΄ 핡심 wasm을 ν™•μž₯ν•˜λŠ” μ œμ•ˆκ³Ό μ•žμœΌλ‘œ ν˜Έν™˜ κ°€λŠ₯ν•˜λ„λ‘ ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ œμ•ˆμ΄ 배솑될 λ•Œ 이 μ„Έ 가지 λͺ¨λ“ˆμ„ ν•˜λ‚˜μ˜ ν™•μž₯된 wasm λͺ¨λ“ˆλ‘œ ꡐ체할 수 있고 아무도 의미둠적으둜 ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 차이점을 μ•Œλ €μ£Όμ„Έμš”(λͺ¨λ“ˆλ‘œ 파일 이름 λ°”κΎΈκΈ°).

그것이 이해할 수 μžˆμ—ˆκ³ , 그것이 λ‹Ήμ‹ μ˜ ν•„μš”λ₯Ό μΆ©μ‘±μ‹œν‚¬ 것이라고 μƒκ°ν•©λ‹ˆκΉŒ(비둝 μ–΄μƒ‰ν•˜κΈ΄ ν•˜μ§€λ§Œ)?

적어도 WebAssembly.Module μœ ν˜• Wasm κ°€μ Έμ˜€κΈ°κ°€ 아직 κ°€λŠ₯ν•˜μ§€ μ•Šμ€ λ™μ•ˆ(그리고 μ μ ˆν•œ μ‹œκΈ°μ— 이루어지기λ₯Ό λ°”λžλ‹ˆλ‹€) λž˜ν•‘μ˜ ν•„μš”μ„±μ„ μ΄ν•΄ν•©λ‹ˆλ‹€.

μ’€ 더 ꡬ체적으둜 λ§ν•˜μžλ©΄, ESM ν†΅ν•©μ—μ„œ μ΄λŸ¬ν•œ νŒ¨ν„΄μ„ μž₯식할 수 μžˆλŠ” λ²”μœ„κ°€ μžˆλŠ”μ§€ κΆκΈˆν•˜μ—¬ 멜빡 μ ‘μ°©μ œμ˜ 양면을 더 잘 관리할 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 이진 ν˜•μ‹μœΌλ‘œ 내보낸 κΈ°λŠ₯κ³Ό κ°€μ Έμ˜¨ κΈ°λŠ₯을 μ—°κ²°ν•˜λŠ” 일뢀 메타데이터가 μžˆλŠ” 경우 ESM 톡합은 이λ₯Ό μ‘°μ‚¬ν•˜κ³  예츑 κ°€λŠ₯ν•œ νŠΉμ • κ·œμΉ™μ„ 기반으둜 톡합 κ³„μΈ΅μ˜ μΌλΆ€λ‘œ 이쀑 κ°€μ Έμ˜€κΈ°/내보내기 λž˜ν•‘ μ„œμŠ€νŽœλ” κΈ°λŠ₯을 λ‚΄λΆ€μ μœΌλ‘œ μΌμΉ˜μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„. ν˜„μž¬λ‘œμ„œλŠ” κ·ΈλŸ¬ν•œ κ³„νšμ΄ μ—†μŠ΅λ‹ˆλ‹€. λ‚΄κ°€ 받은 ν”Όλ“œλ°±μ€ ESM 톡합도 λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ €λŠ” λ°”λžŒμ΄ μžˆλ‹€λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. μš”μ»¨λŒ€, 이 λͺ¨λ“  것이 κ²°κ΅­ μ½”μ–΄ wasmμ—μ„œ κ°€λŠ₯ν•˜κΈ°λ₯Ό ν¬λ§ν•˜λ©°, λ”°λΌμ„œ μš°λ¦¬λŠ” 이 μ œμ•ˆμ΄ κ°€λŠ₯ν•œ ν•œ μž‘μ€ λ°œμžκ΅­μ„ 남기기λ₯Ό μ›ν•©λ‹ˆλ‹€.

λ‚΄κ°€ 받은 ν”Όλ“œλ°±μ€ ESM 톡합도 λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ €λŠ” λ°”λžŒμ΄ μžˆλ‹€λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

이 ν”Όλ“œλ°±μ΄ μ–΄λ””μ—μ„œ μ˜€λŠ”μ§€ μžμ„Ένžˆ μ„€λͺ…ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ? 더 높은 μˆ˜μ€€μ˜ 톡합 의미둠으둜 ESM 톡합을 ν™•μž₯ν•  수 μžˆλŠ” λ§Žμ€ λ²”μœ„κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ μƒκ°ν•˜λŠ” 곡간이 μ™„μ „νžˆ νƒμƒ‰λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— 이 문제λ₯Ό μ œκΈ°ν•œ κ²ƒμž…λ‹ˆλ‹€. λ‚˜λŠ” 과거에 이 μ˜μ—­μ„ κ°œμ„ ν•˜λŠ” 것에 λŒ€ν•œ 저항에 λŒ€ν•΄ λ“€μ–΄λ³Έ 적이 μ—†μŠ΅λ‹ˆλ‹€. 이것을 μŠˆκ°€λ§(sugaring)을 μœ„ν•œ μ˜μ—­μœΌλ‘œ λ³΄λŠ” 것은 직접 Promise κ°€μ Έμ˜€κΈ°/내보내기λ₯Ό ν—ˆμš©ν•˜λŠ” JS κ°œλ°œμžμ—κ²Œ 이점이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

이 μ œμ•ˆμ€ ESM ν†΅ν•©μ—μ„œ JS μ£ΌκΈ° κΈ°λŠ₯ ν˜Έμ΄μŠ€νŒ… 덕뢄에 ν˜„μž¬ ν•¨μˆ˜ κ°€μ Έμ˜€κΈ°λ₯Ό μœ„ν•΄ μ—¬μ „νžˆ μž‘λ™ν•  수 μžˆλŠ” Wasm λͺ¨λ“ˆμ— λŒ€ν•œ κ°€μ Έμ˜€κΈ° 및 κ°€μ Έμ˜€κΈ°κ°€ λ˜λŠ” 주기의 단일 JS λͺ¨λ“ˆ κΈ°λŠ₯을 λ°©ν•΄ν•œλ‹€λŠ” 점에 μ£Όλͺ©ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. , κ·ΈλŸ¬λ‚˜ κ°€μ Έμ˜¨ ν•¨μˆ˜ μ£Όμœ„μ— Suspender ν‘œν˜„μ‹ 래퍼λ₯Ό μ‚¬μš©ν•˜μ—¬ 이 μ£ΌκΈ° ν˜Έμ΄μŠ€νŒ…μ„ μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@lukewagnerμ—κ²Œ 이런 인상을 λ°›μ•˜μŠ΅λ‹ˆλ‹€. ESM 톡합을 ν™•μž₯ν•  수 μžˆλŠ” λ²”μœ„κ°€ μžˆλ‹€λŠ” 데 λ™μ˜ν•˜μ§€λ§Œ, 이λ₯Ό μœ„ν•΄μ„œλŠ” wasm νŒŒμΌμ— λŒ€ν•œ λ³€κ²½/ν™•μž₯이 ν•„μš”ν•˜λ‹€λŠ” 점에 λ™μ˜ν•©λ‹ˆλ‹€(μ†Œκ·œλͺ¨ λͺ©ν‘œμ˜ μΌν™˜μœΌλ‘œ). κ·Έλž˜μ„œ μš°λ¦¬λŠ” κ·ΈλŸ¬ν•œ 변경을 μ›ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€/ 이 μ œμ•ˆμ˜ μΌλΆ€λ‘œ ν™•μž₯λ©λ‹ˆλ‹€. λ¬Όλ‘  μ΄λŸ¬ν•œ λ³€κ²½/ν™•μž₯이 ESM μ œμ•ˆμ— μΆ”κ°€λ˜λ©΄ 이 μ œμ•ˆμ΄ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 μ–»κΈ° μœ„ν•΄ JS 래퍼 λͺ¨λ“ˆμ΄ ν•„μš”ν•˜μ§€ μ•Šλ„λ‘ 이 μ œμ•ˆμ„ μ΄μƒμ μœΌλ‘œ 보완할 κ²ƒμž…λ‹ˆλ‹€.

@Jack-Works의 μ˜κ²¬μ„ 잘λͺ» 읽고 μœ„μ˜ μ˜κ²¬μ„ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

μ„€λͺ…에 λŒ€ν•΄ @RossTate μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. 예, 호슀트 톡합을 μ•Œλ¦¬κΈ° μœ„ν•΄ λ°”μ΄λ„ˆλ¦¬ 자체의 메타데이터λ₯Ό 톡해 μ΄λŸ¬ν•œ κ°€μ Έμ˜€κΈ° 및 내보내기 μΌμ‹œ 쀑단 μ»¨ν…μŠ€νŠΈλ₯Ό μΌμΉ˜μ‹œν‚¬ κ°€λŠ₯성을 νƒμƒ‰ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ MVPμ—μ„œλŠ” 이λ₯Ό κΈ°λŒ€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” λ˜ν•œ ESM 톡합이 κΈ°λ³Έ JS API와 λ³„λ„λ‘œ μ„€νƒ•μœΌλ‘œλΆ€ν„° 더 일반적으둜 ν˜œνƒμ„ 받을 수 μžˆλŠ” κ³΅κ°„μž„μ„ 지적할 기회λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.

λͺ…ν™•νžˆ ν•˜μžλ©΄, λ‚΄κ°€ μ§€μ ν•œ λ¬Έμ œλŠ” μš°λ¦¬κ°€ WebAssembly.instantiate() μΆ”κ°€ν•œ μ˜΅μ…˜(λ˜λŠ” μƒˆ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” WebAssembly.instantiate() 의 μƒˆ 버전)도 wasm이 ESM을 톡해 λ‘œλ“œλ  λ•Œ μ–΄λ–»κ²Œλ“  ν‘œμ‹œλ˜μ–΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. -톡합, ESM 톡합이 λ³€κ²½ λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€.

μ•„, λ©‹μ§€κ΅°μš”. κ·Έλž˜μ„œ μš°λ¦¬λŠ” ν•„μš”μ— 따라 ESMκ³Ό κ΄€λ ¨ν•˜μ—¬ μƒκ°ν–ˆλ˜ 것보닀 더 λ§Žμ€ μœ μ—°μ„±μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€. 제 μ˜€ν•΄λ₯Ό κ³ μ³μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

내보낸 νŠΉμ • Wasm ν•¨μˆ˜κ°€ JS에 Promise 기반 API둜 ν‘œμ‹œλ˜μ–΄μ•Ό ν•˜λŠ” 방법과 λ°˜λŒ€λ‘œ Wasmμ—μ„œ κ°€μ Έμ˜€κΈ°λ₯Ό JS Promise 기반 APIμ—μ„œ μ–΄λ–€ μ’…λ₯˜λ‘œ λ³€ν™˜ν•  수 μžˆλŠ”μ§€ μ§€μ •ν•˜λŠ” μΌμ’…μ˜ μ‚¬μš©μž μ •μ˜ μ„Ήμ…˜μ— λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ³  μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μŠ€νƒ μŠ€μœ„μΉ­μ˜. λ‚΄κ°€ μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

λ‚˜λŠ” 이 아이디어λ₯Ό μ’‹μ•„ν•œλ‹€. λ‚˜λŠ” μš°λ¦¬κ°€ Wasm GC/JS-ESM 톡합을 μœ„ν•œ μœ μ‚¬ν•œ μ‚¬μš©μž μ •μ˜ μ„Ήμ…˜(λ˜λŠ” λ™μΌν•œ μ„Ήμ…˜μ˜ 일뢀)을 원할 것이라고 μƒκ°ν•©λ‹ˆλ‹€. 이 μ‚¬μš©μž μ •μ˜ μ„Ήμ…˜μ΄ μ–Έμ–΄ κ°„ μ–΄λŠ μ •λ„μΈμ§€λŠ” ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ 두 경우 λͺ¨λ‘ μΈν„°νŽ˜μ΄μŠ€ μœ ν˜•λ³΄λ‹€ 덜 보편적이며 ꡬ성 μš”μ†Œ μ‚¬μ΄λΏλ§Œ μ•„λ‹ˆλΌ ꡬ성 μš”μ†Œ λ‚΄ μ—μ„œ μ‚¬μš©λ˜λŠ” κ²½ν–₯이 μžˆμŠ΅λ‹ˆλ‹€.

이 μ‚¬μš©μž μ •μ˜ μ„Ήμ…˜μ˜ κΈ°λ³Έ λ””μžμΈμ„ μ„€λͺ…ν•˜λŠ” μΌμ’…μ˜ μš”μ§€ λ˜λŠ” READMEλ₯Ό μž‘μ„±ν•˜κ³  싢은 μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

κ°€λŠ₯ν•œ μ˜΅μ…˜μΈ 것 κ°™μŠ΅λ‹ˆλ‹€. μ–ΈκΈ‰ν–ˆλ“―μ΄ WebAssembly/gc#203κ³Ό 같은 GC μ œμ•ˆμ—μ„œ μœ μ‚¬ν•œ μ˜΅μ…˜μ΄ λ…Όμ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€. JS-톡합은 내일 GC ν•˜μœ„ κ·Έλ£Ήμ—μ„œ λ…Όμ˜λ  μ˜ˆμ •μ΄λ―€λ‘œ ν•΄λ‹Ή ν† λ‘  쀑에 이 μ œμ•ˆκ³Όμ˜ κ°€λŠ₯ν•œ 연결을 염두에 λ‘λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€(λ˜λŠ” 토둠이 μ–΄λ–»κ²Œ μ§„ν–‰λ˜λŠ”μ§€μ— 따라 관련이 μ—†λŠ” κ²ƒμœΌλ‘œ 판λͺ…될 수 있음).

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

dpw picture dpw  Β·  3μ½”λ©˜νŠΈ

nikhedonia picture nikhedonia  Β·  7μ½”λ©˜νŠΈ

aaabbbcccddd00001111 picture aaabbbcccddd00001111  Β·  3μ½”λ©˜νŠΈ

artem-v-shamsutdinov picture artem-v-shamsutdinov  Β·  6μ½”λ©˜νŠΈ

badumt55 picture badumt55  Β·  8μ½”λ©˜νŠΈ