Rumah > Artikel > hujung hadapan web > Sokongan apa yang javascript bergantung?
Javascript bergantung pada sokongan enjin javascript yang mendasari. JavaScript berjalan dalam penyemak imbas dan bergantung terutamanya pada enjin JS penyemak imbas untuk mentafsir dan melaksanakan kod JS. Enjin JavaScript ialah mesin maya yang pakar dalam memproses skrip JavaScript dan biasanya disertakan dengan pelayar web untuk mentafsir dan melaksanakan skrip JS.
Persekitaran pengendalian tutorial ini: sistem Windows 7, versi JavaScript 1.8.5, komputer Dell G3.
Javascript bergantung pada sokongan enjin js asas.
Javascript berjalan dalam penyemak imbas dan bergantung terutamanya pada enjin js penyemak imbas untuk mentafsir dan melaksanakan kod js. Perisian lain dengan enjin js juga boleh menjalankan js, tetapi secara amnya js berkait rapat dengan halaman web, jadi ia biasanya dijalankan dalam penyemak imbas.
enjin javascript
Enjin JavaScript ialah mesin maya yang mengkhusus dalam memproses skrip JavaScript Ia biasanya disertakan dalam pelayar web dan digunakan untuk Mentafsir dan melaksanakan skrip js.
Enjin js terkenal:
Mozilla: Enjin SpiderMonkey, enjin JavaScript pertama di dunia, ditulis dalam C/C, digunakan dalam Mozilla Firefox versi 1.0~3.0
Google: Enjin V8, ditulis dalam bahasa C/himpunan, digunakan dalam penyemak imbas krom
Microsoft: Enjin Chakra, digunakan dalam versi 32-bit Internet Explorer 9
Hubungan antara kernel pelayar dan enjin JS
Ambil webkit sebagai contoh:
Enjin V8
1. Prinsip enjin V8
Enjin V8 ialah enjin JavaScript dan WebAssembly berprestasi tinggi sumber terbuka Google yang ditulis dalam C. Gunakan Untuk Chrome dan Node. js, dsb.
Ia melaksanakan ECMAScript dan WebAssembly dan berjalan pada Windows 7 atau lebih tinggi, sistem macOS 10.12 dan Linux menggunakan pemproses x64, IA-32, ARM atau MIPS.
Enjin V8 boleh berjalan secara bebas atau dibenamkan ke dalam mana-mana aplikasi C. Sebagai contoh, penggunaan Node.js dalam enjin V8 boleh dianggap sebagai membenamkan enjin V8 ke dalam aplikasi Kemudian Node.js mempunyai keupayaan untuk melaksanakan kod JavaScript.
Skema:
① Modul Parse akan menukar kod JavaScript kepada AST Ini kerana penterjemah tidak memahami kod JavaScript secara langsung. Jika fungsi tidak dipanggil, ia tidak akan ditukar kepada AST
② Ignition ialah penterjemah dan akan menukar AST kepada ByteCode. Pada masa yang sama, maklumat yang diperlukan untuk pengoptimuman TurboFan akan dikumpul (seperti maklumat jenis parameter fungsi, hanya dengan jenis operasi sebenar boleh dilakukan). Jika fungsi dipanggil sekali sahaja, Ignition menukarkan AST kepada ByteCode
③ Mengapakah ia akhirnya ditukar kepada bytecode dan bukannya terus kepada kod mesin?
Oleh kerana persekitaran di mana kod JS dilaksanakan tidak ditetapkan Ia mungkin menggunakan penyemak imbas dalam persekitaran Windows, persekitaran mac atau persekitaran Linux, atau ia mungkin berada dalam Persekitaran Node.js tidak tetap, akan terdapat CPU yang berbeza dalam persekitaran yang berbeza, CPU yang berbeza mempunyai seni bina CPU yang berbeza, dan arahan mesin yang boleh dilaksanakan oleh seni bina berbeza adalah berbeza.
ditukar kepada kod bait yang ditentukan oleh enjin V8 Ia boleh dilaksanakan dalam mana-mana persekitaran dan merupakan platform silang Akhirnya, enjin V8 akan menukar kod bait kepada pemasangan. Arahan kemudiannya ditukar kepada arahan CPU yang sepadan dengan persekitaran yang berbeza.
Tetapi masih tidak cukup selesa untuk melalui proses ini setiap kali. Sebagai contoh, terdapat fungsi yang digunakan semula, tetapi menggunakan set proses sebelumnya, setiap kali fungsi ini digunakan, ia perlu ditukar kepada kod bait dan kemudian bertukar menjadi arahan CPU Jika fungsi ini boleh secara langsung Tukarkannya kepada arahan mesin dan simpannya Apabila menggunakan fungsi ini, jalankan arahan mesin secara terus, yang mempunyai prestasi yang lebih tinggi Namun, jika fungsi ini hanya dijalankan sekali, tidak perlu menukarnya kepada kod mesin dan menyimpannya , yang akan membazir ruang.
④ Gunakan perpustakaan TurboFan, iaitu pengkompil yang menyusun kod bait ke dalam kod mesin yang boleh dilaksanakan secara langsung oleh CPU Dia boleh menggunakan pencucuhan untuk mengumpul maklumat pelaksanaan fungsi dan mengetahui fungsi yang mempunyai masa pelaksanaan yang lebih tinggi . Ramai yang akan menandakan fungsi seperti panas, fungsi panas, dan kemudian menukar fungsi ini kepada arahan mesin yang dioptimumkan pada masa hadapan, tidak perlu melalui proses yang membosankan di atas dan hanya melaksanakan arahan mesin secara terus.
Tetapi sebenarnya kod mesin juga akan dipulihkan kepada ByteCode Ini kerana jika jenis berubah semasa pelaksanaan fungsi berikutnya, kod mesin yang dioptimumkan sebelum ini tidak dapat mengendalikan operasi dengan betul dan akan ditukar secara terbalik. . ialah bytecode.
⑤, Penyahoptimuman: Contohnya, terdapat fungsi
function sum(num1,num2){ num1+num2 }
yang memanggil fungsi jumlah
sum(20,30) sum(28,30)
如果传入数字,调用sum函数,需要做的工作就是对两个数字进行相加,执行的机器指令永远是对这两个数字进行相加.
一旦改变传入值的类型,如果变成字符串,那么这个函数的意思就是两个字符串拼接。
sum("aaa","bbb")
这两种类型的传入值执行“+”操作对应的机器指令是不同的,JavaScript是不会对传入值的类型做检测的,那么还是使用数字相加的机器指令,这次函数调用的结果是不能够使用的。
但是V8引擎中提供了一种解决办法Deoptimization过程,这个过程是,一旦发现在执行机器指令时候,执行的操作不一样的时候,Deoptimization会反向优化,又转化为字节码,执行后续操作。
2、V8引擎的解析图
V8执行的细节:
①、Blink将源码交给V8引擎,Stream获取到源码并且进行编码转换
②、scanner会进行词法分析,词法分析之后会将代码转换为成tokens
③、tokens会被转换为AST树,经过Parser和PreParser:
Parser就是直接将tokens转换为AST树架构;
PreParser预解析,为什么会需要预解析?
1)如上图中的函数outer(),内部有一个函数inner(),但是并没有任何调用inner()的代码,那么就意味着并不是所有的JavaScript代码,都是一开始就被执行。对所有的JavaScript代码进行解析,必定会影响网页的运行效率。
2)V8引擎实现了Lazy Parsing(延迟解析)的方案,作用是将不必要的函数进行预解析,我只需要知道有这么个函数就行,也就是只解析暂时需要的内容,对函数的全量解析在函数被调用的时候才会执行。
3)例如上图中函数outer中的inner函数,它就是会执行预解析。
④、生成AST树之后,会被Ignition转成字节码,之后的过程就是代码的执行过程。
【相关推荐:javascript视频教程、编程视频】
Atas ialah kandungan terperinci Sokongan apa yang javascript bergantung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!