Assemblyscript: Как Ρ€Π°ΡΡˆΠ°Ρ€ΠΈΡ‚ΡŒ u16/u32/f64... ect Π² памяти?

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 12 Π΄Π΅ΠΊ. 2018  Β·  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
// __тСсты__/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);

});
});

```

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

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-Π±ΠΈΡ‚Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ 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
ВСст ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½!
Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ спасибо!

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

Iainmon picture Iainmon  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

MaxGraey picture MaxGraey  Β·  4ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

drachehavoc picture drachehavoc  Β·  6ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

lastmjs picture lastmjs  Β·  4ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

kungfooman picture kungfooman  Β·  5ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