Design: рдЬреЗрдПрд╕/рдбрдмреНрд▓реНрдпреВрдПрдПрд╕рдПрдо рд╕рдВрджрд░реНрдн рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рд╕рд┐рддре░ 2018  ┬╖  18рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: WebAssembly/design

рдирдорд╕реНрддреЗ,

рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ Float32Array рдмрдлрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреБрдЫ 1024 f32 рдорд╛рди рд╣реИрдВ, рдЬреЛ WASM рдЖрдзрд╛рд░рд┐рдд рдбреАрдПрд╕рдкреА рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ :)

рдореИрдВ рдЕрднреА рднреА WebAssembly рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдирдпрд╛ рд╣реВрдБред рдореИрдВ рд╕рдордЭ рдЧрдпрд╛ рдХрд┐ рдЖрдк рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП WASM рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рднреА рдареАрдХ рд╣реВрдБ ...

рдЗрд╕рд▓рд┐рдП, рдЕрдкрдиреЗ 1024 рдорд╛рдиреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ .memory рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реВрдВред рдкрд╕рдВрдж:

const mem = exports.memory.buffer;
const F32 = new Float32Array(mem);
F32[0] = 31337.777;

рдпрд╣ рдордЬреЗрджрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╕рднреА рдорд╛рдиреЛрдВ рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдорд╛рдиреЛрдВ рдкрд░ рд▓реВрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЦреИрд░, рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдЧрд▓рдд рдкреНрд░рджрд░реНрд╢рди-рд╡рд╛рд░ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдПрдХ рджреЗрд╢реА рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ред рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЬреИрд╕реЗ рдПрдХ рдЬреИрд╕реЗ рдкреНрд░рдореБрдЦ data рдореЗрдВ memoryDescriptor рдХреЗ рддрд░реНрдХ WebAssembly.Memory рдирд┐рд░реНрдорд╛рддрд╛ рдПрдХ рд╕рд╛рде рд╕реНрдореГрддрд┐ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ ArrayBuffer ред

рддреЛ, рдареАрдХ рд╣реИ, рддреЛ рдореИрдВ рдЕрдкрдирд╛ WASM рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЬрдм WASM impl. рдХреНрдпрд╛ рдпрд╣ рдЬрд╛рджреВ рд╣реИ, рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдбреАрдПрд╕рдкреА рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдбрдмреНрд▓реНрдпреВрдПрдПрд╕рдПрдо рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИ - рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред

рд▓реЗрдХрд┐рди рдЕрдм, рдЬрдм рдореИрдВ рдЬреЗрдПрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдПрдХ рдФрд░ рдЬреЗрдПрд╕ рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рдореЗрдореЛрд░реА рдкрд░ рдлрд┐рд░ рд╕реЗ рдЪрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдореБрдЭреЗ рдПрдХ рджреЗрд╢реА рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреА рдЙрдореНрдореАрдж рдереАред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрд╕реНрдерд┐рдд рд░рд╣реЗрдВред рд╢рд╛рдпрдж memory.read(Float32Array) рдЬреИрд╕рд╛ рдХреБрдЫ рдореБрдЭреЗ рдмрдлрд░ рдбреЗрдЯрд╛ рдХреЛ Float32Array рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреЙрдЗрдВрдЯрд░ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреЛ рд╕рд╛рд░рдгреАрдмрджреНрдз рдХрд░рдирд╛ред

рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдБ?
рдХреНрдпрд╛ WASM рд╕реЗ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рд╣реИ?

рдЕрдЧреНрд░рд┐рдо рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда,
рдПрд░рди

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ WebAssembly рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ WebAssembly рдбреЗрдЯрд╛ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реЛред

рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реНрд╡рдпрдВ for рд▓реВрдк рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп TypedArray.prototype.set() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

let instance = ...;
let myJSArray = new Float32Array(...);
let length = myJSArray.length;
let myWasmArrayPtr = instance.exports.allocateF32Array(length);
let myWasmArray = new Float32Array(instance.exports.memory.buffer, myWasmArrayPtr, length);

// Copy data in to be used by WebAssembly.
myWasmArray.set(myJSArray);

// Process the data in the array.
instance.exports.processF32Array(myWasmArrayPtr, length);

// Copy data out to JavaScript.
myJSArray.set(myWasmArray);

рдпрджрд┐ WebAssembly рдХреЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рд╣реИ, рддреЛ рдЖрдк WebAssembly.Memory рдмрдлрд╝рд░ рдкрд░ рдПрдХ рджреГрд╢реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреЗ JavaScript рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рднреА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

let instance = ...;
let length = ...;
let myArrayPtr = instance.exports.allocateF32Array(length);
let myArray = new Float32Array(instance.exports.memory.buffer, myArrayPtr, length);

// Use myArray as a normal Float32Array in JavaScript, fill in data, etc.
...

// Process the data in the array.
instance.exports.processF32Array(myArrayPtr, length);

// No need to copy data back to JavaScript, just use myArray directly.

рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдВрдмрд┐рдВрдб рдЬреИрд╕реЗ рдЯреВрд▓ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рднреА 18 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ WebAssembly рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ WebAssembly рдбреЗрдЯрд╛ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реЛред

рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реНрд╡рдпрдВ for рд▓реВрдк рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп TypedArray.prototype.set() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

let instance = ...;
let myJSArray = new Float32Array(...);
let length = myJSArray.length;
let myWasmArrayPtr = instance.exports.allocateF32Array(length);
let myWasmArray = new Float32Array(instance.exports.memory.buffer, myWasmArrayPtr, length);

// Copy data in to be used by WebAssembly.
myWasmArray.set(myJSArray);

// Process the data in the array.
instance.exports.processF32Array(myWasmArrayPtr, length);

// Copy data out to JavaScript.
myJSArray.set(myWasmArray);

рдпрджрд┐ WebAssembly рдХреЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рд╣реИ, рддреЛ рдЖрдк WebAssembly.Memory рдмрдлрд╝рд░ рдкрд░ рдПрдХ рджреГрд╢реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреЗ JavaScript рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рднреА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

let instance = ...;
let length = ...;
let myArrayPtr = instance.exports.allocateF32Array(length);
let myArray = new Float32Array(instance.exports.memory.buffer, myArrayPtr, length);

// Use myArray as a normal Float32Array in JavaScript, fill in data, etc.
...

// Process the data in the array.
instance.exports.processF32Array(myArrayPtr, length);

// No need to copy data back to JavaScript, just use myArray directly.

рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдВрдмрд┐рдВрдб рдЬреИрд╕реЗ рдЯреВрд▓ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╛рд╣, рдзрдиреНрдпрд╡рд╛рдж @binji рдпрд╣ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВ рдвреВрдВрдв рд░рд╣рд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдзрдиреНрдпрд╡рд╛рджред рдпреЗ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рднреА рд╣реИ. рдореИрдВ рдЖрдЬ рд╢рд╛рдо рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдЙрдВрдЧрд╛ рдФрд░ рд▓реЛрдбрд░ рдЗрдВрдк рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрдзрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реВрдВрдЧрд╛ред рдЬреЛ https://github.com/AssemblyScript/assemblyscript рдореЗрдВ WASM рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИ :)

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ webassembly.org рдкрд░ рдбреЙрдХреНрд╕ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ:

https://webassembly.org/docs/web/

рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдореИрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕реЗ рдпрд╣рд╛рдБ рд╕рдордЭрд╛рдирд╛ рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдЧрд╛:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory

@binji рдСрдл-рдЯреЙрдкрд┐рдХ, рдЕрдЧрд░ рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдк https://github.com/torch2424/wasmBoy рдХреЛ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ ROM рдореЗрдореЛрд░реА рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░-рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ webassembly.org рдкрд░ рдбреЙрдХреНрд╕ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ?

рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ webassembly.org рдХреЛ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╣рд╛рдВ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЕрднреА рднреА рдбрд┐рдЬрд╝рд╛рдЗрди рд░реЗрдкреЛ рд╕реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдкреЗрдХ рд░реЗрдкреЛ рдЕрдзрд┐рдХ рд╣рд╛рд▓рд┐рдпрд╛ рдФрд░ рд╕рдЯреАрдХ рд╣реИред

