編譯型語言和解釋型語言碌冶?
這兩個(gè)概念其實(shí)沒有很標(biāo)準(zhǔn)的官方固定扑庞,通過查閱資料拒逮,個(gè)人認(rèn)為 編譯型 和 解釋型 更多應(yīng)該修飾的是某類編程語言使用的執(zhí)行方式或者說源碼如何被運(yùn)行的動(dòng)作。
通常認(rèn)為滩援,
編譯型: 編譯型語言是代碼在運(yùn)行前編譯器將人類可以理解的語言(編程語言)轉(zhuǎn)換成機(jī)器可以理解的語言,轉(zhuǎn)換完成后租悄,下次運(yùn)行時(shí)不必再次轉(zhuǎn)換
解釋型:也是人類可以理解的語言(編程語言),也需要轉(zhuǎn)換成機(jī)器可以理解的語言才能執(zhí)行泣棋,但是是在運(yùn)行時(shí)轉(zhuǎn)換的潭辈,所以執(zhí)行前需要解釋器安裝在系統(tǒng)環(huán)境澈吨;但并不是說解釋型就沒有編譯過程蒸其,比如JAVA同樣有編譯過程歌懒,只是編譯結(jié)果不是機(jī)器能直接執(zhí)行的辕坝,需要使用JVM解釋執(zhí)行(有些資料會(huì)將JAVA歸為編譯型語言= =!)药有。
那為什么說這兩個(gè)詞不應(yīng)該用于修飾某類具體語言呢?比如:
C/C++ :通常會(huì)經(jīng)過一系列 “編譯“ 過程輸出機(jī)器可執(zhí)行的機(jī)器碼检痰,但如果使用比如叫 Cling 的東西直接運(yùn)行源文件呢?
小結(jié)論:解釋和編譯都只是程序從源碼到運(yùn)行時(shí)的一種動(dòng)作锨推,跟語言本身無關(guān)
如果一門語言是可以解釋的铅歼,必然可以開發(fā)出這門語言的編譯器。反過來說换可,如果一門語言是可編譯的椎椰,我只要把它的編譯器放到解釋器里,把編譯推遲到運(yùn)行時(shí)沾鳄,這么語言就可以是解釋型的~
所以慨飘,我們不應(yīng)該糾結(jié)Javascript到底是 編譯型 還是 解釋型 語言,而應(yīng)該重點(diǎn)關(guān)注它在JS引擎中是如何執(zhí)行的译荞!~
Javascript如何執(zhí)行瓤的?
Javascript的執(zhí)行通常和JS引擎有關(guān),這里主要基于現(xiàn)代的JS引擎(在古老的瀏覽器中JS引擎中吞歼,幾乎沒有任何優(yōu)化的解釋運(yùn)行Javascript代碼)圈膏。
總的來說,JS引擎負(fù)責(zé)將JavaScript代碼編譯和執(zhí)行的整個(gè)過程篙骡,不同JS引擎實(shí)現(xiàn)有差別稽坤,但大致上也都包括以下幾個(gè)流程:
編譯階段:進(jìn)行 分詞/詞法分析、解析/語法分析(生成AST)茫多、優(yōu)化天揖、代碼生成
執(zhí)行階段:執(zhí)行生成的代碼今膊,并管理執(zhí)行過程中的內(nèi)存分配斑唬、垃圾回收等
需要注意的是缤谎,編譯階段其實(shí)發(fā)生在執(zhí)行階段前幾微秒(甚至更短!)的時(shí)間內(nèi)坷澡,并且兩個(gè)階段不是完全分割的频敛,比如優(yōu)化過程會(huì)發(fā)生在執(zhí)行的整個(gè)階段,劃分這兩個(gè)流程只是便于理解差油。
這種編譯后立即執(zhí)行的方式通常被稱為 JIT (Just In Time) Comipler
V8引擎以及性能優(yōu)化
TODO
參考
一個(gè)討論
https://zhuanlan.zhihu.com/p/25122691
解釋JIT如何優(yōu)化
https://hacks.mozilla.org/2017/02/a-crash-course-in-just-in-time-jit-compilers/
大前端開發(fā)者需要了解的基礎(chǔ)編譯原理和語言知識(shí)
http://fullstack.blog/2017/06/24/%E5%A4%A7%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91%E8%80%85%E9%9C%80%E8%A6%81%E4%BA%86%E8%A7%A3%E7%9A%84%E5%9F%BA%E7%A1%80%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86%E5%92%8C%E8%AF%AD%E8%A8%80%E7%9F%A5%E8%AF%86/
V8相關(guān):
https://juejin.im/post/5959edfc5188250d83241399
https://zhuanlan.zhihu.com/p/25122691
https://segmentfault.com/a/1190000011289535
https://www.iteye.com/news/31307