Apa perbedaan antara asm.js dan WebAssembly?

101

Saya telah membaca tentang asm.js dan WebAssembly baru-baru ini:

http://ejohn.org/blog/asmjs-javascript-compile-target/

https://brendaneich.com/2015/06/from-asm-js-to-webassembly/

Saya masih bingung tentang beberapa hal:

  1. Apakah kode asm.js dikompilasi dalam waktu dan berjalan? Disusun menjadi apa?
  2. Selain asm.js menjadi teks dan wasm (perakitan web) menjadi biner, apa perbedaan antara keduanya?
  3. Apa artinya ini untuk bahasa skrip lain, yang dijalankan di browser? Ambil python misalnya, apakah itu akan terjadi
    • kode python dikompilasi menjadi wasm? atau
    • interpreter python (Cpython) dikompilasi menjadi wasm dan menafsirkan python?
NeoWang
sumber

Jawaban:

47

Apakah kode asm.js dikompilasi dalam waktu dan berjalan? Disusun menjadi apa?

asm.js adalah kode javascript biasa, dan dikompilasi menjadi bytecode oleh interpreter JS seperti biasa. Namun, interpreter dengan dukungan asm seharusnya melakukan kompilasi sebelumnya, dan mungkin menghasilkan representasi kode yang lebih efisien karena pengetikan statis. Lihat http://asmjs.org/ untuk detailnya.

apa perbedaan antara asm dan wasm (selain teks vs biner)?

Tidak ada, untuk saat ini. wasm seharusnya kompatibel ke belakang, dapat dikompilasi ke asm (yang lagi-lagi dapat dieksekusi sebagai JS normal). Namun, ini dapat diperpanjang dengan lebih banyak fitur di masa mendatang seiring dengan pertumbuhan dukungannya.

Apa artinya ini untuk bahasa skrip lain, yang dijalankan di browser?

Yang terakhir, karena Python masih perlu diinterpretasikan. Bahasa skrip yang tidak membutuhkan penerjemah tentu saja dapat langsung dikompilasi ke (w) asm, mengingat ada kompiler (rantai) yang mendukungnya sebagai target.

Bergi
sumber
Catatan pasangan. Bagian pertama dari jawaban Anda tampaknya agak ambigu; sepertinya Anda mengatakan bahwa asm.js akan mengkompilasi AOT menjadi "bytecode yang lebih efisien". Sebenarnya, implementasi tidak harus menargetkan bytecode, dan pada kenyataannya banyak yang menargetkan ISA native secara langsung dan AOT (yang sebenarnya merupakan intinya). Anda juga mengatakan "compilable to asm and js". Anda mungkin ingin mengklarifikasi bahwa Anda bermaksud mengatakan "perakitan asli" atau semacamnya. Atau mungkin yang Anda maksud "asm.js dan js", tapi itu tidak terlalu membantu karena salah satunya adalah bagian dari yang lain.
mentega
1
@tne: Terima kasih atas umpan baliknya, saya harap saya dapat menyelesaikan masalah ini - silakan (menyarankan) mengedit diri Anda sendiri, saya akan menghargainya. Benar, saya agak lalai pada "bytecode yang lebih efisien" karena saya tidak terbiasa dengan arsitektur kompilasi yang tepat, lagipula ISA hanyalah "kode byte" lain yang ditafsirkan oleh prosesor. Mohon maafkan terminologi yang tidak akurat :-)
Bergi
53

asm.js adalah bagian dari JS dengan instruksi yang "sangat dapat dioptimalkan". Pada dasarnya Anda dapat mendeklarasikan tipe (int, float) dan mesin js (di browser tetapi juga di node.js) akan menjalankan instruksi lebih cepat. Ada manfaatnya jika aplikasi Anda melakukan banyak perhitungan atau grafik jika digunakan bersama dengan WebGL.

perakitan web adalah format biner untuk JS, semua JS, tidak hanya asm.js. Ini bukan bytecode, ini adalah encoding biner dari AST yang dihitung oleh parser. Ini memiliki 2 manfaat besar:

  • mesin JS dapat melewati langkah penguraian
  • itu jauh lebih kompak daripada sumber asli JS