MDN рдореЗрдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рдирд╛ рд╢рд╛рдпрдж рдЖрд╕рд╛рди рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ webassembly.org рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдИ рдФрд░ рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░ рдЙрд╕ рд╕рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдСрдл-рдЯреЙрдкрд┐рдХ, рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк https://github.com/torch2424/wasmBoy рдХреЛ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рдВ, рдореИрдВ @torch2424 рдЬрд╛рдирддрд╛ рд╣реВрдВред :-) рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡рд╛рд╕-рдЖрдзрд╛рд░рд┐рдд рдЧреЗрдордмреЙрдп рдПрдореБрд▓реЗрдЯрд░ рднреА рд╣реИ: https://github.com/binji/binjgb

MDN рдореЗрдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рдирд╛ рд╢рд╛рдпрдж рдЖрд╕рд╛рди рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ webassembly.org рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдИ рдФрд░ рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░ рдЙрд╕ рд╕рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдареАрдХ рд╣реИ, рдореИрдВ рдЖрдЬ рд░рд╛рдд рдПрдХ рдЕрдкрдбреЗрдЯ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред рджреЗрдЦрддреЗ рд╣реИрдВ рдХреНрдпрд╛ рдпрд╣ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рд╣рд╛рдВ, рдореИрдВ @torch2424 рдЬрд╛рдирддрд╛ рд╣реВрдВред :-) рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡рд╛рд╕-рдЖрдзрд╛рд░рд┐рдд рдЧреЗрдордмреЙрдп рдПрдореБрд▓реЗрдЯрд░ рднреА рд╣реИ: https://github.com/binji/binjgb

рд╣ рд╣рд╛ рдмрдврд┐рдпрд╛! рдореИрдВ рдбреАрдИрдПрдлрд╝ рдХрд░реВрдБрдЧрд╛ред рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ :) рдореИрдВ рд╢рд░реНрдд рд▓рдЧрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХрд╛ рдПрдореБрд▓реЗрдЯрд░ рдЬрд╝реЗрд▓реНрдбрд╛ рдореЗрдВ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рд▓рд┐рдВрдХ рдХреА рдЬрд╛рдЧреГрддрд┐ рдЬрдм рдЖрдкрдХреЛ рддрд▓рд╡рд╛рд░ рдорд┐рд▓рддреА рд╣реИ (рд╕рдореБрджреНрд░ рддрдЯ рдкрд░);))

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ wasmBoy рдореЗрдВ рднреА рджреБрд░реНрдШрдЯрдирд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рдорд┐рд▓реЗрдЧрд╛ :)

рдЕрд░реЗ! рд░реЗрдб рдЬреЛ рдЖрдкрдХреЛ рдорд┐рд▓рд╛ рд╡реЛрдордмреЙрдп! рд╣рд╛рдБ, @binji рдХрд╛ рдПрдореБрд▓реЗрдЯрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣рд╛рд╣рд╛ рд╣реИ! рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИред рд▓реЗрдХрд┐рди, рд╡рд┐рдбрдВрдмрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рд╣рд░ рд╕рдордп рд╣рд╛рд╣рд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдХреЗ рдЬрд╛рдЧрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ! рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпрд╣ рдЖрдк рдкрд░ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЧрдпрд╛ред

рдлреАрдбрдмреИрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдмрдЧ рдЦреЛрд▓реЗ:
https://github.com/torch2424/wasmBoy/issues/141 - рдореЗрдореЛрд░реА рдкрд╛рд╕рд┐рдВрдЧ
https://github.com/torch2424/wasmBoy/issues/142 - рдЬрд╝реЗрд▓реНрдбрд╛ рдХреНрд░реИрд╢ (рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рд╕рд╛рде рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)

рд╡реИрд╕реЗ рднреА, рдореИрдВ рдмрд╛рддрдЪреАрдд/рдореБрджреНрджреЗ рдХреЛ рдкрдЯрд░реА рд╕реЗ рдирд╣реАрдВ рдЙрддрд╛рд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдореИрдВ рдЙрди рдореБрджреНрджреЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдЦреЛрд▓рд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ

рдпрджрд┐ WebAssembly рдХреЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рд╣реИ, рддреЛ рдЖрдк WebAssembly.Memory рдмрдлрд╝рд░ рдкрд░ рдПрдХ рджреГрд╢реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреЗ JavaScript рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рднреА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреЗрддрд╛рд╡рдиреА: рдпрджрд┐ WebAssembly рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдЗрд╕рдХреА рдореЗрдореЛрд░реА рдмрдврд╝рд╛рддрд╛ рд╣реИ, рддреЛ рдореЗрдореЛрд░реА рдмрдлрд░ рдореЗрдВ рджреГрд╢реНрдп рдЕрдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕ рджреГрд╢реНрдп рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ рдЬреЛ рдкрд┐рдЫрд▓реЗ рдХреЙрд▓ рдХреЛ WebAssembly рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред

@binji рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдЖрдк рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк

let myWasmArrayPtr = instance.exports.allocateF32Array(length);

рдореИрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╣реИ рдпрд╛ рдирд╣реАрдВред

export function allocateF32Array(length: usize): usize {
    return memory.allocate(length * sizeof<f32>());
}

рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ memory.free() рд╕реЗ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ AS рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕рд░рдгреА рдХреЛ JS рдкрдХреНрд╖ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ?

@fmkang рддреЛ @binji рдиреЗ рдЬреЛ рд╕рдордЭрд╛рдпрд╛ рд╡рд╣ JS рдХреА рддрд░рдл рдерд╛ (рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ)ред

рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдПрд░реЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╡рд╛рд╕рдо рдРрд░реЗ рдмрдлрд░ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЗрдПрд╕ рдХреА рдУрд░ рд╕реЗ WASM рдореЗрдореЛрд░реА рдореЗрдВ рдХреБрд╢рд▓ рд▓реЗрдЦрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Wasm/AS рдХреЗ рдЕрдВрджрд░ рд╕реЗ Wasm рдореЗрдореЛрд░реА рдХреЛ рд▓рд┐рдЦрдирд╛, рдореИрдВ рдЕрднреА рднреА рд▓реВрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреИрд╕реЗ: https://github.com/torch2424/wasmBoy/blob/master/core/memory/dma.ts#L29

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╢рд╛рдпрдж @MaxGraey рдпрд╛ @dcodeIO рд╢рд╛рдпрдж рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ AS рдпрд╛ Wasm рднреВрдорд┐ рдХреЗ рдЕрдВрджрд░ рд╕реЗ рдЗрд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП? ЁЯШД рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рдПрдПрд╕ рд░реЗрдкреЛ рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ

@fmkang рдЖрдк рдмрд╕ рдХрд░реЗрдВрдЧреЗ

export function allocateF32Array(length: i32): Float32Array {
  return new Float32Array(length);
}

рдПрдПрд╕ рдХреА рддрд░рдл рдФрд░

let myArray = module.getArray(Float32Array, module.allocateF32Array(length));

рдЬреЗрдПрд╕ рдкрдХреНрд╖ рдкрд░, рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ

@torch2424 рд╣рд╛рдВ, @binji рдХрд╛ рдХреЛрдб JS рдХреА рддрд░рдл рд╣реИ, рд▓реЗрдХрд┐рди let myWasmArrayPtr = instance.exports.allocateF32Array(length) Wasm рдореЙрдбреНрдпреВрд▓ рдореЗрдВ allocateF32Array рдирд╛рдо рдХреЗ рдлрдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ (рд╕рдВрднрд╡рддрдГ рдЕрд╕реЗрдВрдмрд▓рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд)ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдЙрдирдХреЗ рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рди рд╣реА рдПрдПрд╕ рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╛рд╕рдо рд╕рд░рдгреА рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред

@dcodeIO рдзрдиреНрдпрд╡рд╛рджред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░рдгреА рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХреЛрдИ рднреА рдирдИ рдЯрд┐рдкреНрдкрдгреА рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЗрд╕рдХрд╛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдкреНрд░рдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрдкрдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рдореЗрд░рд╛ рдореЙрдбреНрдпреВрд▓ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХрдВрд╕реЛрд▓ рдХрд╣рддрд╛ рд╣реИ

astest.html:1 Uncaught (in promise) TypeError: WebAssembly Instantiation: Import #0 module="env" error: module is not an object or function

рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рдПрдПрд╕ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рднреА let a = new Float32Array(10); рдЬреИрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рднреА рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

@dcodeIO Wasm рдореЙрдбреНрдпреВрд▓ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рдереЗ (рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рдмрдЬрд╛рдп, рдЬреИрд╕реЗ let c: f64[] = [a[0] + b[0], a[1] + b[1]]; ) рдпрд╛ рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ (рдЬреИрд╕реЗ let a: f64[] = [0, 0, 0]; a[0] = 1; рдпрд╛ let array = new Array<i32>(); array.push(1); )ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ memory рдХреЛ env рдирд╣реАрдВ рдбрд╛рд▓рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рд▓рд┐рдЦрд╛:

