iT邦幫忙

2022 iThome 鐵人賽

DAY 2
0
Modern Web

就是要搞懂 JavaScript 啦!系列 第 2

Day02 直譯?編譯?傻傻搞不清楚

  • 分享至 

  • xImage
  •  

JavaScript 其中一大謎團,就是關於它到底屬於直譯式還是編譯式語言。

那麼首先,就來簡單定義一下這兩者:

直譯式語言(Interpreted language)

程式運行時從上到下,一行接一行將原始碼翻譯成機器語言,也就是讀完一行程式碼,機器就執行一個動作,執行速度相對要慢。

編譯式語言(Compiled language)

執行前將整份程式碼翻譯成機器語言,隨後再運行。執行速度相較更快,但開發、除錯速度較慢。

原始碼(Source code):指人類能夠閱讀的電腦語言指令,通常由工程師直接撰寫。

機器語言(machine language):即電腦的 CPU 可直接解讀的資料,有時也被稱為原生碼(native code)


直譯 or 編譯?

所以說,JavaScript 到底是哪一種?

MDN 文件中寫到:

「JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language」

這裡挑出兩個關鍵字:

  • interpreted(直譯式)
  • just-in-time compiled(即時編譯)

根據查到的資料,JavaScript 最初是直譯式語言,後來為了加快執行速度,慢慢進化為「即時編譯」。

即時編譯(Just-in-time Compiled)

即時編譯也常簡稱為 JIT,這種技術混合了編譯語言與直譯語言的優點,會先把程式原始碼編譯成中介碼(bytecode,也稱位元組碼或字節碼)。等到執行時,再將中介碼直譯為機器語言執行。

比較特別的是,跟一般編譯型語言不同,JIT 不會將編譯好的結果生成一份檔案存在磁碟中,而是直接將編譯完的結果儲存在記憶體,隨後馬上執行。

因此經歷第一次執行並快取編譯結果後,第二次以後的執行速度會加快。當記憶體不足時,系統會刪除部分代碼,並在需要時重新生成。

所以說,JS 確實經歷過編譯,而且是在「將要執行之前,以極快地速度編譯完畢」。

下一章就來聊聊,編譯時期程式具體都做了些什麼。


參考資料


上一篇
Day01 就是要搞懂 JavaScript 啦!
下一篇
Day03 編譯時到底做了什麼?
系列文
就是要搞懂 JavaScript 啦!73
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言