寫一個實用水平的編譯器有多難,多大工作量?

比如說,只依靠所有的文檔,來從頭建立一個C++編譯器,對語言特性提供完全和可靠的支持,會是多高難度的項目?

或者,假若Apple沒有開源Swift,如果有詳細的文檔(對語言特性的描述),寫一個編譯器來支持所有特性,是可以做到的嗎?

-------

補充

題主來澄清一下問題。「實用」指的是「不是教學用的玩具」,要能支持所有語言特性並且在性能、優化、穩定性等等達到足以商用的級別。簡單說就是「足夠好」。

另外,題主沒想做,題主只是想知道這項工程有多大工作量(比如多少人多長時間)。提問的靈感來源於Apple對swift開源——題主不很理解,如果Apple不開源swift,單從文檔出發做不出swift在各平台的編譯器嘛?或是出於其他的什麼原因?以及,例如C++這樣的語言,將編譯器移植到(新的)不同操作系統/不同CPU架構,將會是多大的工程量?


到了今天已經一點都不難了,畢竟你有LLVM,剩下的都是苦力,時間堆夠了就做出來了。


一個實用的編譯系統不僅包括前端的詞法,語法分析,語意分析等,還包括大量的編譯優化。如果使用現有的LLVM, GCC等編譯系統,本題就可以看作是增加一個語言處理的前端問題了。

如果藉助現有的 flex/yacc/bison等工具,可能會減輕一點工作量。

但具體需要多少人時,還要高人指點。


你想寫C++編譯器,那麼首先,你得找幾個

精通C++

的人。


首先你要定義什麼叫「實用」


看你所謂「文檔」的形式化程度了。多年前做過一個項目需要從面向業餘程序員的用戶指南中反向出語言定義,花了幾個月才把 BNF 整理出來,拼好 flex/bison 生成 ast 樹,手工爬一遍生成位元組碼,不折騰產出代碼的優化都不是事兒,現在有 llvm 就更不是事兒了。

你提到的 C/C++/Swift 的文法和語義都現成的,這第一步麻煩就省掉了。但是,你還真會挑,這仨C 相對簡單點就,還是有一些個人作品如 pcc/lcc 之類的,C++/Swift 是巨龐大的語言,從頭寫一個常用語法都有的光是體力活都不太是個人能扛的,一個經驗豐富的團隊也得折騰2~3年吧。比如 clang 2007-6 開源了第一個版本,2010-5 才能正確編譯完整的 boost 並通過所有測試,吃不下 boost 的 C++ 編譯器至少不算完全實用吧。

至於實用的另一部分,就是優化嘍,提高編譯速度和目標代碼的質量,無底洞呀。

所以,並沒有什麼理論上的障礙,主要還是體力夠不夠的問題。


看你做的語言多複雜。lua 這種複雜度的,現在漫山遍野的庫,不 target 到 native 三天就能整出來;而 coq/agda 這種……先看十篇論文吧


這標題和正文,「寫一個編譯器」和「寫一個C++編譯器」這難度差別也太大了吧……

編譯過程中的許多演算法、原理和工具都不算很複雜,複雜之處在於——語法太多了,還有各種各樣奇怪的邊界條件,各種各樣有例外的組合,如果還想要盡量優化那就更難了。


何必這麼和自己過不去,寫個c編譯器不行么。。。

cpp編譯器,除非你上llvm,不然就11、14、17的特性更新,我覺得主流的幾大編譯器開發者已經快吐血了。

對了,如果用模板元編程使勁艹的話,在符合語言標準的情況下,都可以玩壞現有的任何一款cpp編譯器。

所以,題主是有多想不開才想寫cpp編譯器。。。


我寫過一個編譯器,現在還跑在東軟的防火牆中,參考 NEL_百度百科 , 2003年初是一個4人團隊,後來基本是我一個人在搞,解決了上千個問題後,終於在2004年末完成了主要模塊的編碼,後來又用了3個月的時間寫了幾千個測試用例。


正巧,自己最近就在用LLVM編譯器框架做編譯器後端移植的工作。由於我是半路出家,沒什麼編譯基礎,根據自己的理解說一下,歡迎大家指正與討論。因為是開源的,與其說是自己寫一個編譯器,不如說自己改一個編譯器。LLVM編譯器框架採用三相式的設計。就是能把任何高級語言轉化成此框架特有的中間代碼IR(一種虛擬的中間彙編代碼),這個過程稱為前端,後端是能把IR轉化為任何彙編指令,比如ARM,MIPS,X86或者自己定義的彙編。這樣的話,增加了編譯器的靈活性,方便移植工作。我的工作就是後端,IR到自定義的彙編(應用在專用處理器)。不同的後端他的寄存器的個數和種類,指令種類與編碼,IR與輸出彙編的匹配等等,後端工作就是用一種特殊的描述語言tablegen來描述,放在.td文件的,所以必須要懂想要移植的架構寄存器,指令等。我覺得難點在於,國內做這個的好像不多,資料也寥寥無幾,只能看源代碼,但是裡面的注釋看得也是一愣一愣的,很多都是靠自己本人揣摩,最近就是在NEON裡面加指令,總體感覺大概知道方向,但是裡面定義的類真的挺難看懂,進度非常慢。只懂點皮毛,希望有經驗的前輩指點指點。


那得取決於什麼語言吧,c的跟c++的比起來肯定不是一個量級的(絕大多數c++的compiler都兼容c的)。


說容易的同學們,考慮過測試嗎?怎麼保證編譯出來代碼的正確性?如果質量不能保證的話,還是個玩具。


你就看看clang到目前為止被修正了多少個bug就知道有多難了


推薦閱讀:

直接看 ISO C++14 的標準文檔學習 C++ 可行嗎?
為什麼很少有用lisp描述演算法?
c和c++這類沒有gc的語言是不是騙自己?
如果沒有PGO,JIT 編譯相比AOT 編譯有哪些優勢?
如何從粗通一門編程語言到精通一門?

TAG:編程語言 | 程序 | C | 編譯器 | Swift語言 |