Kita sudah dapat menulis kode untuk browser yang bukan JS: EMSCripten dapat mengkompilasi kode c ++ dalam kode JS. Transcompiler lain sudah tersedia untuk mengkompilasi kode Anda ke dalam JS. Menggunakan asm.js kode itu bisa berjalan lebih cepat ketika melakukan matematika. Menggunakan perakitan web kode tersebut akan lebih kompak dan browser akan dapat memprosesnya lebih cepat (karena akan dapat melewati penguraian). Anda tidak akan memiliki plugin baru untuk dimuat seperti DirectX, JavaApplets, Flash atau Silverlight karena semuanya akan berjalan di kotak pasir JS.

cristian v
sumber
5
Lewati penguraian? Pelan-pelan, disana. Dukungan perangkat keras tidak tersedia untuk masa mendatang. Yang Anda maksud adalah penguraian menjadi hambatan dengan asm.js, dan wasm memperbaikinya dengan format biner yang efisien. Alasan Anda untuk asm.js / wasm tampaknya agak minimalis, tapi tidak apa-apa. Alat peraga untuk menunjukkan bytecode! = AST.
mentega
4
@ Christian, WASM bukanlah format biner untuk JS. Ini akan menggunakan API web yang sama dengan JS, tetapi jauh lebih portabel dan digeneralisasikan daripada JS. Satu-satunya format biner untuk JS, atau bytecode, adalah yang diterapkan di browser, seperti Firefox di sini: developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…
LearningFast
20

Apakah kode asm.js dikompilasi dalam waktu dan berjalan? Disusun menjadi apa?

Browser yang berbeda mengkompilasi kode asm.js dengan cara yang berbeda. Per Agustus 2015:

  • Firefox mengkompilasi asm.js ke kode mesin (dan menyimpan kode mesin tersebut untuk memuat asm.js yang sama di masa mendatang) [ 1 ].
  • Di Windows 10 sebagai flag eksperimental, Edge juga akan melakukan validasi Ahead-of-Time dan kompilasi asm.js [ 2 ].
  • Chrome secara khusus mengenali perintah "use asm" di awal asm.js untuk mengurai dan menganalisis kode dengan lebih bersemangat dan mengubah heuristik kompilasi.
  • Safari tidak melakukan pemrosesan khusus asm.js.

Selain asm.js menjadi teks dan wasm (perakitan web) menjadi biner, apa perbedaan antara keduanya?

asm.js hanyalah JavaScript dan karenanya harus berperilaku persis sesuai dengan spesifikasi JavaScript. Sebagai standar baru, WebAssembly mampu memperbaiki beberapa kasus sudut di mana perilaku JavaScript tidak ideal (dari perspektif kinerja atau kompilasi) [ 3 ]. Di masa mendatang [ 4 ], WebAssembly akan dapat menambahkan fitur-fitur yang akan sulit untuk diekspresikan dalam JavaScript.

Apa artinya ini untuk bahasa skrip lain, yang dijalankan di browser? Ambil python misalnya, apakah itu akan terjadi

  • kode python dikompilasi menjadi wasm? atau
  • interpreter python (Cpython) dikompilasi menjadi wasm dan menafsirkan python?

Di v.1, cara termudah untuk menjalankan Python di browser adalah dengan mengkompilasi interpreter Python ke wasm, seperti yang Anda katakan. Ini berarti, misalnya, Python GC berjalan dalam kode wasm dan secara manual mengelola memori linier wasm. Sudah ada proyek eksperimental untuk menambahkan backend asm.js ke PyPy [ 5 ] (yang juga bisa bekerja dengan baik untuk wasm). Saat ini mengalami keterbatasan asm.js yang dapat diatasi dengan fitur wasm penautan dinamis . Lebih jauh lagi, wasm berupaya menyediakan integrasi GC dan dukungan kompilasi JIT yang keduanya akan memungkinkan integrasi yang lebih efisien dan alami dengan platform Web.

Luke
sumber