前段時間翻譯了一篇文章 微軟是如何重寫 C# 編譯器並使它開源的,文章講了微軟用 C# 重寫 C# 編譯器的坎坷路,引發了一些童鞋的思考:用 C# 編寫 C# 編譯器(Roslyn),那么 C# 編譯器本身是由誰來編譯的?C# 語言編寫了 C# 編譯器,而 C# 語言又是由 C# 編譯器編譯的,這不就是先有雞還是先有蛋的問題嗎?
雖然(博客園)文章下方評論中提出這類問題的人不多(注:除了公眾號,我的技術文章一般也會隔天在博客園發布),但我相信有這類疑問的人肯定不少。這個問題提得很好,會產生這個疑問說明你是個善於思考的人,有思辨能力;如果你又恰好看到了我這篇文章,得到了你要的答案,那么這就是我寫文章的意義。
看到童鞋們的評論,我並沒有立即回復,因為這個問題確實不好回答。但作為 .NET 忠實的布道老者(請允許我裝逼一回),我還是覺得有必要給大家解釋一下。
首先,編譯器 Roslyn 確實是自己編譯自己,它的每個版本都是由該版本的上一個版本來編譯的。那么 Roslyn 最初的第一個版本是由什么來編譯的呢?
這里就要提到了個計算機科學中的一個概念:Bootstrapping Compiler,中文叫自舉編譯器。它的目的是實現自己編譯自己。編譯器為了達到自己編譯自己的目的,它第一個版本必須由其它編程語言來實現,而它的第一個版本通常是非常簡單和基礎的版本。
很多編程語言發展成熟后都會用該語言本身來編寫自己的編譯器,比如 C# 和 Go 語言。
C# 編譯器 Roslyn 的第一個版本是由其它語言來編譯的。具體是什么語言我不確定,我覺得應該是用 C++ 寫的(因為老的 C# 編譯器用的是 C++),我還沒查到,如果你知道,麻煩留言告訴我。
如果 Roslyn 的第一個版本是由 C++ 來編寫的,那么 C++ 編譯器的第一個版本又是由什么來編寫的呢?如果不是 C 語言那很可能就是直接用機器語言來編寫的了,機器語言是操作系統可以直接運行的指令,自然不需要編譯器來翻譯。
所以,但凡自舉編譯器是由高級語言來編寫的,它的第一個版本一定是由其它語言來編寫的,追溯它最初的祖先,一定是用機器語言來編寫的。
2018-10-14 續
關於 C# 編譯器 Roslyn 的第一個版本是用什么編譯的,我在 Medium 留言問了 C# 語言負責人 Mads Torgersen:
他的回答是:
至此,文中的懷疑得到了確認。也就是說 Roslyn 最初的第一版是用老的 C# 編譯器編譯的(老的編譯器是用 C++ 編寫的),之后都是用 Roslyn 自己編譯的。