Git 自舉,編譯器自舉

今天看一篇文章提到了“Git 自舉”,它指的是 Git 實現了自我託管,也就是 Git 可以託管 Git 自身的源碼。

這個概念很簡單,但是想了解一下具體實現原理是什麼,於是搜了一下“自舉”,相關的大多是“編譯器自舉”的內容,我也順便看了一下,發現沒有多少有意義的參考內容。但其實也是有那麼一兩句介紹讓我思考之後總算明白了編譯器自舉是怎麼回事。

首先需要知道兩個東西:

  • 編譯器是用來編譯程序的,而其實它就是在編譯程序們所使用的語言的語法語義啥的,那麼簡單來講編譯器就是用來編譯語言的
  • 編譯器本身也是用某一種編程語言寫出來的,並且編譯器也是需要先編譯出來的

其實通過上邊兩個必備事項,你應該看得出來,這裏邊已經形成了一個死結:編譯器需要先被編譯出來,不然它就沒法編譯其它東西(包括它自己),那這個編譯器要怎麼編譯出來?

假設你現在寫了一個高級語言 Xlang,那這個語言需要用什麼編譯器來編譯呢?當然是使用編譯 Xlang 的編譯器,問題是現在並沒有可以編譯 Xlang 的編譯器。

其實要實現這個編譯器,並不一定要使用 Xlang 語言,可以先用其它已有語言(BB)來實現一個可以編譯 Xlang 語言的編譯器。而自舉就是基於這個邏輯:

  • 1、Xlang 語言的語法語義什麼的定義好之後,
  • 2、使用 Xlang 語言寫一個“通用 Xlang 編譯器”,
  • 3、然後用 BB 語言寫一個編譯器 BBX,
  • 4、用 BBX 把“通用 Xlang 編譯器”編譯出來,(你可以直接理解這個 BB 語言就是最底層的那種直接跟機器打交道的,反正它寫的編譯器就是可以編譯 Xlang 語言)
  • 5、這樣,一個 Xlang 語言寫的 Xlang 編譯器 AXL 就出現了。
  • 6、它本身是可以編譯 Xlang 語言的,當然也就可以編譯 Xlang 寫的編譯器——也就是它自己,實現編譯器自舉,所以後邊用 Xlang 去開發就不需要再用到 BB 語言和 BBX 了。

這個思想其實有點像兩數互換位置的算法,必須借用一個第三者來作中間態,不然無法完成。

而至於爲什麼不一直沿用 BBX 語言作爲 Xlang 語言的通用編譯器呢?這跟工程(比如迭代自舉的過程中實際上相當於在審視自己語言的優劣……)和性能、效率等多方面因素有關。不展開了。

同樣的邏輯回到 Git 自舉上,可能意思就只是最開始實現 Git 需要使用其它版本控制工具來管理,等到 Git 功能開發完成,可以託管代碼了,這時候把 Git 本身的源碼託管到 Git 上。

這麼看來,這個所謂的“Git 自舉”,跟編譯器自舉的意思差得有點兒遠,因爲它完全不必要形成一個環——也完全沒有結存在——因爲 Git 的開發其實也可以不用版本控制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章