1. 程式人生 > >用 C# 編寫 C# 編譯器,先有雞還是先有蛋?

用 C# 編寫 C# 編譯器,先有雞還是先有蛋?

前段時間翻譯了一篇文章 微軟是如何重寫 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 自己編譯的。