рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ @fmccabe , @thibaudmichaud , @lukewagner , рдФрд░ @kripken рдХреЗ рд╕рд╣рдпреЛрдЧ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╕рд╛рде рд╣реА
рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╛рджреЛрдВ рдФрд░ WebAssembly рдХреЗ рдмреАрдЪ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХреБрд╢рд▓ рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдПрд░реНрдЧреЛрдирд┐рдорд┐рдХ рдЗрдВрдЯрд░рдСрдк рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рдзрд╛ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ JS API рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реИрдВ рди рдХрд┐ рдХреЛрд░ рд╡рд╛рд╕рдо рдХреЗ рд▓рд┐рдПред
рдЙрдореНрдореАрдж рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ-рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдВрддрддрдГ рдХрдИ рдЕрдиреНрдп рдореВрд▓реНрдпрд╡рд╛рди рд╕реНрдЯреИрдХ-рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕реАрдзреЗ WebAssembly рдХреЗ рднреАрддрд░ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдХреЛрд░ WebAssembly рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕реНрдЯреИрдХ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдерд╛ рдХреЗрд╡рд▓ JS API рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреЗрдЬрд╝ рдкрде рдХреА рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ 28 рдЬреВрди, 2021 рдХреА рд╕реНрдЯреИрдХ рд╕рдмрдЧреНрд░реБрдк рдореАрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдиреЛрдЯреНрд╕ рдФрд░ рд╕реНрд▓рд╛рдЗрдб рджреЗрдЦреЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдФрд░ рдХрд╛рд░рдХреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рди рдкрд░ рд╣рдордиреЗ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рддрд░реНрдХ рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪреЗред
рдЕрджреНрдпрддрди: рд╕реНрдЯреИрдХ рдЙрдкрд╕рдореВрд╣ рдХреЛ TC39 рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗрд╡рд▓ WebAssembly рд╕реНрдЯреИрдХ рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ-рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП asycn
/ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ await
ред
рдпрд╣ (рд╢рд┐рдерд┐рд▓ рд░реВрдк рд╕реЗ) рдЬреЗрдПрд╕-рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ WebAssembly.Function
рдХреЛ Function
рдЙрдкрд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред
рдЬреЗрдПрд╕ рдПрдкреАрдЖрдИ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдиреАрдЪреЗ рдЙрдирдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рдеред
interface Suspender {
constructor();
Function suspendOnReturnedPromise(Function func); // import wrapper
// overloaded: WebAssembly.Function suspendOnReturnedPromise(WebAssembly.Function func);
WebAssembly.Function returnPromiseOnSuspend(WebAssembly.Function func); // export wrapper
}
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрд╕ рдмрд╛рдд рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рдЗрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ, рд╣рдордиреЗ "рд╕рд┐рдВрдХреНрд░реЛрдирд╕" рдФрд░ "рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕" рдЖрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд▓рд┐рдП WebAssembly рдореЙрдбреНрдпреВрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рдкрд╛рдпрд╛ред
рд╡рд░реНрддрдорд╛рди рдЬреЗрдПрд╕ рдПрдкреАрдЖрдИ рдХреЗрд╡рд▓ "рд╕рд┐рдВрдХреНрд░реЛрдирд╕" рдЖрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рд╕рд╕реНрдкреЗрдВрдбрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЖрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХреЛ "рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╕реНрдкреЗрдВрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрд╡рдпрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрди рдЖрдпрд╛рддреЛрдВ рдФрд░ рдирд┐рд░реНрдпрд╛рддреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рд╕рдВрдЧрддрддрд╛ рджреЛрдиреЛрдВ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
WebAssembly ( 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 рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд░рд╛рдЬреНрдп рдорд╢реАрди рд╣реИ- рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рд░рд╛рдЬреНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд░рд╛рдЬреНрдп рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд▓реНрдЯрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдЖрдпрд╛рдд рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрдХреНрд╖ рдкрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдбреЗрд▓реНрдЯрд╛ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ; рдпрд╛рдиреА, рдпрд╣ рдПрдХ рдирдВрдмрд░ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирдВрдмрд░ рдХрд╛ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рд╣рдо рдирдП JS API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдордХрд╛рд▓рд┐рдХ рдЕрдВрддрд░ рдХреЛ рдкрд╛рдЯ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, WebAssembly рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХ рдЖрдпрд╛рдд suspender.suspendOnReturnedPromise
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдкреЗрдЯрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдПрдХ рдирд┐рд░реНрдпрд╛рдд suspender.returnPromiseOnSuspend
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдкреЗрдЯрд╛ рдЧрдпрд╛ рд╣реИ, рджреЛрдиреЛрдВ рдПрдХ рд╣реА suspender
ред
рд╡рд╣ suspender
рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдпрд╣ рдРрд╕рд╛ рдмрдирд╛рддрд╛ рд╣реИ рдХрд┐, рдпрджрд┐ рдХрднреА (рдЕрд▓рд┐рдЦрд┐рдд) рдЖрдпрд╛рдд рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ (рд▓рд┐рдкрдЯреЗ) рдирд┐рд░реНрдпрд╛рдд рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдпрд╛рдд рдХрд╛ рд╡рд╛рджрд╛ рд╣рд▓ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рд╕рднреА рдЧрдгрдирд╛ "рдирд┐рд▓рдВрдмрд┐рдд" рд╣реЛрдиреЗ рдХреЗ рдмреАрдЪ рд╣реЛрддреА рд╣реИред
рдирд┐рд░реНрдпрд╛рдд рдХрд╛ рд░реИрдкрд┐рдВрдЧ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ async
рдорд╛рд░реНрдХрд░ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЖрдпрд╛рдд рдХрд╛ рд░реИрдкрд┐рдВрдЧ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ await
рдорд╛рд░реНрдХрд░ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣рдореЗрдВ async
рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдереНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ await
рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА WebAssembly рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ!
рдЗрд╕ рдмреАрдЪ, рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди init_state
рдЧрдИ рдХреЙрд▓ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдмрд┐рдирд╛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд┐рдП рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ, рдФрд░ рдирд┐рд░реНрдпрд╛рдд get_state
рдХреЙрд▓ рднреА рд╣рдореЗрд╢рд╛ рдмрд┐рдирд╛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд┐рдП рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрднреА рднреА рдореМрдЬреВрджрд╛ "рд╕рд┐рдВрдХреНрд░реЛрдирд╕" рдЖрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред WebAssembly рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдЖрдЬ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдмреЗрд╢рдХ, рдХрдИ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рд╕реНрдХрд┐рдореНрдб рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬреИрд╕реЗ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдирд┐рд░реНрдпрд╛рдд рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЖрдпрд╛рдд рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рддреЛ рдЖрдпрд╛рдд рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрдВрд╕ рдЬрд╛рдПрдЧрд╛ред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рдгрдиреАрддрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдПрдХ Suspender
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╣реИ:
caller
] - рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдЕрдВрджрд░ рд╣реИ Suspender
, рдХреЗ рд╕рд╛рде caller
рд╕рдорд╛рд░реЛрд╣ рд╣реИ рдХрд┐ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ Suspender
рдФрд░ рдПрдХ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реА рд╣реИ externref
рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИрд╡рд┐рдзрд┐ suspender.returnPromiseOnSuspend(func)
рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ func
рдПрдХ WebAssembly.Function
рдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ [ti*] -> [to]
рдФрд░ рдлрд┐рд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде WebAssembly.Function
рд▓реМрдЯрд╛рддрд╛ рд╣реИ [ti*] -> [externref]
рдЬреЛ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ args
:
suspender
рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИsuspender
рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдХреНрд░рд┐рдп [ caller
] рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ (рдЬрд╣рд╛рдВ caller
рд╡рд░реНрддрдорд╛рди рдХреЙрд▓рд░ рд╣реИ)result
рдХреЛ func(args)
(рдпрд╛ рдХрд┐рд╕реА рднреА рдЬрд╛рд▓ рдпрд╛ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рдж) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдиреЗ рджреЗрдВsuspender
рдХреА рд╕реНрдерд┐рддрд┐ рд╕рдХреНрд░рд┐рдп рд╣реИ [ caller'
] рдХреБрдЫ caller'
(рдЧрд╛рд░рдВрдЯреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЙрд▓рд░ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ)suspender
рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИresult
рд╕реЗ caller'
рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдпрд╛ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрддрд╛ рд╣реИ)рд╡рд┐рдзрд┐ suspender.suspendOnReturnedPromise(func)
func
рдПрдХ WebAssembly.Function
, рддреЛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ [t*] -> [externref]
рдФрд░ WebAssembly.Function
рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ [t*] -> [externref]
;func
рдПрдХ Function
рдФрд░ рдПрдХ Function
рд▓реМрдЯрд╛рддрд╛ рд╣реИредрдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, suspender.suspendOnReturnedPromise(func)
рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ args
:
result
рдХреЛ func(args)
(рдпрд╛ рдХрд┐рд╕реА рднреА рдЬрд╛рд▓ рдпрд╛ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рдж) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдиреЗ рджреЗрдВresult
рд▓реМрдЯрд╛ рд╣реБрдЖ рд╡рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ result
рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдпрд╛ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрддрд╛ рд╣реИ)suspender
рдХреА рд╕реНрдерд┐рддрд┐ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИ [ caller
] рдХреБрдЫ caller
frames
рдХреЗ рдмрд╛рдж рд╕реЗ рдвреЗрд░ рдлреНрд░реЗрдо рд╣реЛ caller
frames
рдореЗрдВ рдЧреИрд░-рдирд┐рд▓рдВрдмрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреЛрдИ рдлрд╝реНрд░реЗрдо рд╣реИрдВ, рддреЛ рдЯреНрд░реИрдк рдХрд░реЗрдВsuspender
рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИresult.then(onFulfilled, onRejected)
рдХрд╛ рдкрд░рд┐рдгрд╛рдо onFulfilled
рдФрд░ onRejected
рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рджреЗрддрд╛ рд╣реИ рдЬреЛ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ:suspender
рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд▓рдВрдмрд┐рдд рд╣реИ (рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП)suspender
рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдХреНрд░рд┐рдп [ caller'
] рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ caller'
onFulfilled
/ onRejected
рдХрд╛ рдХреЙрд▓рд░ рд╣реИonFulfilled
, рдХреЗ рд▓рд┐рдП рджрд┐рдпрд╛ рдореВрд▓реНрдп рдзрд░реНрдорд╛рдиреНрддрд░рд┐рдд externref
рдФрд░ рд░рд┐рдЯрд░реНрди рдХрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП frames
onRejected
рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЬреЗрдПрд╕ рдПрдкреАрдЖрдИ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХреЛ frames
рддрдХ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИрдПрдХ рд╕рдорд╛рд░реЛрд╣ рдирд┐рд▓рдВрдмрд┐рдд рд╣реИ рдЕрдЧрд░ рдпрд╣ рдерд╛
suspendOnReturnedPromise
рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛,returnPromiseOnSuspend
рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛,рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдХрд╛рд░реНрдпреЛрдВ рдирд╣реАрдВ suspendable рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рд╕реЗ рд░рд╛рдп рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ, TC39 (рдХреБрдЫ рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдХреЛ рдЫреЛрдбрд╝рдХрд░), рдФрд░ рдореЗрдЬрдмрд╛рди рдХрд╛рд░реНрдпреЛрдВ рд░рд╣реЗ suspendable рдЗрдВрдЬрди рджреЗрдЦрд░реЗрдЦ рд╕реЗ рд░рд╛рдп рдХреЗ рдЕрдиреБрд░реВрдк, рдирд╣реАрдВред
рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рдгрдиреАрддрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИред
рдпрд╣ рд╕реНрдЯреИрдХ-рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬрди рд╕рдорд░реНрдерди рдорд╛рдирддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪреБрдиреМрддрд┐рдпрд╛рдВ рд╣реИрдВред
рд╕реНрдЯреИрдХ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ: рдПрдХ рд╣реЛрд╕реНрдЯ (рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рд╕реНрдЯреИрдХ, рдФрд░ рдПрдХ WebAssembly рд╕реНрдЯреИрдХред рдкреНрд░рддреНрдпреЗрдХ WebAssembly рд╕реНрдЯреИрдХ рдореЗрдВ suspender
рдирд╛рдордХ рдПрдХ рд╕рд╕реНрдкреЗрдВрдбрд░ рдлрд╝реАрд▓реНрдб рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рд╣реЛрд╕реНрдЯ рд╕реНрдЯреИрдХ рд╣реЛрддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ Suspender
рдореЗрдВ рджреЛ рд╕реНрдЯреИрдХ-рд░реЗрдлрд░реЗрдВрд╕ рдлрд╝реАрд▓реНрдб рд╣реЛрддреЗ рд╣реИрдВ: рдПрдХ рдХреЛ caller
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдХреЛ suspended
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
caller
рдлрд╝реАрд▓реНрдб рдХреЙрд▓рд░ рдХреЗ (рдирд┐рд▓рдВрдмрд┐рдд) рд╕реНрдЯреИрдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ suspended
рдлрд╝реАрд▓реНрдб рд░рд┐рдХреНрдд рд╣реИsuspended
рдлрд╝реАрд▓реНрдб рдЙрд╕ (рдирд┐рд▓рдВрдмрд┐рдд) WebAssembly рд╕реНрдЯреИрдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рд╕реНрдкреЗрдВрдбрд░ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ caller
рдлрд╝реАрд▓реНрдб рд░рд┐рдХреНрдд рд╣реИредsuspender.returnPromiseOnSuspend(func)(args)
рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
suspender.caller
рдФрд░ suspended.suspended
рд╢реВрдиреНрдп рд╣реИрдВ (рдЕрдиреНрдпрдерд╛ рдлрдВрд╕рдирд╛)stack
рдХреЛ suspender
рд╕рдВрдмрджреНрдз рдПрдХ рдирдпрд╛ рдЖрд╡рдВрдЯрд┐рдд WebAssembly рд╕реНрдЯреИрдХ рд╣реЛрдиреЗ рджреЗрдирд╛stack
рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдФрд░ рдкреВрд░реНрд╡ рд╕реНрдЯреИрдХ рдХреЛ suspender.caller
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдирд╛result
рдХреЛ func(args)
(рдпрд╛ рдХрд┐рд╕реА рднреА рдЬрд╛рд▓ рдпрд╛ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рдж) рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдиреЗ рджреЗрдирд╛suspender.caller
рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛stack
result
рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ (рдпрд╛ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдирд╛)suspender.suspendOnReturnedPromise(func)(args)
рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
func(args)
рдХреЙрд▓ рдХрд░рдирд╛, рдХрд┐рд╕реА рднреА рдЬрд╛рд▓ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдпрд╛ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдирд╛result
рд▓реМрдЯрд╛ рд╣реБрдЖ рд╡рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ result
рд▓реМрдЯрд╛рдирд╛ (рдпрд╛ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдирд╛)suspender.caller
рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ (рдЕрдиреНрдпрдерд╛ рдлрдБрд╕рд╛рдирд╛)stack
рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕реНрдЯреИрдХ рд╣реЛрдиреЗ рджреЗрдВstack
рдПрдХ WebAssembly рд╕реНрдЯреИрдХ рдирд╣реАрдВ рд╣реИ рдЬреЛ suspender
рдЬреБрдбрд╝рд╛ рд╣реИ:stack
рдПрдХ WebAssembly рд╕реНрдЯреИрдХ рд╣реИ (рдЕрдиреНрдпрдерд╛ рдлрдБрд╕рд╛рдирд╛)stack
рдХреЛ stack.suspender.caller
рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдХрд░ рд░рд╣рд╛ рд╣реИsuspender.caller
рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛, рдЗрд╕реЗ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛, рдФрд░ рдкреВрд░реНрд╡ рд╕реНрдЯреИрдХ рдХреЛ suspender.suspended
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛result.then(onFulfilled, onRejected)
рдХрд╛ рдкрд░рд┐рдгрд╛рдо onFulfilled
рдФрд░ onRejected
рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд▓реМрдЯрд╛рдирд╛suspender.suspended
рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛, рдЗрд╕реЗ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛, рдФрд░ рдкреВрд░реНрд╡ рд╕реНрдЯреИрдХ рдХреЛ suspender.caller
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛onFulfilled
рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджрд┐рдП рдЧрдП рдорд╛рди рдХреЛ externref
рдХрдирд╡рд░реНрдЯ рдХрд░рдирд╛ рдФрд░ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛onRejected
рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджрд┐рдП рдЧрдП рдорд╛рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдирд╛рд╕рд╕реНрдкреЗрдВрдбреЗрдмрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП
рдХреНрдпрд╛ рдПрдХ рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░реНрджрд╛рдлрд╛рд╢ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди/рдЬрдирд░реЗрдЯрд░ (рд╕рд┐рдВрдХ рдпрд╛ рдПрд╕рд┐рдВрдХ) рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕реЗ рдПрдХ рдирд┐рд▓рдВрдмрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ?
рдХреНрдпрд╛ рдЖрдк рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж рдХреБрдЫ рдЫрджреНрдо рдХреЛрдб рдпрд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде, рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рд╕рдЯреАрдХ рдЙрддреНрддрд░ рджреВрдВред
рдХреНрдпрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ рдХрд┐ Suspender
рдЬреЗрдПрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдПрдкреАрдЖрдИ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ wasm ( WebAssembly.Suspender
) рдХреЗ рд▓рд┐рдП рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ TC39 рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреЗрдПрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, JS рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдЬрд╛рд▓ рдмрди рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЗрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкрд░реЗрд╢рд╛рдиреА рдореЗрдВ рдЧрдП рд╣реИрдВред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЙрдирдХреА рд░рд╛рдп рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╢реВ-рдпреВ рдХреЗ рд╕рд╛рде рдЙрдард╛ рд╕рдХрддрд╛ рд╣реВрдБред
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, @chicoxyzzy , рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╕реНрдЯреИрдХ рдЙрдкрд╕рдореВрд╣ рд╕реЗ рдХреБрдЫ рд╕рдВрджрд░реНрдн/рдЕрдкрдбреЗрдЯ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдерд╛ред рдкреБрд░рд╛рдиреЗ рд╕реНрдЯреИрдХ-рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕ рдЙрдореНрдореАрдж рдХреЗ рд╕рд╛рде рд▓рд┐рдЦреЗ рдЧрдП рдереЗ рдХрд┐ рдЖрдк рдирд┐рд▓рдВрдмрд┐рдд рд╕реНрдЯреИрдХ рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ/рд╣реЛрд╕реНрдЯ рдлрд╝реНрд░реЗрдо рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдореЗрдВ TC39 рдореЗрдВ рд▓реЛрдЧреЛрдВ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА рдереА рдХрд┐ рдЪрд┐рдВрддрд╛ рдереА рдХрд┐ рдпрд╣ JS рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ рд╣рдореЗрдВ рдореЗрдЬрдмрд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА рдХрд┐ рдЪрд┐рдВрддрд╛ рдереА рдХрд┐ рд╕рднреА рд╣реЛрд╕реНрдЯ рдлрд╝реНрд░реЗрдо рдирд┐рд▓рдВрдмрди рдХреЛ рд╕рд╣рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП рд╕реНрдЯреИрдХреНрд╕ рд╕рдмрдЧреНрд░реБрдк рддрдм рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗрд╡рд▓ рдирд┐рд▓рдВрдмрд┐рдд рд╕реНрдЯреИрдХ рдореЗрдВ WebAssembly (-рд╕рдВрдмрдВрдзрд┐рдд) рдлрд╝реНрд░реЗрдореЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ, рдФрд░ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреЛрдЯ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрдкреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ред
рдпрд╣рд╛рдВ рдкреНрд░рдЧрддрд┐ рджреЗрдЦрдХрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕рдо рдХреЗ рд▓рд┐рдП рдИрдПрд╕рдПрдо рдПрдХреАрдХрд░рдг рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?
рдмреБрд░реА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдм JS API рдореЗрдВ рд╣реИ, рдЖрдк рдХреЗрд╡рд▓ ESM wasm рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдЯреИрдХ-рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдИрдПрд╕рдПрдо рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рдХреБрдЫ рдЬреЗрдПрд╕ рдИрдПрд╕рдПрдо рдореЙрдбреНрдпреВрд▓ рдЧреЛрдВрдж рдХреЗ рд░реВрдк рдореЗрдВред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЖрдк рддреАрди ESM рдореЙрдбреНрдпреВрд▓ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ: foo-exports.js
, foo-wasm.wasm
, рдФрд░ foo-imports.js
ред 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
рд╕реАрдзреЗ рд╕реНрдкрд░реНрд╢ рдирд╣реАрдВ рдХрд░рддреЗ (рдпрд╛ рдЗрд╕рдХреЗ рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред
рдпрд╣ рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рдмрд╛рдзрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрд░ рд╡рд╛рд╕реНрдо рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рди рдХрд░рдиреЗ рдХреА рдмрд╛рдзрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╣рдо рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд╕рдХрддреЗ рдереЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛрд░ рд╡рд╛рд╕рдо рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рд╣реИ рдХрд┐, рдЬрдм рд╡рд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬрд╣рд╛рдЬреЛрдВ, рдЖрдк рдЗрди рддреАрди рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд-рд╡рд╛рд╕рдо рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдИ рднреА рд╢рдмреНрджрд╛рд░реНрде рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЕрдВрддрд░ рдмрддрд╛рдПрдВ (рдореЙрдбреНрдпреВрд▓реЛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛)ред
рдХреНрдпрд╛ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рдерд╛, рдФрд░ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛ (рдпрджреНрдпрдкрд┐ рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ)?
рдореИрдВ рд░реИрдкрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдХрдо рд╕реЗ рдХрдо рдЬрдмрдХрд┐ WebAssembly.Module рдкреНрд░рдХрд╛рд░ Wasm рдЖрдпрд╛рдд рдЕрднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡реЗ рдирд┐рдпрдд рд╕рдордп рдореЗрдВ рд╣реЛрдВрдЧреЗ)ред
рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдИрдПрд╕рдПрдо рдПрдХреАрдХрд░рдг рдореЗрдВ рдЗрди рдкреИрдЯрд░реНрдиреЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИ рддрд╛рдХрд┐ рдирд┐рд▓рдВрдмрди рдЧреЛрдВрдж рдХреЗ рджреЛрдиреЛрдВ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдХреБрдЫ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдерд╛ рдЬреЛ рдмрд╛рдЗрдирд░реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдФрд░ рдЖрдпрд╛рддрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдИрдПрд╕рдПрдо рдПрдХреАрдХрд░рдг рдЙрд╕рд╕реЗ рдкреВрдЫрддрд╛рдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдкреВрд░реНрд╡рд╛рдиреБрдореЗрдп рдирд┐рдпрдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХреАрдХрд░рдг рдкрд░рдд рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рджреЛрд╣рд░реЗ рдЖрдпрд╛рдд / рдирд┐рд░реНрдпрд╛рдд рд░реИрдкрд┐рдВрдЧ рд╕рд╕реНрдкреЗрдВрдбрд░ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрд╣ред рдлрд┐рд▓рд╣рд╛рд▓ рдРрд╕реА рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА рдереА, рд╡рд╣ рдпрд╣ рдереА рдХрд┐ рдИрдПрд╕рдПрдо рдПрдХреАрдХрд░рдг рдХреЛ рднреА рдирд╣реАрдВ рдмрджрд▓рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереАред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЖрд╢рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдВрддрддрдГ рдпрд╣ рд╕рдм рдХреЛрд░ рд╡рд╛рд╕рдо рдореЗрдВ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЫреЛрдЯрд╛ рдкрджрдЪрд┐рд╣реНрди рдЫреЛрдбрд╝реЗред
рдореБрдЭреЗ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА рдереА, рд╡рд╣ рдпрд╣ рдереА рдХрд┐ рдИрдПрд╕рдПрдо рдПрдХреАрдХрд░рдг рдХреЛ рднреА рдирд╣реАрдВ рдмрджрд▓рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереА
рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╣рд╛рдБ рд╕реЗ рдЖ рд░рд╣реА рд╣реИ? рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдПрдХреАрдХрд░рдг рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдИрдПрд╕рдПрдо рдПрдХреАрдХрд░рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдмрд╣реБрдд рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИ, рдПрдХ рдРрд╕рд╛ рд╕реНрдерд╛рди рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦреЛрдЬрд╛ рдЧрдпрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдХреНрдпреЛрдВ рд▓рд╛рддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдЕрддреАрдд рдореЗрдВ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд░реЛрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИред рдЗрд╕реЗ рдЪреАрдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рдЬреЗрдПрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рджрд╛ рдЖрдпрд╛рдд/рдирд┐рд░реНрдпрд╛рдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдореЗрдВ рдПрдХ рд▓рд╛рдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рдПрдХ рдПрдХрд▓ рдЬреЗрдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХреА рдХреНрд╖рдорддрд╛ рдореЗрдВ рдмрд╛рдзрд╛ рдбрд╛рд▓рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╡рд╛рд╕рдо рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рддрдХ рдФрд░ рдЖрдпрд╛рддрдХ рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЕрднреА рднреА рдХрд╛рд░реНрдп рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдИрдПрд╕рдПрдо рдПрдХреАрдХрд░рдг рдореЗрдВ рдЬреЗрдПрд╕ рдЪрдХреНрд░ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред , рд▓реЗрдХрд┐рди рдЖрдпрд╛рддрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕рд╕реНрдкреЗрдВрдбрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд░реИрдкрд░ рдХреЗ рд╕рд╛рде рдЙрддреНрдерд╛рдкрди рдЗрд╕ рдЪрдХреНрд░ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдореБрдЭреЗ рдпрд╣ рдЖрднрд╛рд╕ @lukewagner рд╕реЗ рдорд┐рд▓рд╛ рд╣реИред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдИрдПрд╕рдПрдо рдПрдХреАрдХрд░рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕рдо рдлрд╛рдЗрд▓ рдореЗрдВ рдмрджрд▓рд╛рд╡/рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдЬрд┐рд╕реЗ рд╣рдо рдЯрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рдереЗ (рдЫреЛрдЯреЗ рдкрджрдЪрд┐рд╣реНрди рд▓рдХреНрд╖реНрдп рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ) - рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдереЗ / рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ред рдмреЗрд╢рдХ, рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡/рд╡рд┐рд╕реНрддрд╛рд░ рдИрдПрд╕рдПрдо рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗ, рддреЛ рд╡реЗ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдкреВрд░рдХ рд╣реЛрдВрдЧреЗ рддрд╛рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдПрд╕ рд░реИрдкрд░ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред
рдореИрдВрдиреЗ @ рдЬреИрдХ-рд╡рд░реНрдХреНрд╕ рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝рд╛ рд╣реИ, рдКрдкрд░ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИред
рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @RossTate , рд╣рд╛рдВ, рдореИрдВ рдореЗрдЬрдмрд╛рди рдПрдХреАрдХрд░рдг рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдирд░реА рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрди рдЖрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдирд┐рд▓рдВрдмрди рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рддрд▓рд╛рд╢рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдорд╡реАрдкреА рдореЗрдВ рдЗрд╕рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдпрд╣ рднреА рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд▓реЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдИрдПрд╕рдПрдо рдПрдХреАрдХрд░рдг рдПрдХ рдРрд╕рд╛ рд╕реНрдерд╛рди рд╣реИ рдЬреЛ рдЪреАрдиреА рд╕реЗ рдЕрдзрд┐рдХ рдЖрдо рддреМрд░ рдкрд░ рдмреЗрд╕ рдЬреЗрдПрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЬрд┐рд╕ рдЪреБрдиреМрддреА рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛, рд╡рд╣ рдпрд╣ рдереА рдХрд┐ рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╣рдордиреЗ WebAssembly.instantiate()
(рдпрд╛ рдирдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде WebAssembly.instantiate()
рдирдП рд╕рдВрд╕реНрдХрд░рдг) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдерд╛, рдЬрдм рдИрдПрд╕рдПрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ wasm рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддрдм рднреА рдХрд┐рд╕реА рддрд░рд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реЛрдЧрд╛ред -рдПрдХреАрдХрд░рдг, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдИрдПрд╕рдПрдо-рдПрдХреАрдХрд░рдг рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдерд╛ред
рдЖрд╣, рдЕрдЪреНрдЫрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдИрдПрд╕рдПрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рд╣реИ рдЬрд┐рддрдирд╛ рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛, рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдореЗрд░реА рдЧрд▓рддрдлрд╣рдореА рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╕реНрдЯрдо рд╕реЗрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреБрдЫ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП Wasm рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ JS рдХреЛ рдкреНрд░реЙрдорд┐рд╕-рдЖрдзрд╛рд░рд┐рдд API рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреИрд╕реЗ Wasm рд╕реЗ рдЖрдпрд╛рдд JS рдкреНрд░реЙрдорд┐рд╕-рдЖрдзрд╛рд░рд┐рдд API рд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдЯреИрдХ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрд╛ред рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБ?
рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЦреБрдж рдХреЛ рд╡рд╛рд╕рдо рдЬреАрд╕реА/рдЬреЗрдПрд╕-рдИрдПрд╕рдПрдо рдПрдХреАрдХрд░рдг (рдпрд╛ рдЙрд╕реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдХрд╕реНрдЯрдо рдЕрдиреБрднрд╛рдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╕реНрдЯрдо рдЕрдиреБрднрд╛рдЧ рдХрд┐рд╕ рд╣рдж рддрдХ рдХреНрд░реЙрд╕-рд▓реИрдВрдЧреНрд╡реЗрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рдХрдо рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ, рдФрд░ рдПрдХ рдШрдЯрдХ рдХреЗ рднреАрддрд░ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдмреАрдЪред
рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕ рдХрд╕реНрдЯрдо рдЕрдиреБрднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд╛рд░ рдпрд╛ рд░реАрдбрдореЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ?
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рдЬреАрд╕реА рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ WebAssembly/gc#203 рдореЗрдВред рдЬреЗрдПрд╕-рдПрдХреАрдХрд░рдг рдХрд▓ рдЬреАрд╕реА рдЙрдкрд╕рдореВрд╣ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдХрдиреЗрдХреНрд╢рди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛ рдпрд╣ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдмрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЪрд░реНрдЪрд╛ рдХреИрд╕реЗ рдЪрд▓рддреА рд╣реИ)ред