新版本編譯器是用自己(新版本編譯器)重新編譯後發布還是用舊版本編譯器編譯發布?
新版本的編譯器代碼第一次編譯肯定是適用舊版本編譯器編譯的(假設不使用其他語言和編譯器),那麼當一個語言的新版本編譯器要發布時,是用上一版本的編譯器編譯後直接放出,還是用上一版本編譯器編譯出新編譯器後,用新的編譯器重新編譯一遍放出?
雖然說編譯器自舉是一個里程碑事件,但是並非每一次編譯器發布都一定自舉了才發布。如一個C++編譯器,名叫compilerCC,有可能這個compilerCC是通過GCC編譯出來就發布了,並沒有自舉。
但是,若編譯器完成了自舉,如新版本為compilerCC 1.1,若是開源軟體,那麼他可能會要求用戶使用GCC或者compilerCC 1.0來編譯compilerCC 1.1. 而在1.1新版本開發時,也會用compilerCC 1.1自己來編譯自身compilerCC 1.1自舉來進行自身編譯器的質量檢測。
至於發布給客戶用的是哪一個版本編譯出來的compilerCC 1.1(compilerCC 1.0, GCC抑或著clang),這其實並沒有一個定論,但是其實我覺得這個compilerCC 1.1一般發布出來的都是基於GCC或者clang編譯出來的,雖然說可以自舉。
ghc 對這個問題的回答是重新編譯:Building/Architecture/Idiom/Stages - GHC
其實講道理,理想世界裡編譯兩次就到不動點了,因為編譯器本身用什麼編譯器編譯對它輸出的代碼是沒有影響的……
你想想假設你寫了一個文本處理的程序(類似awk好了),它用GCC 4.9和GCC 5.4編譯以後行為是不同的。你不覺得要不然是你的代碼有bug,要不然是兩個GCC里至少有一個有bug嘛。
GCC默認編譯3遍我記得主要目的是為了assert 第二遍的結果 == 第三遍的結果,因為這兩個不一樣很可能意味著有bug需要修了。所以這個邏輯不是說你要發布編譯第三遍的那個結果,而是說你需要編譯三遍才知道你這個版本敢不敢發布……
編譯器當然是要保證能自舉之後才能發布
比如gcc默認的makefile是要自舉三次的,我為了編譯速度一般都關掉
要看這編譯器有沒有自信和能力了。比如VC就是自己編譯自己發布的,gcc也能做到。但有些編譯器比如keil只能編譯C51,你讓它咋自舉?還有些編譯器過於輕量化,比如LCC(不確定),編譯不了自己用的高級特性,就只能靠別人了。
關鍵詞:自舉。
請學習三遍之後再來提問題。
絕大多數人都沒有做過的事情,只是憑想像和聽說,妄下結論!
每個新版本編譯器的發布,都要用新版編譯器反覆編譯測試代碼多次,直到全部測試都達到預期。如果是用編譯目標語言作為源碼,最好把源碼也當成測試代碼。推薦閱讀:
※用new申請的內存如果使用free函數來釋放會有怎樣的結果?
※如何看待 NOIP 競賽選手用機與評測機編譯器行為不一致而導致評測出現的問題?
※為什麼微軟不單獨發行編譯器和鏈接器?
※如何看待微軟研究院的LEAN項目沒有使用微軟出品的編譯器?
※請問達到怎樣的水平才能進微軟這類公司從事搞編譯器這類工作?
TAG:編譯器 |