var importObject = {
    env: { memory: new WebAssembly.Memory({initial:10}) },
    imports: { imported_func: arg => console.log(arg) }
};
WebAssembly.instantiate(wasmBinary, importObject).then(...);

рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдореМрдЬреВрдж рдереАред рддрдм рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ abort рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рд╣реИред рд╣рдордиреЗ рд▓рд┐рдЦрд╛:

env: {
    abort(msg, file, line, column) {
        console.error("abort called at main.ts:" + line + ":" + column);
    }
}

рдпрд╛ рдмрд╕ env: { abort: function(){} } , рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдирд┐рд░рд╕реНрдд" рдирд╣реАрдВ рд╣реБрдЖред рд╣рдо рдЕрднреА рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░рдг рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ WebAssembly рдореЗрдВ рдирдП рд╣реИрдВред рдореИрдВ рдпрд╣ рдкреЛрд╕реНрдЯ рд╕рд┐рд░реНрдл рдЕрдкрдбреЗрдЯ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@fmkang рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЙрдбреНрдпреВрд▓ рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЬрдмрдХрд┐ рдЖрдк рдпрд╣ рд╕рдм рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЛрдбрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдирд┐рд░рд╕реНрдд рдХрд╛рд░реНрдпред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрд╕реЗрдВрдмрд▓реАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдФрд░ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдмреЗрдЭрд┐рдЭрдХ рд╣рдорд╛рд░реЗ рдЗрд╢реНрдпреВ рдЯреНрд░реИрдХрд░ рдкрд░ рдкреВрдЫреЗрдВ рдФрд░ рд╣рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА :)

рддреЛ, рдореИрдВрдиреЗ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ:

let myArrayPtr = instance.exports.allocateF32Array(length);
let myArray = new Float32Array(instance.exports.memory.buffer, myArrayPtr, length);

// Use myArray as a normal Float32Array in JavaScript, fill in data, etc.
...

// Process the data in the array.
instance.exports.processF32Array(myArrayPtr, length);

рд▓реЗрдХрд┐рди рдореЗрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛F32Array рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо RuntimeError: memory access out of bounds ред рдореИрдВ рд▓реЛрдбрд░, рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рднреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ:

let myArray = module.getArray(Float32Array, module.allocateF32Array(length));

рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ "getArray" рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ рдХрд┐ WebAssembly рд╕реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЖрдпрд╛ред рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдирдХрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ AssemblyScript рдФрд░ @ torch2424 рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдБрдз

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рд╣реИ:

рдЕрд╕реЗрдВрдмрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ

export function sum(arr: Float64Array): f64 {
  let sum: f64 = 0;
  for(let i = 0; i < arr.length; i++) {
    sum += arr[i];
  }
  return sum;
}

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдиреЛрдб)

const { AsBind } = require("as-bind");
const fs = require("fs");
const wasm = fs.readFileSync(__dirname + "/build/optimized.wasm");

const asyncTask = async () => {
  const asb = await AsBind.instantiate(wasm);

  // Make a large array
  console.time('Making array');
  let arr = new Float64Array(1e8).fill(1);
  console.timeEnd('Making array');

  // Find the sum using reduce
  console.time('Reduce');
  let sum1 = arr.reduce((acc, val) => acc + val, 0);
  console.timeEnd('Reduce');

  // Find the sum with for loops
  console.time('JS For');
  let sum2 = 0;
  for(let i = 0; i < arr.length; i++) sum2 += arr[i];
  console.timeEnd('JS For');

  // Find the sum with WebAssembly
  console.time('Wasm For');
  let sum3 = asb.exports.sum(arr);
  console.timeEnd('Wasm For');

  console.log(sum1, sum2, sum3);
};

asyncTask();

рдореЗрд░реА рдорд╢реАрди рдкрд░, рдореБрдЭреЗ рдирд┐рдореНрди рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рд╛:

