簡體   English   中英

C# 編譯器是用哪種語言編寫的?

[英]In which language is the C# compiler written?

我查看了http://referencesource.microsoft.com/上的源代碼,似乎所有源代碼都在 C# 中。

我還查看了新的 C# 編譯器平台 ( Roslyn ) 的源代碼,它也在 C# 中。 這怎么可能? C# 語言編譯器是用 C# 編寫的嗎? 還是我錯過了一些明顯的東西? 如果 C# 編譯器是用 C# 編寫的,那么它是如何工作的?

最初的 C# 編譯器不是用 C# 編寫的,而是用 C 和 C++ 編寫的。 新的 Roslyn 編譯器是用 C# 編寫的,但最初是用舊編譯器編譯的。 新編譯器完成后,就可以編譯自己的源代碼:這稱為bootstrapping

編譯器是實用程序 - 它們將編程語言文本轉換為機器代碼。 如果編程語言描述的軟件恰好是一個編譯器......

編譯器還可以為其他架構生成機器代碼。 例如,Apple 使用基於 Intel 的服務器機架編譯 iOS。 編譯器不必運行它生成的 ARM 代碼,只需將其寫入磁盤即可。

編譯器 2.0 必須用編譯器 1.0 可以處理的語言編寫,但它當然可以創建具有優化等更新功能的編譯器 2.0。 然后,您可以使用編譯器 2.0 重新編譯源代碼並制作更好的版本。 同樣,編譯器不知道它正在制作自己的另一個版本。

如果我們回到時間的迷霧中,那么我們確實達到了沒有編譯器的地步——高級語言的第一次迭代。 然后我們必須拿出鉛筆和操作碼書並在匯編中編寫第一個。 我們是如何編寫第一個匯編程序的? 直接機器代碼輸入,可能是在打孔紙帶上,或在前面板上翻轉開關。

編譯器只是一個程序,就像任何其他程序一樣。 它沒有什么神奇或特別之處。 它需要一些輸入並產生一些輸出。 在這種特殊情況下,輸入恰好是 C#,輸出恰好是 CIL,但這與輸入是一系列納稅申報表而輸出是報告沒有什么不同。

你用任何可用的語言編寫一種語言,並為它創建一個新的編譯器。 現在我們可以將這個程序稱為 C# Compiler V 1.0,它能夠讀取和編譯任何帶有當前保留字集的 C# 代碼。 現在,你說,我想介紹一個以前不存在的新特性,比如where語句。 好的,您使用 C# Compiler V 1.0,它顯然任何地方都沒有where語句,並將代碼編譯成新版本的 C# Compiler V 2.0。

您可能會在這里問:但是等等,C# Compiler V 1.0 中沒有where語句。 現在,編譯器是如此的野獸,它可以完成一項非常具體的工作,無論如何,您不需要超過 C# 所能提供的 20%。 當然,有時棘手去思考新的功能,如產量,但除非產量簡單來說表現,你將無法輕松實現反正不管什么編譯您使用的語言。

一旦創建了 C# Compiler V 2.0,即使您不需要where語句並且它甚至可能不在 C# Compiler V 2.0 的代碼中的任何地方使用,您仍然會使用新編譯器重新編譯它,並且生成了這個 C# Compiler V 2.0來自 C# Compiler V 2.0 的 Code for C# Compiler V 2.0 是您的新 C# Compiler V 2.0 編譯器。

在您這樣做之前,因為您的新編譯器可以理解新語法,您有權調整編譯器代碼本身並添加任何可以編譯到其中的內容,如果您認為它會改進任何內容。 但是,新語法可以改進編譯器本身的可能性很小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM