Π― ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ΄Ρ, ΠΊΠ°ΠΊ ΠΏΡΠΈΠΌΠ΅Ρ MDN , Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΏΠ°ΠΌΡΡΠΈ ΠΈΠ· AS ΠΈ JS.
ΠΠΎ, ΠΊΡΠΎΠΌΠ΅ u8/i8, Π²ΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Ρ Π½Π΅ ΠΏΡΠΎΡΠ»ΠΈ, ΠΈ Ρ ΡΠ²ΠΈΠ΄Π΅Π», ΡΡΠΎ Π΄Π°Π½Π½ΡΠ΅, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠ΅ JS, ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΡ
AS.
ΠΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ Ρ ΡΠ°Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² float?
ΠΠΎΠΈ ΠΊΠΎΠ΄Ρ Π²ΡΠΎΠ΄Π΅:
```index.ts
// ΡΠ±ΠΎΡΠΊΠ°/index.ts
ΡΡΠ½ΠΊΡΠΈΡ ΡΠΊΡΠΏΠΎΡΡΠ° readMemoryU8 (ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅: ΡΠ°Π·ΠΌΠ΅Ρ): u8 {
ΠΎΠ±ΡΠ°ΡΠ½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ°
}
ΡΡΠ½ΠΊΡΠΈΡ ΡΠΊΡΠΏΠΎΡΡΠ° writeMemoryU8 (ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅: ΡΠ°Π·ΠΌΠ΅Ρ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅: u8): Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ {
Ρ
ΡΠ°Π½ΠΈΡΡ
}
ΡΡΠ½ΠΊΡΠΈΡ ΡΠΊΡΠΏΠΎΡΡΠ° readMemoryU16 (ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅: ΡΠ°Π·ΠΌΠ΅Ρ): u16 {
ΠΎΠ±ΡΠ°ΡΠ½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ°
}
ΡΡΠ½ΠΊΡΠΈΡ ΡΠΊΡΠΏΠΎΡΡΠ° writeMemoryU16 (ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅: ΡΠ°Π·ΠΌΠ΅Ρ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅: u16): Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ {
Ρ
ΡΠ°Π½ΠΈΡΡ
}
ΡΡΠ½ΠΊΡΠΈΡ ΡΠΊΡΠΏΠΎΡΡΠ° readMemoryF64 (ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅: ΡΠ°Π·ΠΌΠ΅Ρ): f64 {
ΠΎΠ±ΡΠ°ΡΠ½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ°
}
ΡΡΠ½ΠΊΡΠΈΡ ΡΠΊΡΠΏΠΎΡΡΠ° writeMemoryF64 (ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅: ΡΠ°Π·ΠΌΠ΅Ρ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅: f64): Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ {
Ρ
ΡΠ°Π½ΠΈΡΡ
}
// ...
```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
// __ΡΠ΅ΡΡΡ__/index.test.js
const wasm = require('../index');
ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½Π°Ρ ΠΏΠ°ΠΌΡΡΡ = wasm.memory;
ΠΎΠΏΠΈΡΠ°ΡΡ('ΠΡΠΎΠ²Π΅ΡΠΈΡΡ WASM', () => {
Π΄ΠΎΠΡΠ΅Π³ΠΎ(() => {
const mem = Π½ΠΎΠ²ΡΠΉ Uint8Array(memory.buffer);
Π΅ΡΠ»ΠΈ (ΠΌΠ΅ΠΌ.Π΄Π»ΠΈΠ½Π° < 1) {
ΠΏΠ°ΠΌΡΡΡ.ΡΠ°ΡΡΠΈ(1);
}
wasm.memory.grow(1);
});
test('ΡΡΠ΅Π½ΠΈΠ΅/Π·Π°ΠΏΠΈΡΡ uint8', () => {
const mem = Π½ΠΎΠ²ΡΠΉ Uint8Array(memory.buffer);
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);
});
test('ΡΡΠ΅Π½ΠΈΠ΅/Π·Π°ΠΏΠΈΡΡ uint16', () => {
const mem = Π½ΠΎΠ²ΡΠΉ Uint16Array(memory.buffer);
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);
});
test('ΡΡΠ΅Π½ΠΈΠ΅/Π·Π°ΠΏΠΈΡΡ float64', () => {
const mem = Π½ΠΎΠ²ΡΠΉ Float64Array(memory.buffer);
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);
});
});
```
ΠΠΎΡ
ΠΎΠΆΠ΅, ΡΡΠΎ ΠΏΡΠΈΡΠ°ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π²Π½ΠΎ 1
Π΄Π»Ρ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ, ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π΄Π»Ρ 8-Π±ΠΈΡΠ½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ 2
Π΄Π»Ρ 16-Π±ΠΈΡΠ½ΡΡ
ΠΈ 4
Π΄Π»Ρ 32-Π±ΠΈΡΠ½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ. ΠΈ Ρ. Π΄., ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π°.
@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
Π’Π΅ΡΡ ΠΏΡΠΎΠΉΠ΄Π΅Π½!
ΠΠΎΠ»ΡΡΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ!
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
offset
Π² Π²Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ β ΡΡΠΎ ΡΠΎΡΠ½Π°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π² ΠΏΠ°ΠΌΡΡΠΈ, Π½ΠΎ Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½ΡΠΆΠ½ΠΎ ΡΠΌΠ½ΠΎΠΆΠΈΡΡ. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈf64
Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π°8
Π±Π°ΠΉΡ (ΡΡΠΎ 64-Π±ΠΈΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅), ΡΡΠΎΠ±Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π΅ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΡΠ²Π°Π»ΠΈ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