Making array: 789.086ms
Reduce: 2452.922ms
JS For: 184.818ms
Wasm For: 2008.482ms
100000000 100000000 100000000

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде WebAssembly рдкрд░ рд╕рд░рдгреА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддреЗ рд╕рдордп рдУрд╡рд░рд╣реЗрдб рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЯреНрд░реЗрдбрдСрдл рдПрдХ рдпреЛрдЧ рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рдВрдЧреЗ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рд╕рд░рдгреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рдЪрд▓рдиреЗ рдХреЗ рд╕рдордп рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реЗрдВрдмрд▓реАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд╕рд╛рд░рд╛рдВрд╢ рд╣рдЯрд╛ рджрд┐рдпрд╛:

export function sum(arr: Float64Array): f64 {
  let sum: f64 = 0;
  return sum;
}

рдФрд░ рдореИрдВ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВред

рд╡рд╛рд╕рдо рдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛

Making array: 599.826ms
Reduce: 2810.395ms
JS For: 188.623ms
Wasm For: 762.481ms
100000000 100000000 0

рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЙрдкреА рдХреЛ 100 рдорд┐рд▓рд┐рдпрди f64 s рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрдкреА рдХрд░рдиреЗ рдореЗрдВ 762.481ms рдХрд╛ рд╕рдордп рд▓рдЧрд╛ред

@pwstegman рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдмрдирд╛рдпрд╛ рдЬреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬреЗрдПрд╕ рдЗрдВрдЬрди рдХреЛ рдЖрдкрдХреЗ рд▓реВрдк рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ: https://webassembly.studio/?f=5ux4ymi345e

рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреНрд░реЛрдо рдФрд░ рдПрдлрдПрдл рдХреЗ рд▓рд┐рдП рднрд┐рдиреНрди рд╣реИрдВ:

Chrome 81.0.4044.129

js sum: 129.968017578125ms
sum result = 49996811.62100115

js reduce: 1436.532958984375ms
js reduce result = 49996811.62100115

wasm sum: 153.000244140625ms
wasm sum result = 49996811.62100115

wasm reduce: 125.009033203125ms
wasm reduce result = 49996811.62100115

wasm empty: 0.002685546875ms

рдирдорд╕реНрддреЗред
рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ WASM рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рдирд╡рдЬрд╛рдд рд╣реВрдВ, рдФрд░ рдореИрдВ рдпрд╣рд╛рдВ рдФрд░ # 1162 рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИред (рдореИрдВ рдпрд╣рд╛рдВ рдмрдирд╛рдо #1162 рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рд╣реИред)
рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╢реЛрдз рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдбреЗрдореЛ рдмрдирд╛рдпрд╛, рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖ рдЬрд╣рд╛рдВ рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рдХреЙрдкреА рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдбрдмреНрд▓реНрдпреВрдПрдПрд╕рдПрдо рдореЗрдореЛрд░реА рдореЗрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рдЬреЗрдПрд╕ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЗрд╕рдХрд╛ рд╕рд╛рд░ рд╣реИ :

// need to know the size in advance, that's OK since the impl makes some init 
const fft = new Module.KissFftReal(/*size=*/N);depending on the size anyway

// get view into WASM memory as Float64Array (of size=N in this case)
const input = fft.getInputTimeDataBuffer();

// fill 'input' buffer

// perform transformation, view into WASM memory is returned here (of size=(N + 2) in this case, +2 for Nyquist bin)
const output = fft.transform();

// use transformation result returned in 'output' buffer

рдХреНрдпрд╛ рдпрд╣ рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдХреЛрдИ рдмреЗрд╣рддрд░ рдЙрдкрд╛рдп рд╣реИ? рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА/рдкреБрдирд╢реНрдЪрд░реНрдпрд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗред

рдкреАрдПрд╕ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдереЛрдбрд╝реЗ рдмрджрд╕реВрд░рдд рдпрд╣ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рд╢рд╛рдирджрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдЗрд╕реЗ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ)

рдкреА рдкреА рдПрд╕
рдЗрд╕реА рддрд░рд╣ рдХреА рдЪрд┐рдВрддрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореЗрд░рд╛ (рдЕрднреА рддрдХ рдЕрдиреБрддреНрддрд░рд┐рдд) рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреНрд░рд╢реНрди рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

https://stackoverflow.com/questions/65566923/is-there-a-more-рдХреБрд╢рд▓-way-to-return-arrays-from-c-to-javascript

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jfbastien picture jfbastien  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nikhedonia picture nikhedonia  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

frehberg picture frehberg  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Artur-A picture Artur-A  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cretz picture cretz  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