現代程式語言用什麼語言寫成?

kjfcpua發表於2014-01-22
對於指令碼型語言通常是c寫的,包括解析器(編譯器和執行器)和大部分基礎的標準庫(比較高階的庫才會用本語言寫)。從這個意義上來說,指令碼語言只是c的wrapper,正因為如此,所以才會有人喊python的sort居然比go快之類的說法,其實就算是python的sort快,那也只證明了c比go快。但也有一些語言的解析器用c++寫(比如V8)。

對於編譯型語言,通常編譯器也是c寫的(但編譯器對效能要求不高,理論上可以用任何語言完成)。執行器則分為兩種情況:一種編譯為機器碼的,執行器自然是cpu(比如c++、go這類)。另一種編譯為bytecode的,這種執行器一般用c寫,但是由於效能方面的考慮,通常會執行器(也就是vm)會把bytecode變成機器碼讓cpu直接執行。至於標準庫,編譯型語言通常傾向於用本語言完全重寫,而不是去依賴c庫。

Go語言是編譯型語言裡面比較奇葩的。由於Go語言的目標是成為下一個C語言,所以整個Go語言的實現過程中,儘量減少了對c語言的依賴,大部分的工具鏈都是用Go語言自身來完成。其基本思路是:用gcc或其他標準c的編譯器,編譯出一個Go特有的c編譯器,然後用這個特有的c編譯器,來編譯Go語言工具鏈中那些不得不用c寫的部分,包括go的編譯器。

有人問c是用什麼寫的。實際上現在多數c編譯器都是c寫的,大家去看看gcc的程式碼就知道了。其實,現在彙編編譯器一般也是c寫的。

從雞生蛋的角度,編譯器的進化史應該是這樣的:先用機器碼直接寫第一個彙編編譯器,然後彙編編譯器編出第一個c編譯器。有c編譯器後可以反過來用c重寫彙編編譯器和c編譯器,做更多的功能增強。這個過程理論上每出現一種新cpu指令集、新作業系統就需要重新來一遍。但是人是聰明的。所以交叉編譯這樣的東西產生了,這就避免需要把整個編譯器進化史重新演繹一遍。







假設我們的現代語言為X

1:用C++寫一個X的編譯器

2:用X寫一個X的編譯器

3:用第一個編譯器編譯第二個編譯器

4:扔掉第一個編譯器


從此,你就得到了X寫的X編譯器的binary,以後不斷改進,不斷用上一個binary來編譯改進後的編譯器生成下一個binary。基本上都是這麼幹的。


相關文章