Bandingkan asm.js dan NaCl

OK, jadi saya memiliki beberapa bulan kemudian untuk asm.js / Native Client (NaCl) debat. Ini normal, karena sebagian besar dari apa yang telah dikatakan sejauh ini, yang membandingkan buruk. Jika Anda tidak akrab dengan teknologi, jadi saya melihatnya dan ini adalah pertama atau posting tidak masuk akal. Dua teknologi bersaing memiliki tujuan yang sama: untuk membawa kode asli di Internet. Tapi kedua solusi mengatasi masalah ini dalam beberapa cara.

Apa yang salah dengan internet dalam bentuk yang sekarang?

Sejak pertengahan 2000-an atau lebih, telah menjadi upaya besar untuk membawa semua aplikasi warisan ini dan mendorong mereka ke HTML- Formulir tag dengan CSS polos. Sebuah ide bagus dalam teori, tapi itu tidak benar-benar bekerja untuk semua orang jutaan aplikasi garis yang ada dari C / C ++. Lalu Theres aplikasi seperti game dan suite kantor / kinerja, yang membutuhkan tingkat yang lebih tinggi dari interaktivitas dan kinerja tentu saja. Kami tidak mengatakan Anda tidak dapat melakukan hal-hal menakjubkan dengan JavaScript. Kami hanya berusaha untuk mengatakan bahwa berat hampir selalu datang ke kode asli dan Theresa baterai yang ada C / C ++, duduk-duduk. Sayangnya, tersedia scripting lingkungan hanya di browser Anda JavaScript. Meskipun mesin JIT menjadi sangat cepat dalam beberapa tahun terakhir, yang dijalankan dari C ++ JavaScript daya properti, seperti pemrograman dengan satu tangan terikat di belakang punggungnya. JavaScript tidak memiliki cukup mengetik perlu Anda lakukan operasi-bit tingkat rendah. Banyak alasan, <> charCodeAt tidak mulai memotong. Mungkin yang paling menyenangkan solusi untuk masalah ini adalah Java-script untuk menambah berat badan. Yang tidak hanya memungkinkan Anda untuk memuat kernel Linux di browser Anda, tetapi juga memberikan yang jelas banyak muatan Feng Shui yang jalur reguler sangat jelek. Sayangnya, setelah Anda telah mengetik array sejauh ini, karena pada akhirnya Anda masih menulis JavaScript, dan bukan sembarang kesenangan. Harus ada cara yang lebih baik untuk melakukan hal ini …

Apa asm.js?

Ini adalah mesin virtual yang memungkinkan Anda untuk mengkompilasi / C ++ program dalam C untuk JavaScript dan menjalankannya di browser. Proses ini dilakukan dengan menggunakan llvm untuk memasukkan C / C ++ kode dalam kode bit llvm yang kemudian ditransmisikan ke Mozilla Emscripten, yang ternyata dalam JavaScript. Jika browser berikut spesifikasi asm.js (bagian ketat JavaScript), Anda bisa mendapatkan keuntungan dari beberapa kompilasi AOT yang akan mengoptimalkan kode mesin yang dihasilkan. Kompilasi satu bahasa ke bahasa lain tidak baru, telah dilakukan berkali-kali sebelumnya. Karena banyak bahasa yang berbeda dapat dikompilasi ke LLVM kode masa menggigit banyak potensi kasus penggunaan untuk asm.js.

Setiap aplikasi asm.js kehidupan di mesin virtual sendiri, tata letak memori virtual seluruh terkandung dalam JavaScript diketik array. Asm.js spesifikasi teknis subset dari JavaScript, yang berarti non-JavaScript, sehingga Anda harus secara eksplisit mendukung Anda untuk mendapatkan manfaat (Lihat di atas.) Asm.js telah sintaks dapat membaca / menulis sebagai manusia, dia Hal ini tidak kode byte, dan sangat dekat dengan JavaScript. Keuntungannya adalah bahwa interpreter cepat asm.js JavaScript sudah ada. Ini hanya bekerja “hari ini, tapi akan mendapatkan keuntungan dari kompilasi AOT, karena penerjemah JavaScript Anda mendukung sintaks analisis asm.js tertentu … bahwa hanya Firefox mendukung malam sekarang …

