Bandingkan asm.js dan NaCl

OK, jadi aku terlambat untuk beberapa bulan asm.js / klien swasta (NaCl) diskusi. Ini normal, karena sebagian besar dari apa yang telah dikatakan sejauh yang membandingkan menakutkan. Jika Anda tidak akrab dengan teknologi apapun, kemudian melihat itu dan ini adalah yang pertama atau posting tidak masuk akal. Dua teknologi bersaing memiliki tujuan yang sama: membawa kode Anda sendiri di Internet. Tapi mereka berdua pendekatan untuk memecahkan masalah ini dengan cara yang berbeda.

Apa masalah dengan jaringan dalam bentuk yang sekarang?

Sejak pertengahan 2000 atau jadi ada upaya besar ini untuk mengambil semua aplikasi legacy dan paste dalam bentuk tag HTML dengan beberapa CSS ringan . Sebuah ide bagus dalam teori, kecuali bahwa, pada kenyataannya, tidak bekerja untuk semua orang jutaan baris aplikasi yang ada C / C ++. Lalu ada aplikasi seperti game dan perkantoran / kantor yang membutuhkan tingkat yang lebih tinggi dari pengguna interaktivitas dan kinerja tentu saja. Kami tidak membahas, Anda dapat melakukan hal-hal menakjubkan dengan JavaScript. Kami hanya mencoba untuk mengatakan bahwa kerja keras hampir selalu datang ke kode mesin dan baterai Theres ada C / C ++, duduk-duduk. Sayangnya, hanya tersedia lingkungan scripting JavaScript di browser Anda. Meskipun mesin JIT dibuat sangat cepat dalam beberapa tahun terakhir, yang lari dari kekuatan C ++ untuk JavaScript masih seperti pemrograman dengan satu tangan terikat di belakang punggungnya. JavaScript tidak memiliki sistem yang cukup mengetik perlu Anda lakukan operasi bit tingkat rendah. Banyak pengampunan, charCodeAt Nha mulai memotong. Mungkin yang paling menyenangkan solusi untuk masalah ini adalah array diketik JavaScript. Yang tidak hanya memungkinkan Anda untuk memuat kernel Linux di browser Anda, tetapi juga kerajinan tumpukan tepat biaya feng shui yang sangat jelek dengan jalur reguler. Sayangnya, mengetik array hanya membawa Anda sejauh ini, karena pada akhirnya, Anda masih menulis JavaScript, dan yang tidak menyenangkan. Harus ada cara yang lebih baik untuk melakukan hal ini …

Apa asm.js?

Ini adalah mesin virtual untuk mengkompilasi C / C ++ program dalam bahasa JavaScript, dan kemudian menjalankannya pada browser. Proses ini dilakukan dengan menggunakan llvm untuk menyertakan C / C ++ kode llvm, yang merupakan sedikit kode, dan kemudian diumpankan ke Mozilla Emscripten, yang membuat JavaScript. Jika browser adalah spesifikasi asm.js (bagian yang ketat dari JavaScript), itu bisa mendapatkan keuntungan dari beberapa kompilasi AOT yang akan mengoptimalkan kode mesin yang dihasilkan. Naik satu bahasa ke bahasa lain tidak baru, telah dilakukan berkali-kali sebelumnya. Karena banyak bahasa yang berbeda dapat dikompilasi ke masa kecil kode LLVM, memiliki banyak kasus penggunaan potensi asm.js.

Setiap Selain asm.js hidup di dalam mesin virtual sendiri, semua tata letak memori virtual yang terkandung dalam array JavaScript masuk. asm.js spesifikasi teknis bagian dari JavaScript, yang berarti non-JavaScript, maka Anda harus menyimpannya secara eksplisit untuk memperoleh manfaat (lihat di atas). Asm.js memiliki sintaks yang dapat Anda baca / tulis sebagai manusia, bukan bytecode, dan sangat dekat dengan JavaScript. asm.js keuntungan yang sudah ada interpreter JavaScript cepat. Hanya bekerja “dan hari ini, itu hanya akan mendapatkan keuntungan dari AOT kompilasi, sedangkan juru JavaScript yang mendukung menganalisis asm.js sintaks beton … bahwa hanya Firefox mendukung setiap malam sekarang …

salah satu hal utama adalah bagian dari JavaScript tidak untuk Anda menghapus persyaratan JavaScript JIT digunakan untuk generasi kode, yang bekerja pada data yang bisa mengubah jenis setiap saat. Jika Anda JavaScript Browser JIT compiler mencari sepotong JavaScript kode seperti ini. ..

 untuk (var b, c) {var /> 
}

