Design: dukungan async / janji

Dibuat pada 7 Jan 2018  ·  7Komentar  ·  Sumber: WebAssembly/design

Banyak pustaka JavaScript asinkron dan saya belum melihat bahwa WebAssembly mendukung janji.
Untuk dengan mudah menulis aplikasi berkinerja yang memanfaatkan ekosistem JS, saya sarankan untuk menambahkan dukungan janji dalam fungsi yang diimpor.

Misalnya ini harus berfungsi:

const importObject = { 
  returnOneAsync: () => new Promise(done => done(1)) 
};
extern "C" int returnOneAsync();

int main(){
  int x = returnOneAsync(); // should suspend main until promise resolved.
  return x+x;
}

Komentar yang paling membantu

Saya pikir Anda salah memahami model komputasi web. JavaScript tidak multi-utas, jadi menangguhkan perhitungan akan menghentikan mesin, dan sebenarnya seluruh perender yang menghostingnya. Halaman akan membeku dan tidak ada kode lain yang dapat dijalankan (selain pekerja terpisah). Anda memerlukan cara untuk memperbaiki dan kemudian memulihkan kelanjutan untuk membuat suspensi terbang, yang bukan sesuatu yang bisa dilakukan mesin saat ini.

Semua 7 komentar

Dukungan apa pun dari janji JS harus menjadi bagian dari proposal pengikatan host JS .

Tapi saya khawatir itu tidak mungkin berfungsi seperti yang disarankan oleh contoh Anda, karena itu akan membutuhkan C sendiri untuk memahami eksekusi dan penangguhan async, yang tidak. Juga, tidak ada async dalam contoh Anda, itu hanya membuat janji, sehingga kode yang setara bahkan tidak akan ditangguhkan di JS itu sendiri, tetapi hanya menghasilkan string seperti "[object Promise][object Promise]" .

Juga, tidak ada yang asinkron dalam contoh Anda

Nah, nilainya tidak tersedia sampai eventloop memproses janji.
Idenya adalah untuk menangguhkan eksekusi mesin webassembly sampai nilainya tersedia.
Contoh yang diberikan tentu saja sangat sepele. Contoh yang lebih konkret adalah membuat kueri db melalui jaringan: getAgeOf: (name) => db.find({name}).then(x=>x.age)

C sendiri untuk memahami eksekusi dan penangguhan asinkron, yang tidak

Itu tidak benar. Ada berbagai implementasi coroutine untuk C.
Selanjutnya LLVM-5.0 dan ke atas mendukung coroutine dan async/menunggu.

https://llvm.org/docs/Coroutines.html

Dan sebagai tambahan untuk C++17 ada coroutine-ts yang telah diimplementasikan sejak dentang-5.0.
Ada beberapa perpustakaan eksperimental yang sudah menggunakannya:
https://github.com/lewissbaker/cppcoro#generator

Implementasi coroutine di C tidak secara ajaib bekerja sama dengan loop acara JavaScript. Juga, mereka biasanya mengandalkan perilaku spesifik implementasi. Untuk mengimplementasikan sesuatu seperti coroutine atau async dengan andal dan mudah dibawa, Anda memerlukan bentuk kelanjutan yang dibatasi dalam bahasa tersebut. C terdekat yang ditawarkan adalah longjmp, yang tidak cukup dan saat ini tidak dapat diimplementasikan di Wasm itu sendiri (dengan Emscripten, longjmp diimplementasikan di JS dengan pengecualian JS). Wasm saat ini tidak dapat mengungkapkan penangguhan, meskipun ada rencana untuk menambahkan sesuatu di sepanjang garis ini pada akhirnya. Coroutine C++ belum standar dan tidak dapat ditangani oleh Emscripten AFAICT.

Saya melihat dari mana Anda berasal.
Saya pikir saya belum mengungkapkan ide saya dengan cukup baik.
Saya tidak menyarankan untuk mendukung coroutine atau janji di C/C++ atau menyadari bahwa dalam bytecode wasm.

Tapi saya khawatir itu tidak mungkin berfungsi seperti yang disarankan oleh contoh Anda, karena itu akan membutuhkan C sendiri untuk memahami eksekusi dan penangguhan async, yang tidak

Menurut Anda mengapa C diperlukan untuk memahami eksekusi async?

Apa kesulitan teknis untuk menangguhkan mesin eksekusi wasm sampai janji diselesaikan?

Saya mengerti bahwa wasm seharusnya dikompilasi terlebih dahulu ke x86 tetapi itu tidak berarti Anda tidak memiliki kendali atas aliran eksekusi.
Cara umum untuk menghentikan eksekusi adalah dengan menggunakan interupsi perangkat keras dan panggilan sys seperti ptrace; begitulah cara kerja debugger. Kami tahu persis fungsi mana yang diimpor dan kami dapat menyuntikkan opcode (x86) yang sesuai untuk mencapainya. Meskipun ini akan memperlambat eksekusi fungsi-fungsi tersebut - tidak masalah karena kami menunggu dalam kasus tersebut untuk janji untuk diselesaikan.
Begitulah cara kami mengimplementasikan suspend/debug/resume di C++JIT/AoT berbasis LLVM kami.

Saya kira masalah ini harus diajukan di repositori host-bindings ...

Saya pikir Anda salah memahami model komputasi web. JavaScript tidak multi-utas, jadi menangguhkan perhitungan akan menghentikan mesin, dan sebenarnya seluruh perender yang menghostingnya. Halaman akan membeku dan tidak ada kode lain yang dapat dijalankan (selain pekerja terpisah). Anda memerlukan cara untuk memperbaiki dan kemudian memulihkan kelanjutan untuk membuat suspensi terbang, yang bukan sesuatu yang bisa dilakukan mesin saat ini.

Saya pikir Anda salah memahami model komputasi web. JavaScript tidak multi-utas, jadi menangguhkan perhitungan akan menghentikan mesin, dan sebenarnya seluruh perender yang menghostingnya. Halaman akan membeku dan tidak ada kode lain yang dapat dijalankan (selain pekerja terpisah). Anda memerlukan cara untuk memperbaiki dan kemudian memulihkan kelanjutan untuk membuat suspensi terbang, yang bukan sesuatu yang bisa dilakukan mesin saat ini.

Tepatnya, wasm harus dijalankan di dalam pekerja karena keduanya dibuat untuk tugas komputasi daripada berurusan dengan UI.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

thysultan picture thysultan  ·  4Komentar

Artur-A picture Artur-A  ·  3Komentar

void4 picture void4  ·  5Komentar

beriberikix picture beriberikix  ·  7Komentar

spidoche picture spidoche  ·  4Komentar