Design: kapan kita membutuhkan kode lem?

Dibuat pada 9 Apr 2018  ·  4Komentar  ·  Sumber: WebAssembly/design

Saya bertemu beberapa kasus.

satu kita perlu beberapa kode lem:

int addThree(uint8_t *buf, int len) {
  uint8_t *item;
  uint8_t *end = buf + len;

  for (item = buf; item<end; item++) {
    *item += 3;
  }

  return 0;
}

tetapi, secara sederhana, kita hanya perlu menggunakan file .wasm

int adder (int a, int b) {
    return a + b;
}

jadi, apa yang dilakukan kode lem? Saya tidak dapat menemukan beberapa dokumen.

Komentar yang paling membantu

Kode lem yang dijelaskan dalam komentar di atas adalah pemuat JavaScript yang dihasilkan Emscripten. Ia melakukan persis seperti yang dikatakan komentar: mengkonversi antara representasi data JS dan C++ (misalnya string), dan antara representasi objek yang berbeda (yaitu membuat objek proxy JS untuk objek C++). Itu juga membuat array yang diketik yang diperlukan.

Seperti yang Anda perhatikan, Anda dapat membuang pemuat Emscripten untuk kasus sederhana seperti dua fungsi yang Anda gunakan sebagai contoh. Tak satu pun dari mereka memerlukan kode lem yang rumit: masing-masing hanya membutuhkan file JS untuk memuat file Wasm (dan dalam contoh kedua, file wasm addThree juga memerlukan Uint8Array yang akan dibuat).

Akhirnya, alokasi memori ditangani oleh kode Wasm, yang harus menyertakan salinan malloc dari musl (walaupun sebenarnya Emscripten masih menyertakan malloc-nya, daripada menggunakan yang musl). Kebocoran memori dihindari dengan cara standar hanya dengan mengosongkan memori dalam kode C/C++ Anda setelah Anda selesai menggunakannya, tidak ada yang istimewa yang dibutuhkan Wasm di sini.

Pada akhirnya, Anda hanya memerlukan kode lem yang benar-benar akan Anda gunakan, berdasarkan panggilan lintas batas yang dibuat kode Anda (dari JS ke C++ dan dari C++ ke JS).

Masalah ini dapat ditutup, ini adalah pertanyaan tentang Emscripten daripada bug dalam desain WebAssembly itu sendiri.

Semua 4 komentar

Kode lem apa? Anda tampaknya telah menyalin dua fungsi di sini ( addThree() dan adder() ) dari beberapa tutorial Wasm mungkin? Mereka tampaknya hanya menjadi contoh fungsi yang tidak banyak membantu, dan hanya berfungsi untuk mendemonstrasikan tutorial Wasm sederhana. Tak satu pun dari fungsi ini memiliki tanda tangan yang kompleks, dan harus dapat dipanggil tanpa kode lem.

Tapi, itu bukan poin saya. Dari beberapa dokumen, itu menjelaskan seperti ini:

Dalam jangka panjang, wasm dengan objek yang diketik dan GC mungkin bisa membantu. Apakah itu yang dimaksud di sini?
Kalau tidak, saya tidak yakin bagaimana kode lem itu dapat dihapus dalam jangka pendek atau menengah. Dibutuhkan banyak pekerjaan untuk membentuk shell di sekitar hal-hal C/C++ yang membuatnya terlihat seperti hal JS. Misalnya, kode lem harus berisi metode untuk mengubah string C menjadi string JS, dan sebaliknya. Pada level C++, mendukung perluasan kelas C++ di JS dan mengimplementasikan metode virtual di JS membutuhkan sedikit peretasan. Dan secara umum, banyak lem akan diperlukan untuk mengakses API web dari wasm melalui JS.

dan lain-lain:

Emscripten membutuhkan berbagai macam kode "lem" JavaScript untuk menangani alokasi memori, kebocoran memori, dan sejumlah masalah lain, yang sudah disertakan dalam template yang disediakan. Lebih mudah menggunakannya daripada harus menulis semuanya sendiri

Ketika saya menemukan beberapa kode C/C++ sederhana, saya dapat dengan mudah menggunakan wasm dengan mengompilasinya, dan export.xxxFn() .

int adder (int a, int b) {
    return a + b;
}

dan Ketika saya menggunakan kode yang menggunakan Buffer, saya lebih suka menggunakan kode lem.

# C/C++
int addThree(uint8_t *buf, int len) {
  uint8_t *item;
  uint8_t *end = buf + len;

  for (item = buf; item<end; item++) {
    *item += 3;
  }

  return 0;
}

# deal with buffer in JS
...
let dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, nDataBytes);
dataHeap.set(new Uint8Array(buffer_pcm.buffer));
...

jadi, saya dapat menyimpulkan bahwa ketika saya mentransfer Buffer ke WASM, saya memerlukan kode lem untuk menangani alokasi memori, kebocoran memori, dan sejumlah masalah lainnya?

Kode lem yang dijelaskan dalam komentar di atas adalah pemuat JavaScript yang dihasilkan Emscripten. Ia melakukan persis seperti yang dikatakan komentar: mengkonversi antara representasi data JS dan C++ (misalnya string), dan antara representasi objek yang berbeda (yaitu membuat objek proxy JS untuk objek C++). Itu juga membuat array yang diketik yang diperlukan.

Seperti yang Anda perhatikan, Anda dapat membuang pemuat Emscripten untuk kasus sederhana seperti dua fungsi yang Anda gunakan sebagai contoh. Tak satu pun dari mereka memerlukan kode lem yang rumit: masing-masing hanya membutuhkan file JS untuk memuat file Wasm (dan dalam contoh kedua, file wasm addThree juga memerlukan Uint8Array yang akan dibuat).

Akhirnya, alokasi memori ditangani oleh kode Wasm, yang harus menyertakan salinan malloc dari musl (walaupun sebenarnya Emscripten masih menyertakan malloc-nya, daripada menggunakan yang musl). Kebocoran memori dihindari dengan cara standar hanya dengan mengosongkan memori dalam kode C/C++ Anda setelah Anda selesai menggunakannya, tidak ada yang istimewa yang dibutuhkan Wasm di sini.

Pada akhirnya, Anda hanya memerlukan kode lem yang benar-benar akan Anda gunakan, berdasarkan panggilan lintas batas yang dibuat kode Anda (dari JS ke C++ dan dari C++ ke JS).

Masalah ini dapat ditutup, ini adalah pertanyaan tentang Emscripten daripada bug dalam desain WebAssembly itu sendiri.

Terima kasih banyak

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

frehberg picture frehberg  ·  6Komentar

aaabbbcccddd00001111 picture aaabbbcccddd00001111  ·  3Komentar

dpw picture dpw  ·  3Komentar

badumt55 picture badumt55  ·  8Komentar

jfbastien picture jfbastien  ·  6Komentar