Assemblyscript: ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ u16/u32/f64... ์š”๋ฒ•์„ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2018๋…„ 12์›” 12์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: AssemblyScript/assemblyscript

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);

});
});

```

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ท€ํ•˜์˜ ๊ฒฝ์šฐ 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 ๋“ฑ๊ธ‰