Apa itu ASM.js dan apa artinya bagi semua orang?

27

Aku mulai mendengar kabar burung tentang proyek ini disebut ASM.js . Saat ini situs web mereka mengerikan dan membingungkan. Inilah yang saya tahu dari penelitian saya di web.

  • Ini adalah himpunan bagian dari JavaScript yang dapat sangat dioptimalkan. Saya menduga karena itu menghindari bagian yang lebih dinamis dari bahasa.
  • Kinerja kode yang dikompilasi ke ASM.js berjalan sekitar setengah kecepatan C (bukan cahaya).
  • Tujuannya adalah agar kompiler membuat ASM bahasa target mereka.
  • Firefox akan dikirim dengan optimasi ASM.js yang dibuat.
  • Tim Mozilla dan Unreal mem-porting Mesin Unreal ke web dengan itu dan berjalan dalam membangun Firefox pada kecepatan hampir asli.

Ada tampaknya tidak ada informasi konkret apapun pada web tentang apa ini benar-benar adalah atau kegunaan atau tujuan akhir. Apakah saya bisa mengkompilasi basis kode sisi server saya yang lain dan menjalankannya di browser dengan kecepatan mendekati asli? Apa akibatnya bagi pengembang?

Jarrod Nettles
sumber

Jawaban:

21

Anda sudah dijelaskan apa yang . Penggunaannya adalah bahasa tingkat rendah yang bekerja di semua browser, cukup cepat di sebagian besar dan sangat cepat di beberapa browser . Apa yang Anda dapatkan dari ini sama terbuka dengan apa yang Anda lakukan dengan bahasa pemrograman lain.

Kasus penggunaan Mozilla tampaknya paling tertarik adalah ini: Sudah ada cara mengkompilasi bahasa dengan backend LLVM (yang paling jelas C dan C ++) ke JavaScript, melalui Emscripten. asm.js sangat dekat dengan Emscripten yang sudah dipancarkan, jadi ini memungkinkan kode Emscripten (yang sudah sangat cepat pada kompiler JIT JavaScript hari ini) menjadi lebih cepat, memajukan tujuan porting basis kode yang ada ke web. Sekali lagi, untuk apa tepatnya Anda menggunakan ini adalah keputusan Anda. Porting game adalah salah satu kasus penggunaan (yang tampaknya melibatkan Mozilla aktif), tetapi ada banyak hal yang ditulis dalam C dan C ++, beberapa di antaranya mungkin berguna untuk situs web seseorang. Beberapa yang pernah kulihat melayang-layang (ditambah beberapa rancanganku sendiri), tanpa jaminan tentang kemungkinan:

  • Porting algoritma tujuan umum (mis. Zlib, libjpeg, openssl, implementasi FFT) untuk memberdayakan JavaScript / situs web untuk melakukan lebih banyak, tanpa harus membuat standar web baru dan bergantung pada masing-masing browser untuk mengimplementasikannya.
  • Porting interpreter, sehingga bahasa selain JavaScript dapat berjalan di browser, dengan sedikit overhead dan upaya porting yang minimal.
  • Menggunakan asm.js sebagai backend untuk lebih banyak kompiler, terutama yang tidak memetakan dengan baik ke JavaScript dan tidak memerlukan sebagian besar fitur dan overhead-nya. Contohnya bisa bahasa yang dirancang untuk pekerjaan numerik cepat tanpa alokasi memori.
  • Menggunakan asm.js untuk membuat JIT dalam JavaScript. Ini dapat mengimplementasikan bahasa apa saja - misalnya ActionScript .
  • Dalam nada yang sama, porting kompiler JIT yang ada untuk dijalankan di browser (lih. Porting interpreter, dengan efektif nil overhead di atas JS). Ini mungkin hanya layak ketika kompiler JIT dihasilkan secara otomatis, seperti pada PyPy.

sumber
2
Berikut ini penjelasan lain yang bagus: ejohn.org/blog/asmjs-javascript-compile-target
Jarrod Nettles
1
Inilah bukti konsep untuk memindahkan JIT ke asm.js. Ini adalah nilai jual yang unik, sebagian besar platform yang muncul tidak ramah terhadap JIT.
Tobu
Apakah ada penjelasan di suatu tempat tentang bagaimana asm.js mendukung kompilasi JIT? Tampaknya tidak dapat menemukan info tentang itu. Paling tertarik dengan bagaimana implikasi keamanan ditangani.
Roman Starkov
@romkyns kompilasi JIT dari asm.js ke kode mesin oleh browser, atau kompilasi JIT ke asm.js (oleh program JavaScript)? Untuk yang pertama, setidaknya di Firefox, fasilitas pembuatan kode mesin dari kompiler JIT murni JS digunakan kembali. Karena asm.js hanya bisa memanggil JS, melakukan aritmatika, dan membaca / menulis array heap dengan index-in-range memeriksa keamanan sama baiknya dengan keamanan eksekusi JS. Untuk yang terakhir, Anda hanya menghasilkan kode sumber asm.js dan biarkan browser menjalankannya, dan tidak ada implikasi keamanan tambahan di luar apa yang saya sebutkan sebelumnya.
(Maksud saya yang terakhir) Ooh tentu saja; entah bagaimana saya membayangkan kompiler JIT memancarkan kode mesin asli. Terimakasih atas klarifikasinya!
Roman Starkov
4

Bayangkan ASM.js sebagai biner besar ArrayBuffer disebut heap dan satu set modul JavaScript, yang dimulai dengan arahan prolog: "use asm";dan melakukan operasi tingkat rendah cepat pada data biner mentah, mirip dengan bahasa assembly. Modul-modul itu dapat ditulis dengan tangan atau dikompilasi dengan lebih baik dari kode LLVM dengan skrip seperti Emscripten. Performa mereka dapat ditingkatkan berkat mesin Mozilla OdinMonkey, tetapi mereka kompatibel dengan sebagian besar penerjemah ECMAScript modern.

ASM.js tidak terbatas pada game, Anda bahkan dapat menjalankan seluruh aplikasi Qt di browser Anda, seperti ini !

niutech
sumber