Ini adalah detail yang bisa saya gali. Perlu dicatat terlebih dahulu bahwa meskipun JavaScript biasanya dianggap ditafsirkan dan dijalankan pada VM, ini tidak benar-benar terjadi dengan penerjemah modern, yang cenderung mengkompilasi sumber secara langsung ke dalam kode mesin (dengan pengecualian IE).
Chrome: Mesin V8
V8 memiliki cache kompilasi. Toko ini mengkompilasi JavaScript menggunakan hash sumber hingga 5 koleksi sampah. Ini berarti bahwa dua bagian kode sumber yang identik akan berbagi entri cache dalam memori terlepas dari bagaimana mereka dimasukkan. Cache ini tidak dihapus ketika halaman dimuat ulang.
Sumber
Pembaruan - 19/03/2015
Tim Chrome telah merilis detail tentang teknik baru mereka untuk streaming dan caching JavaScript .
- Streaming Skrip
Script streaming mengoptimalkan penguraian file JavaScript. [...]
Mulai versi 41, Chrome mem-parsing async dan skrip yang ditangguhkan pada utas terpisah segera setelah pengunduhan dimulai. Ini berarti penguraian dapat selesai hanya dalam milidetik setelah pengunduhan selesai, dan menghasilkan pemuatan halaman sebanyak 10% lebih cepat.
- Caching kode
Biasanya, mesin V8 mengkompilasi JavaScript halaman pada setiap kunjungan, mengubahnya menjadi instruksi yang dimengerti oleh prosesor. Kode yang dikompilasi ini kemudian dibuang begitu pengguna menavigasi dari halaman karena kode yang dikompilasi sangat tergantung pada keadaan dan konteks mesin pada waktu kompilasi.
Chrome 42 memperkenalkan teknik canggih menyimpan salinan lokal dari kode yang dikompilasi, sehingga ketika pengguna kembali ke halaman, langkah-langkah pengunduhan, penguraian, dan kompilasi semua bisa dilewati. Di semua pemuatan halaman, ini memungkinkan Chrome untuk menghindari sekitar 40% waktu kompilasi dan menghemat baterai berharga pada perangkat seluler.
Opera: Mesin Carakan
Dalam prakteknya ini berarti bahwa setiap kali sebuah program skrip akan dikompilasi, yang kode sumbernya identik dengan beberapa program lain yang baru-baru ini dikompilasi, kami menggunakan kembali output sebelumnya dari kompiler dan melewatkan langkah kompilasi sepenuhnya. Cache ini cukup efektif dalam skenario penelusuran biasa di mana satu memuat halaman demi halaman dari situs yang sama, seperti artikel berita berbeda dari layanan berita, karena setiap halaman sering memuat perpustakaan skrip yang sama, terkadang sangat besar.
Oleh karena itu JavaScript di-cache di seluruh reload halaman, dua permintaan ke skrip yang sama tidak akan menghasilkan kompilasi ulang.
Sumber
Firefox: Mesin SpiderMonkey
SpiderMonkey menggunakan Nanojit
sebagai back-end aslinya, kompiler JIT. Proses kompilasi kode mesin dapat dilihat di sini . Singkatnya, tampaknya mengkompilasi ulang skrip saat dimuat. Namun, jika kita melihat lebih dalam pada internal Nanojit
kita melihat bahwa monitor tingkat yang lebih tinggi jstracer
, yang digunakan untuk melacak kompilasi dapat transisi melalui tiga tahap selama kompilasi, memberikan manfaat untuk Nanojit
:
Keadaan awal jejak monitor adalah pemantauan. Ini berarti spidermonkey sedang menerjemahkan bytecode. Setiap kali spidermonkey menginterpretasikan bytecode back-jump-jump, monitor mencatat berapa kali nilai program-counter-target (PC) lompat-target telah dilompati-ke. Nomor ini disebut Hitungan Hitungan untuk PC. Jika jumlah hit PC tertentu mencapai nilai ambang, target dianggap panas.
Ketika monitor memutuskan bahwa PC target sedang panas, monitor akan melihat hashtable fragmen untuk melihat apakah ada fragmen yang menyimpan kode asli untuk PC target tersebut. Jika ia menemukan fragmen seperti itu, ia beralih ke mode eksekusi. Kalau tidak, transisi ke mode perekaman.
Ini berarti bahwa untuk hot
fragmen kode kode asli di-cache. Berarti tidak perlu dikompilasi ulang. Tidak diperjelas apakah bagian asli hash ini dipertahankan di antara refresh halaman. Tetapi saya akan berasumsi bahwa mereka memang demikian. Jika ada yang bisa menemukan bukti pendukung untuk ini, maka sangat bagus.
EDIT : Sudah menunjukkan bahwa pengembang Mozilla Boris Zbarsky telah menyatakan bahwa Gecko tidak tembolok dikompilasi script belum . Diambil dari jawaban SO ini .
Safari: Mesin JavaScriptCore / SquirelFish
Saya pikir jawaban terbaik untuk implementasi ini sudah diberikan oleh orang lain .
Kami saat ini tidak men-cache bytecode (atau kode asli). Ini adalah
opsi yang kami pertimbangkan, namun, saat ini, pembuatan kode adalah
bagian sepele dari waktu eksekusi JS (<2%), jadi kami tidak mengejar
ini saat ini.
Ini ditulis oleh Maciej Stachowiak , pengembang utama Safari. Jadi saya pikir kita bisa menganggap itu benar.
Saya tidak dapat menemukan informasi lain tetapi Anda dapat membaca lebih lanjut tentang peningkatan kecepatan SquirrelFish Extreme
mesin terbaru di sini , atau menelusuri kode sumber di sini jika Anda merasa ingin bertualang.
IE: Mesin Chakra
Tidak ada informasi terkini tentang JavaScript Engine (Chakra) IE9 di bidang ini. Jika ada yang tahu sesuatu, silakan komentar.
Ini cukup tidak resmi, tetapi untuk implementasi mesin IE yang lebih lama, Eric Lippert ( pengembang MS dari JScript ) menyatakan dalam sebuah balasan blog di sini bahwa:
JScript Classic bertindak seperti bahasa yang dikompilasi dalam arti bahwa sebelum program JScript Classic berjalan, kami sepenuhnya sintaks memeriksa kode, menghasilkan parse tree penuh, dan menghasilkan bytecode. Kami kemudian menjalankan bytecode melalui interpreter bytecode. Dalam arti itu, JScript setiap bit "dikompilasi" sebagai Java. Perbedaannya adalah bahwa JScript tidak memungkinkan Anda untuk bertahan atau memeriksa bytecode milik kami . Juga, bytecode jauh lebih tinggi daripada byvec JVM - bahasa bytecode JScript Classic sedikit lebih dari linierisasi pohon parse, sedangkan bytecode JVM jelas dimaksudkan untuk beroperasi pada mesin tumpukan tingkat rendah.
Ini menunjukkan bahwa bytecode tidak bertahan dengan cara apa pun, dan dengan demikian bytecode tidak di-cache.