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++,我還沒查到,如果你知道,麻煩留言告訴我。

如果Roslyn的第一個版本是由C++來編寫的,那麼C++編譯器的第一個版本又是由什麼來編寫的呢?如果不是C語言那很可能就是直接用機器語言來編寫的了,機器語言是作業系統可以直接執行的指令,自然不需要編譯器來翻譯。

所以,但凡編譯器是由高階語言來編寫的,它的第一個版本一定是由其它語言來編寫的,追溯它最初的祖先,一定是用機器語言來編寫的。
 

相關推薦

C#C#編譯器還是

前段時間翻譯的一篇文章 微軟是如何重寫C#編譯器並使它開源的,文章講了微軟用C#重寫C#編譯器的坎坷路,引發了一些童鞋的思考:用C#編寫C#編譯器(Roslyn),那麼C#編譯器本身是由誰來編譯的?C#語言編寫了C#編譯器,而C#語言又是由C#編譯器編譯的,這不就是先有雞還是

C# 編寫 C# 編譯器還是

前段時間翻譯了一篇文章 微軟是如何重寫 C# 編譯器並使它開源的,文章講了微軟用 C# 重寫 C# 編譯器的坎坷路,引發了一些童鞋的思考:用 C# 編寫 C# 編譯器(Roslyn),那麼 C# 編譯器本身是由誰來編譯的?C# 語言編寫了 C# 編譯器,而 C# 語言又是由 C# 編譯器編譯的,這不就是先

c++一個函式實現輸入一個字串將其中的字元按逆序輸出

#include "stdafx.h" #include <iostream> #include <string.h> using namespace std; #define N 20 int _tmain(int argc, _TCHAR* argv[]) {

C#的服務報錯誤1053服務沒有及時響應啟動或控制請求。

在執行對話方塊中鍵入“regedit”命令,按回車鍵開啟登錄檔編輯器 在左側視窗依次展開以下分支 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\EAITaskService 雙擊點開ImagePath路徑,將他改為你

c語言】求方程式 ax^2+bx+c=0 的根分別考慮:1、兩個不等的實根 2、兩個相等的實根

// 求方程式 ax^2+bx+c=0 的根,分別考慮:1、有兩個不等的實根 2、有兩個相等的實根 #include <stdio.h> #include <math.h> int main() { int d; int a,b,c; do

JS的效果怎樣讓下拉選單出現在下面的表格之上而不是把下面表格推下去

這個是用浮動來做的. 在你要顯示的那個div裡面加個 position:absolute;z-index:999; 位置可能會和原來的有偏差. 不過沒事, 你可以慢慢調.z-index是設定優先順序的, 優先順序越高,就越顯示在最上面.當你的這個選單被覆蓋了試一下調調這個屬性

node資料介面除錯跨域express中介軟體

進入服務端專案目錄下:1、npm init 建立package.json檔案;2、建立一個app.js檔案,下面的標註都有了,簡單的寫了一個介面,下面會用,對跨域訪問做了設定---------------------------------------------------

eaxyx 的五子棋功能包括: 禁手判斷棋局儲存悔棋重新開局全部通過滑鼠操作

 斷斷續續寫的第一個比較滿意的作品,算是C語言的一個小結吧,可惜以現在的能力,要寫人機對戰現實在覺得困難,以後有機會再來補充吧 #include <stdio.h> #include <graphics.h> #include <math.h&

python小遊戲沒有學過python的也會這個打程式碼

1 提示功能,按tab就可以下拉檢視相關的函式 2 input是讓使用者的輸入 3 guess == 兩個等號是表示等於,而單個=表示給等號那邊一個值 4 bif是啥?build in fuctions是內建程式 5 input 是要求使用者輸入東西 temp是提取引數 in

給女朋友的桌面放個python的煙花女朋友看了開心的不得了

原理簡介 原理其實挺簡單的,思路參考了: 先為每個煙花的一個煙花粒定義一個類: 消失 多個煙花組成一次煙花綻放 迴圈 小編髮python程式碼文章可是好勤快的,關注小編 1.尋求python 愛好者 2.目的學習 3.我提供的學習書籍,學習視訊,為了映照學習的氣氛,加Q君羊:

Python一個計算器不允許使用計算器方面的內置函數只能使用+-使用到正則表達式。

內置 則表達式 ESS rip 6.0 minus replace 計算 oat 計算表達式:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )

還是作業系統還是彙編器?(對計算機本質的探討)

//當年學微機原理,追著老師問這個問題,老師很耐心,但是回答的也是很含糊,今天看到這個解釋,感覺挺有意思。 這個是以前給別人的回帖,感覺對初學者應該還有點幫助吧,於是就無恥的再貼出來了,大家包涵。 內容開始:     “這個問題很好,說明摟主是個尋根究底的人,任何求知慾強的

第一次CSDN部落格試試看

總覺得如果要把Java學好,JDK目錄下面的src裡面常用類的方法你要清楚是怎麼實現的。 1.讀原始碼: 以前學的時候覺得Java好方便,什麼方法都是寫好的,我直接瞭解API,呼叫就行,可是到了工作,我越發的覺得原始碼裡面的東西才是最精髓的。於是我在不懂的地方一般會ctrl+滑鼠左鍵在eclipse中檢視

Vue購物車後對this的理解

    最近在學習vue,其中對購物車的編寫有點感悟。先來看看簡單的業務程式碼<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8"> <met

javascript一個函式作用是去除字串前後空格

<html> <head></head> <body> <script> function trim(str){ return str.replace(/(^\s*)||(\s*$)/g,""

java一個函式實現Fibonacci數列演算法(1,1,2,3,5,8,13......)

這個演算法就是第一個數的救國是前兩個數相加, 這個還是結合例子比較好想 public class dd1 { public void getFibonacci(int number){ int nLeft = 0; int nRight = 1; System.out.pr

記錄一下第一次java那麼長60行略長的程式碼想了好久才懂怎麼

class Point { public int x; //定義三點座標 public int y; public int z; //編寫構造器 public Po

markdown部落格看這一篇就夠了

0. 前言 為什麼用markdown寫部落格? 在寫部落格的過程中,最大的“痛點”在於寫作中總是被“格式”之類的困擾,無法專注於內容寫作; 線上寫部落格,會被網路或者編輯器本身所拖累; 本文介紹的markdown寫作,可以使你專注於部落格內容本身,寫好即成稿; 更重要的是,部落格內容及相關素材儲存在本地,可

如何巧妙的拒絕別人這幾個方法保證拒絕他們會感激你

如果在人際交往中,你需要拒絕人時,不妨用下列方法試一試:   不要立刻就拒絕:立刻拒絕,會讓人覺得你是一個冷漠無情的人,甚至覺得你對他有成見。   不要輕易地拒絕:有時候輕易地拒絕別人,會失去許多幫助別人、獲得友誼的機會。   不要在盛怒下拒絕:

【設計模式】描述還是

這裡有點疑問,書上說的是蛋繼承雞。從功能上說可能雞繼承蛋更合適,雞比蛋多了好多功能。另外這裡還缺Cock#include <iostream> using namespace std; enum TYPE