A hal utama adalah subset dari JavaScript lakukan untuk Anda menghilangkan kebutuhan untuk penggunaan JavaScript JIT untuk menghasilkan kode yang bekerja dengan data yang bisa mengubah jenis setiap saat. Jika browser Anda JavaScript JIT compiler-pandangannya di sepotong kode, JavaScript, karena …

 Fungsi (Var Var akan C) {
inverse B + C;
}

('Watts', 'OK');
(1,2);

… JIT-jenis tidak tahu adalah dan a variabel. Cara untuk mengatasi ini adalah untuk menghasilkan kode untuk fungsi E , yang dapat bekerja dengan string, angka dan jenis lain yang didukung oleh mesin, yang dapat menggunakan + operator. Pada bagian belakang browser harus menyimpan variabel-variabel ini seperti yang ditunjukkan oleh struktur data yang menunjukkan jenis. Saya berbicara secara umum di sini, rincian pelaksanaan berbagai JIT juga akan berubah. Tapi Anda mungkin bisa melihat bagaimana memperlambat segalanya, tapi merupakan persyaratan dalam membentuk kode Anda sendiri untuk secara dinamis mengetik bahasa seperti JavaScript. Dalam asm.js beberapa pembatasan ini akan dihapus, karena itu ada hubungannya dengan kode C / C ++ yang tidak mendukung jenis dinamis sebagai JavaScript, tidak. Jika Anda menyatakan int nya int . Tentu saja, jika Anda tidak merilisnya sebagai sesuatu yang lain, tetapi kasus ini biasanya jelas, dan compiler tahu tentang mereka di muka. Jika Anda tertarik secara detail mesin dan JIT, karena mereka harus berurusan dengan hal semacam ini, saya sarankan blog ini.

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

Apa Native Client (NaCl),?

Kami berbicara tentang banyak NaCl dalam blog ini, tapi itu karena pendekatan baru untuk masalah yang sangat sulit, yaitu kinerja kode asli dalam memori aman x86 suka. Ini adalah reinterpretasi lain deteksi kode berbahaya, pendekatan unik mereka ke sandbox semua kode pada saat yang sama memberikan Anda akses ke prosesor baku. NaCl Nha mengkonversi 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. Pertama gelombang C / C ++ dan mengubahnya menjadi JavaScript, yang ditempatkan melalui mesin JIT, yang terakhir melaksanakan instruksi sendiri pada bagaimana Anda sekarang mereka dalam browser.

Tentu saja ada beberapa kompromi, seperti proses perakitan sedikit rumit, tapi Google telah pergi keluar dari cara untuk meringankan rasa sakit. Portabel Native Client (PNaCl) mengambil langkah lebih lanjut dan memungkinkan pengembang untuk memuat sedikit kode untuk aplikasi Anda, yang disusun pada musim panas PNaCl untuk arsitektur tertentu. Dalam hal ini, tampaknya, PNaCl pola asm.js sedikit lebih dekat di permukaan, tetapi dengan arsitektur yang sama sekali berbeda. Kode PNaCl memproduksi ada di kotak pasir, dan harus mematuhi aturan ketat yang diberlakukan NaCl.

NaCl juga menawarkan API yang luas dan kaya melalui PPAPI untuk melakukan grafis berat, audio dan kabel. Kami tidak akan menutupi arsitektur NaCl sangat mendalam di sini untuk melihat posting blog lama kita untuk ini. Sebaliknya, kita akan pindah ke keamanan kami dari NaCl dan asm.js

Apa yang manfaat / keuntungan dan kerugian keamanan memasuki

