GCC 用 C++ 來編譯(酷殼)

GCC在2012年8月15日的時候,merge了一個patch - Merge from cxx-conversion branch,這意味着,之後在GCC的編譯只能用C++的編譯器了,也意味着,gcc的實現代碼開始轉向C++了。 html

你可能會有兩個問題, git

  • 一個問題是爲何GCC要轉成C++的實現?
  • 沒有C++的編譯器,我怎麼編譯C++編譯器的代碼?這不是「雞生蛋仍是蛋生雞」的問題麼?

那,咱們來看一看吧。 程序員

爲何要用C++

GNU的C++ Conversion文檔中,咱們能夠在Background中看到這樣的描述: web

Whether we use C or C++, we need to try to ensure that interfaces are easy to understand, that the code is reasonably modular, that the internal documentation corresponds to the code, that it is possible for new developers to write new passes and to fix bugs. Those are the important issues for us to consider. The C++ features which are not present in C – features which are well documented in many books and many web sites – are not an important issue. shell

這句話的意思能夠理解爲,今天GCC在用C語言的實現已經有點hold不住了,由於,開發人員以爲,無論咱們用C或C++,都須要努力確保接口是容易理解的,這樣咱們的代碼是想當理性地被模塊化的,這樣內部文檔和代碼一致,這樣能夠更好地組織代碼,這樣有利於新人了fix-bug。而C++正好可讓他們更好的完成這些東西。 編程

GNU還給出了下面這些理由: bootstrap

  • C++ 是一種標準化的,大衆的,流行的語言。
  • C++ 是C90的超集。
  • C++做爲C的擴展和C在性能上同樣好。
  • C++ 在一些有意義的案例上支持更乾淨的代碼。
  • C++ 讓你更容易去寫一個更乾淨的接口。
  • C++ 永遠不會讓你的代碼變得更醜。
  • C++ 不是萬靈藥,他是C的一個改進。

而後,給了一個PDF http://airs.com/ian/cxx-slides.pdf,這是Google 的 Ian Lance Taylor的的一個PPT,這個文檔可讓你們更好地理解我在《C++的坑多嗎?》一文中那些觀點。我都不知道我要說多少遍C++的封裝,繼承和多態比C語言在代碼組織上要好得多得多。你們仍是本身看一下代碼吧: 數據結構

數據結構的操做 —— 你寫的必定不會有STL好 app

結構套結構仍是繼承? 編程語言

函數指針仍是多態?

垃圾回收 仍是 智能指針?

Why not C++? 

  • C++慢嗎?某些特性會慢,可是有時C++更快,你能夠只用你喜歡的C++特性。
  • C++複雜嗎?它只不過是另外一種編程語言,他可讓你對程序員維護更簡單。
  • FSF不喜歡C++!由於FSF(自由軟件基金會)這些人不寫代碼。

Bootstrapping

最後,我想來介紹一下Bootstrapping。 所謂Bootstrapping,就是用本身這個語言寫編譯器來編譯本身,也就是說若是你要編譯gcc,你須要用一個c的編譯器來編譯之,這個就是bootstrapped process,自舉過程。包括 BASICAlgolCC++PascalPL/IFactorHaskellModula-2OberonOCaml,Common LispSchemeJavaPythonScala 等語言都這麼幹。

這樣乾的好處主要是,本身能夠測試本身,編譯器的改善和語言的改善相輔相成。

可是,這是一個「雞生蛋,仍是蛋生雞」的問題,若是你須要用X語言來寫一個X語言編譯器的語言,你能夠這樣幹:

  • 用Y語言來實現X的語言解釋器或編譯器。 Niklaus Wirth 說 Pascal 的第一個編譯器是由 Fortran 寫的。
  • 已存在用Y語言寫的X語言的編譯器或解釋器。Scheme 就是這麼幹的。
  • 已經有一個編譯器來編譯一個早期版本的X語言,而後就能夠用早期版本的X語言來編譯新版本的X語言了。JavaHaskell, 和最第一版的 Free Pascal 就是這麼幹的。
  • X在某平臺上的編譯器已經存在,可使用交叉編譯技術來編譯另外一個平臺上X語言,C語言就是這麼幹的。
  • 用X語言寫一個編譯器,而後手動編譯之(不須要特別優化),(注:手動編譯估計就是手動翻譯成機器彙編代碼),而後再運行這個手動編譯的編譯器來編譯這個編譯器的源碼,並優化之。Donald Knuth 在他的 WEB literate programming 系統裏用到了這個方法。
相關文章
相關標籤/搜索