除了直譯語言、編譯語言之外,怎麼還有「半直譯半編譯」?什麼鬼!不要摧殘偶的大腦 - 以 Java 為例

00如是說
Coding Fighter
Published in
Feb 8, 2022
Photo by Emily Morter on Unsplash

安安大家好!前陣子有點忙,不小心使用了「富堅之呼吸 — 斷刊之術」😂。趁這陣子有點時間復刊,不然都快忘記怎麼寫文章了哈。

最近思考了一下,想試著多寫一些不僅止於前端的文章,剛好自己也都有持續在精進 CS 相關的知識(非本科的哀傷 XD),就寫一些這系列的文章好了。

關於「直譯」、「編譯」的差別已經有太多鬼之神人分享了,但「半直譯半編譯」就比較難找到相關的說明。因此想試著用白話一點的方式解釋一下自己研究下來的心得,有說錯的地方再麻煩各方高手提點!

一開始,我們先把程式碼大致分成三種:

  • Machine Code(機器碼)-電腦在看的
  • Byte Code (字節碼/中間碼/位元組碼)-編譯完介於上面跟下面之間
    機器跟人都看不懂
  • 高階語言(Java、Python…等你所知道的那些語言)-人在看的

知道「編譯式語言」跟「直譯式語言」是什麼的人,相信也都知道 Machine Code 跟 高階語言 的差異了。

但問題來了,那 「Byte Code」 呢?。

這就跟我們今天的主題有關了。

半直譯半編譯

其實說破就是想要同時擁有兩者的優點:

  • 直譯之「跨平台
  • 編譯之「速度

如果我一開始就針對各家 OS 編譯成 Machine Code 的話,不就沒辦法達到跨平台了嗎?

又如果像 Javascript 那樣只透過 V8 引擎的直譯器解譯的話,就會得不到想要的速度

因此我們先搞一半就好,我一樣進行編譯,但我不編譯成 Machine Code,而是先編譯成 Java Byte Code。接著再透過 JVM 直譯器解釋成電腦看得懂的 Machine Code(因此你要在電腦執行 Java 的話,是一定要裝 JVM 的唷)!

可是這樣雖然達到跨平台,但後續還是有直譯的程序啊!速度一定會被拖慢的對吧?— 是的,這就又牽扯到「JIT 即時編譯」了。

簡單說明「JIT」就是把重複很多次的 Code ,編譯成 Machine Code 之後先 Cache 起來放在 Memory,下次就可以直接執行。

然後…就結束了! 謝謝各位😂。

--

--