Setiap baris baru kode? menambahkan serangan, dua komponen ini tidak berbeda. Jadi asm.js bagian ketat kode JavaScript analyzer adalah tampilan baru. Karakteristik kinerja asm.js masih harus dilihat bagaimana hal ini hanya di Firefox malam sekarang. Tebakan pertama saya adalah yang membuat distribusi JIT-halaman topi pada Firefox mustahil. Saya juga yakin bahwa Anda dapat menggunakannya untuk menurunkan, jika tidak menang, ASLR. Pada tahun 2011 serangan kami JIT Ivnitskiy Yang kertas dan saya membahas penggunaan JavaScript, untuk mempengaruhi output mesin JIT untuk memasukkan urutan tertentu kode ROP ke dalam memori eksekusi. 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 sebagai unmanaged C / C ++ dan mengubahnya menjadi perangkat penyimpanan dikendalikan dan aman memecahkan masalah korupsi di memori khusus ini bagian dari kode. Jadi bagaimana jika beberapa C ++ kode, awalnya terdapat buffer overflow ketika dikonversi dan bekerja di asm.js Anda mengakses jenis JavaScript, dipasok dari kontrol internal di runtime untuk menghindari masalah tersebut. Alih-alih menulis ulang beberapa data penting yang akan Anda melempar pengecualian, dan browser akan terus seolah-olah tidak ada yang terjadi. Sebagai titik sisi, mungkin menyenangkan untuk menulis Asan, asm.js sebagai alat, yang memeriksa rambut dan C C / ++ kode di browser menggunakan JavaScript runtime sebagai alat ukur.

NaCl menawarkan lebih dari sekedar mentransfer C / C ++ kode yang ada pada browser Anda. NaCl memiliki sandbox aplikasi unik, yang dapat digunakan di banyak tempat lain. NaCl statis memeriksa semua kode sebelum eksekusi. Pemeriksaan ini memastikan bahwa modul hanya dapat mengeksekusi kode yang menganut satu set ketat aturan. Persyaratan ini karena modul NaCl memiliki akses penuh ke prosesor dan dapat melakukan lebih dari program saat menggunakan JavaScript dapat antarmuka PPAPI di Chrome. Inspeksi dan kode ini persyaratan harus mengurangi kapasitas aliran, tetapi tidak cukup sehingga membuat aplikasi besar tidak dapat digunakan.

Aku masih berpikir kita akan melihat Android NaCl selama sehari, sebagai cara untuk bersaing dengan iOS kode penandatanganan. NaCl adalah DAS untuk plug-in, yang saya percaya akan mempengaruhi sandbox proyek pergi ke depan. Jika Anda mengembangkan sandbox untuk aplikasi Anda hari ini, Anda harus membaca dokumen desain Anda kemarin.

asm.js tidak menyediakan sandbox, atau lapisan tambahan keamanan tentang masalah ini. Ini hanya satu set alat, yang mengkompilasi bahasa sumber pada JavaScript subkelompok. Hal ini bergantung pada mesin penyimpanan yang aman virtual yang disediakan oleh penerjemah ini JavaScript mengandung kode. Kita semua tahu seberapa baik yang bekerja. Tentu saja, saya tidak menemukan kesalahan di sini tanpa browser Mozilla sandbox adalah sasaran empuk. Tapi di situlah perbedaan utama antara asm.js dan NaCl menjadi jelas. Asm.js tidak dimaksudkan untuk meningkatkan Firefox keamanan, dan membawa C / C ++ kode yang ada di sebagian besar platform berbasis web. NaCl akan melakukannya dengan baik, tetapi juga meningkatkan keamanan Chrome isi semua plug-in di dua kotak pasir. Saya pikir jika itu perlu untuk mengambil sebagai plug-in Adobe Flash Player dan port untuk asm.js keuntungan ini untuk menjamin keamanan pengguna Firefox, tetapi pada akhirnya mereka masih tanpa sandbox sekitar mesin JavaScript dan mungkin membayar hukuman kinerja untuk dia juga.

Temuan

asm.js masih dalam pengembangan berat, maka NaCl / PNaCl, tapi sedikit lebih dewasa sekarang diberikan gol kedua terakhirnya. Asm.js untuk menjalankan program yang ada di C / C ++ perpustakaan, dan ia harus menyediakan API yang luas, sehingga jauh lebih dari interpreter JavaScript yang ada memberikan. NaCl sudah saat ini menawarkan ini bersama dengan produktivitas yang lebih tinggi dan desain sandbox kuat. Jika Mozilla ingin mendapatkan serius tentang menjalankan semua kode yang tidak dipercaya dari internet ke juru JavaScript Anda, dia perlu sandbox nyata sesegera mungkin.

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

Update 03/06/13: Tetap beberapa teks ambigu yang dimaksudkan asm.js hanya bekerja di Firefox. Lihat di atas untuk rincian


Leave a Reply

Name *
Email *
Website