Assemblyscript: рд╕реНрдореГрддрд┐ рдкрд░ u16/u32/f64... ect рдХреИрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рджрд┐рд╕ре░ 2018  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: AssemblyScript/assemblyscript

рдореИрдВ AS рдФрд░ JS рд╕реЗ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MDN рдЙрджрд╛рд╣рд░рдг рдЬреИрд╕реЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
рд▓реЗрдХрд┐рди u8/i8 рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдкреИрдЯрд░реНрди рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдП рдФрд░ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ JS рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ AS рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рд╕реЗ рднрд┐рдиреНрди рд╣реИред

рдореИрдВ рдлреНрд▓реЛрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдореЗрд░реЗ рдХреЛрдб рдЬреИрд╕реЗ:

```index.ts
// рдЕрд╕реЗрдВрдмрд▓реА/index.ts

рдирд┐рд░реНрдпрд╛рдд рд╕рдорд╛рд░реЛрд╣ readMemoryU8 (рдСрдлрд╝рд╕реЗрдЯ: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ): u8 {
рд╡рд╛рдкрд╕реА рднрд╛рд░(рдСрдлрд╕реЗрдЯ)
}

рдирд┐рд░реНрдпрд╛рдд рд╕рдорд╛рд░реЛрд╣ рд▓рд┐рдЦреЗрдВ рдореЗрдореЛрд░реАрдпреВ 8 (рдСрдлрд╝рд╕реЗрдЯ: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдорд╛рди: рдпреВ 8): рд╢реВрдиреНрдп {
рджреБрдХрд╛рди(рдСрдлрд╕реЗрдЯ, рдореВрд▓реНрдп)
}

рдирд┐рд░реНрдпрд╛рдд рд╕рдорд╛рд░реЛрд╣ readMemoryU16 (рдСрдлрд╝рд╕реЗрдЯ: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ): u16 {
рд╡рд╛рдкрд╕реА рднрд╛рд░(рдСрдлрд╕реЗрдЯ)
}

рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдлрдВрдХреНрд╢рди рд░рд╛рдЗрдЯрдореЗрдореЛрд░реАрдпреВ16 (рдСрдлрд╝рд╕реЗрдЯ: рдпреВрдЬрд╝, рд╡реИрд▓реНрдпреВ: рдпреВ16): рд╢реВрдиреНрдп {
рджреБрдХрд╛рди(рдСрдлрд╕реЗрдЯ, рдореВрд▓реНрдп)
}

рдирд┐рд░реНрдпрд╛рдд рд╕рдорд╛рд░реЛрд╣ readMemoryF64 (рдСрдлрд╝рд╕реЗрдЯ: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ): f64 {
рд╡рд╛рдкрд╕реА рднрд╛рд░(рдСрдлрд╕реЗрдЯ)
}

рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдлрдВрдХреНрд╢рди рд░рд╛рдЗрдЯрдореЗрдорд░реАрдПрдл 64 (рдСрдлрд╕реЗрдЯ: рдпреВрдЬ, рд╡реИрд▓реНрдпреВ: рдПрдл 64): рд╢реВрдиреНрдп {
рджреБрдХрд╛рди(рдСрдлрд╕реЗрдЯ, рдореВрд▓реНрдп)
}

//...

```index.js
// index.js

const fs = require("fs");
const compiled = new WebAssembly.Module(fs.readFileSync(__dirname + "/build/optimized.wasm"));
const imports = {};
Object.defineProperty(module, "exports", {
  get: () => new WebAssembly.Instance(compiled, imports).exports
});