satu ( 'BAT', 'OK');
yang (1,2);

… LT tidak tahu jenis yang atau C variabel metode. untuk memecahkan masalah ini, untuk menghasilkan kode untuk a , yang dapat bekerja dengan string, integer dan jenis lain yang didukung oleh mesin, yang dapat memanfaatkan + operator. peramban kembali berakhir Anda harus menjaga variabel ini seperti yang ditunjukkan oleh struktur data yang menunjukkan jenis. Aku bicara secara umum di sini, rincian pelaksanaan berbagai EIC akan berubah. Tapi Anda mungkin bisa melihat bagaimana memperlambat segalanya, tetapi merupakan kebutuhan untuk menciptakan kode Anda sendiri untuk bahasa dinamis diketik seperti JavaScript. Dalam asm.js beberapa pembatasan ini akan diangkat, karena berhubungan dengan kode C / C ++ yang tidak mendukung tipe dinamis, seperti JavaScript tidak. Ketika Anda mendeklarasikan int yang int . Tentu saja, jika Anda tidak bermain dalam beberapa cara lain, tetapi kasus-kasus ini biasanya jelas dan compiler tahu tentang mereka sebelumnya. Jika Anda tertarik untuk bagian-bagian mesin JIT dan bagaimana mereka menangani hal semacam ini, saya sarankan blog ini.

Anda mungkin telah menebak bahwa program seperti permainan yang kompleks dan memiliki komponen visual, yang biasanya dilakukan pada GPU. Untuk melakukan hal ini, kita harus WebGL. Tapi kemudian ada audio, jaringan, akses ke file dan benang. Tampaknya solusi untuk masalah ini akan membutuhkan beberapa API berat dan sangat kaya …

Apa Native Client (NaCl)?

Kami berbicara tentang banyak NaCl di blog ini, tapi ini adalah karena pendekatan baru untuk masalah yang sangat sulit, yaitu, kinerja kode asli dalam memori aman x86 arsitektur suka. Ada reinvention lain deteksi kode berbahaya, pendekatan yang unik untuk kotak sampah semua kode, sementara memberikan mereka akses ke CPU baku. The NaCl tidak mengubah kode yang ada, menerima langsung instruksi x86 / x86_64 / ARM dari Internet, memeriksa mereka dan mengeksekusi mereka. Ini adalah perbedaan mendasar antara asm.js NaCl. Yang pertama mengambil C / C ++ dan mengubahnya menjadi JavaScript, yang dilewatkan melalui mesin JIT, indikasi bahwa ia melakukan sendiri seperti yang Anda menyediakan mereka di browser Anda.

Tentu saja ada beberapa kompromi, seperti proses perakitan sedikit rumit, tapi Google pergi keluar dari jalan mereka untuk menghilangkan rasa sakit. Portabel Native Client (PNaCl) mengambil langkah lebih lanjut dan memungkinkan pengembang untuk memuat sedikit kode ke aplikasi Anda, yang PNaCl disusun untuk musim panas untuk arsitektur tertentu. Dalam hal ini, tampaknya PNaCl asm.js sedikit lebih dekat ke permukaan model, tetapi di bawah itu benar-benar berbeda arsitektur. Kode PNaCl melakukan ada di kotak pasir, dan harus mematuhi aturan ketat yang diberlakukan NaCl.

NaCl juga menyediakan API yang kaya dan melalui PPAPI untuk melakukan pekerjaan berat, grafis, audio dan sungai. Kami tidak akan menutupi arsitektur NaCl sangat mendalam di sini, untuk melihat posting lama kami blog untuk itu. Sebaliknya, kita beralih ke perbandingan keamanan NaCl dan asm.js

Apa manfaat / keamanan trade-off yang masuk?

Setiap baris baru dari kode menambahkan serangan permukaan, dua komponen ini tidak berbeda. Sejak asm.js adalah bagian yang ketat dari kode analyzer JavaScript akan baru untuk melihat. asm.js sifat operasi masih harus dilihat bagaimana hanya di Firefox di malam hari sekarang. Pertama saya kira adalah halaman JIT mencakup ekstensi Firefox tidak mungkin. Saya juga yakin bahwa Anda dapat menggunakannya untuk menurunkan, jika tidak benar-benar diatasi, ASLR. Dalam kami peran serangan JIT Yang Ivnitskiy 2011, saya membahas menggunakan JavaScript untuk mempengaruhi output mesin JIT untuk memasukkan urutan tertentu kode ROP ke dalam memori executable. Saya menduga bahwa kebanyakan pipa JIT digunakan untuk mengkonversi kode asm.js ke dalam kode mesin akan membuat proses lebih mudah di beberapa titik, tapi saya tidak memiliki data untuk membuktikannya sekarang.

