Mengenai tajuk artikel ini, saya tidak fikir orang yang menulis atau membaca artikel ini adalah bodoh. Tetapi kadangkala topik membuatkan anda berasa seperti orang bodoh, dan enjin JavaScript adalah salah satu daripada topik itu, sekurang-kurangnya bagi saya.
Kadangkala menulis kod untuk aplikasi web terasa seperti sihir kerana kami hanya menulis satu siri aksara dan melihat kesannya dalam penyemak imbas. Tetapi memahami teknologi di sebalik keajaiban boleh membantu anda meningkatkan kemahiran pengaturcaraan anda dengan lebih baik. Sekurang-kurangnya anda akan berasa kurang seperti orang bodoh apabila cuba menerangkan perkara yang berlaku di sebalik tabir dalam web atau apl mudah alih berkuasa JavaScript.
Bertahun-tahun yang lalu, semasa saya menjadi pensyarah siswazah, saya mengadu kepada seorang profesor bahawa saya masih belum menguasai mata tatabahasa Perancis yang sangat sukar yang boleh saya ajar kepada pelajar sarjana saya. Saya masih ingat apa yang dia katakan pada masa itu: "Kadang-kadang satu-satunya cara untuk mempelajari sesuatu adalah dengan mengajarnya."
Cuba terangkan kepada jurutera cara NativeScript berfungsi di belakang tabir melalui enjin JavaScript, menyambung dan memanggil API asli pada masa jalan - mudah tersesat apabila berhadapan dengan tugas yang begitu kompleks. Malah, mana-mana pembangun JavaScript harus ingin tahu tentang enjin yang mendasari teknologi yang kami gunakan setiap hari. Sekarang mari kita lihat dengan lebih dekat apa yang sebenarnya dilakukan oleh enjin JavaScript, mengapa platform yang berbeza menggunakan enjin yang berbeza, bagaimana ia telah berkembang selama bertahun-tahun, dan mengapa sebagai pembangun kita harus mengambil berat.
Pertama, beberapa istilah profesional
"Enjin JavaScript" sering dirujuk sebagai mesin maya. "Mesin maya" merujuk kepada emulator yang dipacu perisian bagi sistem komputer tertentu. Terdapat banyak jenis mesin maya, yang dikelaskan mengikut ketepatan mereka mensimulasikan atau menggantikan mesin fizikal sebenar.Sebagai contoh, "Mesin Maya Sistem" menyediakan platform emulasi lengkap yang boleh menjalankan sistem pengendalian. Parallels, yang biasa digunakan oleh pengguna Mac, ialah mesin maya yang membolehkan anda menjalankan sistem Windows pada Mac anda.
Sebaliknya, "mesin maya proses" tidak mempunyai semua fungsi dan boleh menjalankan program atau proses. Wine ialah mesin maya proses yang membolehkan anda menjalankan aplikasi Windows pada mesin Linux, tetapi tidak menyediakan sistem pengendalian Windows yang lengkap di Linux.
Mesin maya JavaScript ialah mesin maya proses yang direka khusus untuk mentafsir dan melaksanakan kod JavaScript.
Nota: Adalah penting untuk membezakan antara enjin susun atur, yang meletakkan susun atur halaman dalam penyemak imbas, dan enjin JavaScript asas, yang mentafsir dan melaksanakan kod. Penjelasan yang baik boleh didapati di sini.
Jadi, sebenarnya, apakah enjin JavaScript dan apakah fungsinya?
Tugas asas enjin JavaScript adalah untuk menukar kod JavaScript yang ditulis oleh pembangun kepada kod yang cekap dan dioptimumkan yang boleh ditafsirkan oleh penyemak imbas atau dibenamkan ke dalam aplikasi. Malah, JavaScriptCore memanggil dirinya sebagai "mesin maya yang dioptimumkan."Untuk menjadi lebih tepat, setiap enjin JavaScript melaksanakan versi ECMAScript, yang mana JavaScript adalah garpu. Memandangkan ECMAScript terus berkembang, enjin JavaScript terus bertambah baik. Sebab terdapat begitu banyak enjin yang berbeza adalah kerana setiap daripadanya direka untuk dijalankan dalam pelayar web yang berbeza, penyemak imbas tanpa kepala atau persekitaran masa jalan seperti Node.js.
Anda mungkin biasa dengan pelayar web, tetapi apakah pelayar tanpa kepala? Ia adalah pelayar web tanpa antara muka pengguna grafik. Ia berguna apabila mengautomasikan ujian produk web. Contoh yang bagus ialah PhantomJS. Jadi apakah kaitan Node.js dengan enjin JavaScript? Node.js ialah rangka kerja terdorong peristiwa tak segerak yang membolehkan anda menggunakan JavaScript pada bahagian pelayan. Memandangkan ia adalah alat yang menggerakkan JavaScript, ia juga dikuasakan oleh enjin JavaScript.
Mengikut takrifan mesin maya di atas, mudah difahami bahawa enjin JavaScript dipanggil mesin maya proses, kerana tujuannya hanya untuk membaca dan menyusun kod JavaScript. Itu tidak bermakna ia hanya enjin yang mudah. Contohnya, JavaScriptCore mempunyai enam "blok binaan" yang boleh menganalisis, mentafsir, mengoptimumkan dan mengumpul sampah kod JavaScript.
Bagaimana ia berfungsi?
Sudah tentu, ini bergantung pada enjin. Dua enjin utama yang menarik perhatian kami ialah JavaScriptCore WebKit dan enjin V8 Google, yang kedua-duanya memanfaatkan NativeScript. Kedua-dua enjin memproses kod dengan cara yang berbeza.
JavaScriptCore melaksanakan satu siri langkah untuk mentafsir dan mengoptimumkan skrip:
Ia melakukan analisis leksikal, iaitu memecahkan kod sumber kepada satu siri simbol atau rentetan dengan maksud yang jelas.
Simbol-simbol ini kemudiannya dianalisis menggunakan penganalisis sintaks untuk membina pepohon sintaks.
Kemudian empat proses JIT (Just-In-Time) mula mengambil bahagian, menganalisis dan melaksanakan bytecode yang dijana oleh parser.
apa? Ringkasnya, enjin JavaScript memuatkan kod sumber anda, memecahkannya kepada rentetan (juga dipanggil tokenisasi), menukar rentetan ini kepada kod bait yang boleh difahami oleh pengkompil, dan kemudian melaksanakan kod bait ini.
Enjin V8 Google ditulis dalam C dan juga boleh menyusun dan melaksanakan kod sumber JavaScript, mengendalikan peruntukan memori dan pengumpulan sampah. Ia direka bentuk untuk terdiri daripada dua penyusun, yang boleh menyusun kod sumber secara langsung ke dalam kod mesin:
Kod penuh: pengkompil pantas yang mengeluarkan kod yang tidak dioptimumkan
Crankshaft: Pengkompil perlahan yang mengeluarkan kod yang cekap dan dioptimumkan
Jika Crankshaft menentukan bahawa kod yang memerlukan pengoptimuman adalah kod tidak dioptimumkan yang dijana oleh Full-codegen, ia akan menggantikan Full-codegen, satu proses yang dipanggil "crankshafting".
Setelah kod mesin dijana semasa proses penyusunan, enjin akan mendedahkan kepada penyemak imbas semua jenis data, pengendali, objek, fungsi yang dinyatakan dalam piawai ECMA atau apa-apa sahaja yang perlu digunakan pada masa jalan, seperti yang berlaku dengan NativeScript.
Apakah enjin JavaScript yang ada?
Terdapat pelbagai jenis enjin JavaScript yang boleh digunakan untuk mentafsir, menganalisis dan melaksanakan kod pihak pelanggan anda. Apabila setiap versi penyemak imbas dikeluarkan, enjin JavaScriptnya mungkin ditukar atau dioptimumkan untuk mengikuti perubahan dalam teknologi pelaksanaan kod JavaScript.
Sebelum anda keliru sepenuhnya dengan nama enjin penyemak imbas ini, ingat bahawa banyak pemasaran masuk ke enjin ini dan penyemak imbas yang berdasarkannya. Dalam analisis kompilasi JavaScript yang sangat berguna ini, pengarang secara sinis menyatakan: "Apa yang anda tidak tahu ialah penyusun adalah kira-kira 37% pemasaran, dan penjenamaan semula pengkompil ialah salah satu daripada beberapa perkara yang boleh anda lakukan. Salah satu daripada beberapa perkara , pemasaran pintar, maka namanya: SquirrelFish, Nitro, SFX..."
Sambil mengingati pengaruh pemasaran terhadap penamaan dan penamaan semula enjin ini, adalah berguna untuk mengambil perhatian beberapa peristiwa penting dalam sejarah enjin JavaScript. Saya membuat carta yang mudah difahami untuk anda:
Pelayar, Penyemak Imbas Tanpa Kepala atau Masa Jalan | Enjin JavaScript |
---|---|
Mozilla | Spidermonkey |
Chrome | V8 |
Safari | JavaScriptCore |
IE dan Edge | Cakra |
PhantomJS | JavaScriptCore |
HTMLUnit | Badak sumbu |
TrifleJS | V8 |
Node.js | V8 |
Io.js* | V8 |
*JavaScriptCore a été réécrit sous le nom de SquirrelFish, et la version mise à niveau est QuirrelFish Extreme, également appelée Nitro. Cependant, le moteur JavaScript qui constitue la base de l'implémentation de Webkit est JavaScriptCore (comme Safari).
**Les développeurs iOS doivent savoir que Safari sur les appareils mobiles utilise Nitro, mais UIWebView n'inclut pas la compilation JIT, l'expérience sera donc plus lente. Cependant, les développeurs peuvent utiliser WKWebView, y compris Nitro dans iOS8, et l'expérience devient nettement plus rapide. Les développeurs d’applications mobiles hybrides devraient pouvoir pousser un soupir de soulagement.
*L'une des raisons pour lesquelles io.js s'est finalement séparé de Node.js était de prendre en charge la version V8 du moteur. Cela reste un défi, comme indiqué ici.
Pourquoi devrions-nous y prêter attention ?
L'objectif du processus d'analyse et d'exécution du code du moteur JavaScript est de compiler le code le plus optimisé dans les plus brefs délais.
Plus important encore, l'évolution de ces moteurs est étroitement liée à notre exploration continue des plateformes Web et mobiles en évolution pour les rendre aussi performantes que possible. Pour suivre cette évolution, vous pouvez voir les performances des différents moteurs dans des graphiques de référence, résumés par arewefastyet.com. Par exemple, il serait intéressant de comparer les performances de Chrome avec un moteur V8 par rapport à un moteur sans vilebrequin.
Tout développeur Web doit comprendre que le code que nous travaillons dur pour écrire, déboguer et maintenir fonctionnera inévitablement différemment selon les navigateurs. Pourquoi un certain morceau de code fonctionne-t-il lentement sur un navigateur mais beaucoup plus rapidement sur un autre ?
De même, les développeurs mobiles, en particulier les développeurs d'applications mobiles hybrides qui utilisent des vues Web pour afficher le contenu des pages, ou ceux qui utilisent des environnements d'exécution comme NativeScript, veulent savoir quel moteur interprète et exécute leur code JavaScript. Les développeurs Web mobiles doivent être conscients des limites et des possibilités des navigateurs sur les appareils plus petits. En tant que développeur Web, mobile ou d'applications souhaitant continuer à se développer, garder un œil sur les modifications apportées au moteur JavaScript sera très payant.
Résumé :
Types de données de base dans js chaîne de nombres booléens nuls non définis
L'objet est un type de données complexe en js. C'est le type de base de tous les objets
.
js, comme les autres langages, a 9 instructions de contrôle de base
Les fonctions en js n'ont pas besoin de spécifier de valeur de retour. En fait, les fonctions qui ne spécifient pas de valeur de retour renvoient undefined
.
Les paramètres en js peuvent être transmis à volonté. Faites attention au tableau arguments[] Cela peut vous aider
.
Les fonctions en js ne peuvent pas être surchargées, mais vous pouvez les imiter.