```index.test.js
// __tests__/index.test.js

const wasm = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('../index');
рдХреЙрдиреНрд╕реНрдЯ рдореЗрдореЛрд░реА = wasm.memory;

рд╡рд░реНрдгрди рдХрд░реЗрдВ ('рдЯреЗрд╕реНрдЯ WASM', () => {
рдкрд╣рд▓реЗ рд╕рднреА (() => {
рдХреЙрдиреНрд╕реНрдЯ рдореЗрдо = рдирдпрд╛ Uint8Array (рдореЗрдореЛрд░реА.рдмрдлрд░);
рдЕрдЧрд░ (рдореЗрдоред рд▓рдВрдмрд╛рдИ <1) {
рдореЗрдореЛрд░реА.рдЧреНрд░реЛ (1);
}
wasm.memory.grow(1);
});

рдкрд░реАрдХреНрд╖рдг ('uint8 рдкрдврд╝реЗрдВ / рд▓рд┐рдЦреЗрдВ', () => {
рдХреЙрдиреНрд╕реНрдЯ рдореЗрдо = рдирдпрд╛ Uint8Array (рдореЗрдореЛрд░реА.рдмрдлрд░);

mem.set([1, 3, 5]);
console.log([0, 1, 2, 3, 4, 5].map(wasm.readMemoryU8));
// [ 1, 3, 5, 0, 0, 0 ]
console.log(mem.subarray(0, 6));
//Uint8Array [ 1, 3, 5, 0, 0, 0 ]
expect(wasm.readMemoryU8(1)).toBe(3);
wasm.writeMemoryU8(1, 6);
expect(wasm.readMemoryU8(1)).toBe(6);
expect(mem[1]).toBe(6);
expect(wasm.readMemoryU8(0)).toBe(1);
expect(wasm.readMemoryU8(2)).toBe(5);

});

рдкрд░реАрдХреНрд╖рдг ('uint16 рдкрдврд╝реЗрдВ / рд▓рд┐рдЦреЗрдВ', () => {
рдХреЙрдиреНрд╕реНрдЯ рдореЗрдо = рдирдпрд╛ Uint16Array (рдореЗрдореЛрд░реА.рдмрдлрд░);

mem.set([1, 3, 257]);
console.log([0, 1, 2, 3, 4, 5].map(wasm.readMemoryU16)); 
// [ 1, 768, 3, 256, 257 ]
console.log(mem.subarray(0, 6)); 
// Uint16Array [ 1, 3, 257, 0, 0, 0 ]
expect(wasm.readMemoryU16(0)).toBe(1);
expect(wasm.readMemoryU16(1)).toBe(3); // failed
wasm.writeMemoryU16(1, 6);
expect(wasm.readMemoryU16(1)).toBe(6);
expect(mem[1]).toBe(6);
expect(wasm.readMemoryU16(2)).toBe(5);

});

рдкрд░реАрдХреНрд╖рдг ('рдлреНрд▓реЛрдЯ 64 рдкрдврд╝реЗрдВ / рд▓рд┐рдЦреЗрдВ', () => {
рдХреЙрдиреНрд╕реНрдЯ рдореЗрдо = рдирдпрд╛ рдлреНрд▓реЛрдЯ64рдПрд░реЗ (рдореЗрдореЛрд░реА.рдмрдлрд░);

mem.set([1, -3.2, 25.8]);

console.log([0, 1, 2, 3, 4, 5].map(wasm.readMemoryF64));
// [ 1,
//  -3.0065162379579438e-182,
//  -2.413170169815393e-185,
//  -2.3536706995205933e-185,
//  -2.3534382797147542e-185,
//  -2.3534373718248877e-185 ]
console.log(mem.subarray(0, 6));
// Float64Array [ 1, -3.2, 25.8, 0, 0, 0 ]
expect(wasm.readMemoryF64(0)).toBe(1);
expect(wasm.readMemoryF64(1)).toBe(-3.2); // failed
wasm.writeMemoryI16(1, -6.5);
expect(wasm.readMemoryF64(1)).toBe(-6.5);
expect(mem[1]).toBe(-6.5);
expect(wasm.readMemoryI16(2)).toBe(25.8);

});
});

```

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

рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ offset рд╕рдЯреАрдХ рд╕реНрдореГрддрд┐ рд╕реНрдерд┐рддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрдВрдбреЗрдХреНрд╕ рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред f64 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдСрдлрд╝рд╕реЗрдЯ рдХреЛ 8 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдмрдврд╝рд╛рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╣ 64-рдмрд┐рдЯ рдорд╛рди рд╣реИ) рддрд╛рдХрд┐ рдорд╛рди рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рди рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

export function readMemoryF64(index: u32): f64 {
  return load<f64>(index << alignof<f64>());
}

export function writeMemoryF64(index: u32, value: f64): void {
  store<f64>(index << alignof<f64>(), value);
}

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЗрдВрдХреНрд░реАрдореЗрдВрдЯ рд╣рдореЗрд╢рд╛ 1 рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ 8-рдмрд┐рдЯ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди 16-рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП $# 2 4 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЖрджрд┐, рдпрд╣рд╛рдБ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрд╣рд╛рдБ рдорд╛рди рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВред

@dcodeIO
рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЬрдм store<f64>(0, 1.5) , рддреЛ store<f64>(1, 2.7) , рдЗрд╕ рд╕рдордп рдореЗрдВ load<f64>(0) рдПрдХ рдЕрдЬреАрдм рдореВрд▓реНрдп рд▓реМрдЯрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди load<f64>(1) рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ 2.7 ред

рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ offset рд╕рдЯреАрдХ рд╕реНрдореГрддрд┐ рд╕реНрдерд┐рддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрдВрдбреЗрдХреНрд╕ рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред f64 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдСрдлрд╝рд╕реЗрдЯ рдХреЛ 8 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдмрдврд╝рд╛рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╣ 64-рдмрд┐рдЯ рдорд╛рди рд╣реИ) рддрд╛рдХрд┐ рдорд╛рди рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рди рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

export function readMemoryF64(index: u32): f64 {
  return load<f64>(index << alignof<f64>());
}

export function writeMemoryF64(index: u32, value: f64): void {
  store<f64>(index << alignof<f64>(), value);
}

@dcodeIO
рдкрд░реАрдХреНрд╖рд╛ рдЙрддреНрддреАрд░реНрдг рдХреА!
рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

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