Pendekatan mengambil bahasa unmanaged, seperti C / C ++ dan mengubahnya menjadi manajemen dan memastikan memori memecahkan masalah korupsi dalam memori khusus ini bagian dari kode. Jadi jika beberapa C ++ kode awalnya berisi buffer overflow, setelah konversi dan bekerja di asm.js Anda memiliki akses ke jenis JavaScript yang berasal dari pengendalian internal pada saat dijalankan untuk menghindari masalah tersebut. Daripada harus merekam ulang beberapa informasi penting yang akan Anda melemparkan sebuah pengecualian, dan browser akan terus seolah-olah tidak ada yang terjadi. Sebagai titik sisi, mungkin menarik untuk menulis instrumen Asan-seperti dengan asm.js, hasil tes dan kode rambut C / C ++ di browser dengan runtime JavaScript sebagai alat.

NaCl menawarkan lebih dari sekedar hasil bahwa kode C yang ada / C ++ di browser Anda. NaCl memiliki sandbox aplikasi unik, yang dapat digunakan di banyak tempat lain. NaCl statis memeriksa semua kode sebelum dieksekusi. Pemeriksaan ini memastikan bahwa unit dapat dijalankan hanya kode yang menganut satu set ketat aturan. persyaratan ini, sebagai modul NaCl memiliki akses penuh ke prosesor dan dapat melakukan lebih dari program JavaScript saat ini dapat menggunakan antarmuka PPAPI di Chrome. Persyaratan validasi ini dan kode streaming memiliki kinerja di atas kepala, tetapi tidak cukup sehingga membuat aplikasi tidak dapat digunakan besar.

Aku masih berpikir kita akan melihat NaCl pada Android, satu hari, sebagai cara untuk bersaing dengan kode penandatanganan IOS. NaCl adalah DAS untuk plug-in, yang saya percaya itu akan mempengaruhi proyek sandbox untuk terus maju. Jika Anda mengembangkan sandbox untuk aplikasi Anda hari ini, Anda harus membaca dokumen proyek Anda kemarin.

asm.js sandbox tidak menyediakan, atau tingkat keamanan tambahan dalam hal ini. Itu hanya yang mengkompilasi satu set alat untuk bahasa asli di bagian JavaScript. didasarkan pada memori aman dari mesin virtual yang disediakan oleh interpreter JavaScript yang ada yang berisi kode. Kita semua tahu seberapa baik yang bekerja. Tentu saja, saya tidak berbalik sini Mozilla tanpa sandbox browser target yang mudah. Tapi di mana perbedaan utama antara asm.js dan NaCl menjadi jelas. Asm.js tidak pernah dimaksudkan untuk meningkatkan keamanan Firefox, hanya membawa kode C ++ / C untuk sebagian besar platform berbasis web yang ada. NaCl akan melakukannya juga, tetapi juga meningkatkan keamanan Chrome, yang berisi semua plug-in di dua kotak pasir. Saya percaya bahwa jika itu perlu untuk mengambil sebagai plug-in Adobe Flash Player dan port untuk asm.js keuntungan dari keamanan untuk pengguna Firefox, namun pada akhirnya mereka masih tanpa sandbox sekitar mereka dan mesin JavaScript mungkin membayar kinerja yang baik untuknya, juga.

Kesimpulan

asm.js masih dalam pengembangan berat, maka NaCl / PNaCl, tetapi yang terakhir sedikit lebih dewasa saat ini diberikan tujuannya end. Untuk menjalankan asm.js yang ada / C ++ program di perpustakaan bahasa C dan Anda akan harus menyediakan API yang komprehensif, yang membuatnya jauh lebih banyak daripada interpreter yang ada JavaScript menyediakan. NaCl sudah saat ini menawarkan ini bersama dengan kinerja yang lebih baik dan konstruksi lebih kuat dari sandbox. Jika Mozilla ingin mendapatkan serius tentang menjalankan semua kode yang tidak dipercaya dari Internet pada juru JavaScript Anda, itu akan membutuhkan sandbox benar secepat mungkin.

Akhirnya, ketika masa depan mengkompilasi ulang semua JavaScript untuk masa depan jelek.

Update 03/06/13: Tetap beberapa teks ambigu, dipahami asm.js bekerja hanya di Firefox. Lihat detail di atas

Leave a Reply

Name *
Email *
Website