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
// __tests__/index.test.js
const wasm = ์๊ตฌ('../์ธ๋ฑ์ค');
const ๋ฉ๋ชจ๋ฆฌ = wasm.memory;
describe('WASM ํ
์คํธ', () => {
์ (() => {
const mem = ์๋ก์ด Uint8Array(memory.buffer);
if (mem.length < 1) {
memory.grow(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๋นํธ ๊ฐ์ ๊ฒฝ์ฐ ์ ํํ์ง๋ง 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
ํ
์คํธ ํต๊ณผ!
๋งค์ฐ ๊ฐ์ฌํฉ๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ทํ์ ๊ฒฝ์ฐ
offset
๋ ์ ํํ ๋ฉ๋ชจ๋ฆฌ ์์น์ด์ง๋ง ๊ณฑํด์ผ ํ๋ ์ธ๋ฑ์ค๋ฅผ ์ ๋ฌํ๊ณ ์์ต๋๋ค.f64
๋ฅผ ์ฌ์ฉํ ๋ ์คํ์ ์8
๋ฐ์ดํธ(64๋นํธ ๊ฐ)๋งํผ ์ฆ๊ฐ์์ผ ๊ฐ์ด ์๋ก ๋ฎ์ด์ฐ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค. ์: