近十年來編譯器有哪些關鍵的技術進步?

從前端,中間表示,到後端,有沒有什麼比較重要的技術進步是鯨書,龍書(第二版),《現代體系結構優化編譯器》,《garbage collection handbook》這些書都沒有提到的呢?


先主要說三個:

  • Compiler Infrastructure: LLVM

  • Compiler for Dynamic Language:Chrome V8, Firefox SpiderMonkey等

  • Program Analysis

它們的特點是:思想/技術上大多都是已有的,但是都有亮點

像LLVM,Link-time、Run-time、Compiler-time多階段優化,不是很新潮的思想;各種基於CFG、SSA的分析、優化,在傳統的Fortran/C++中幾乎用到極致;LLVM的IR算一種typed SSA,函數式語言的編譯中也早已採用;與它定位類似的Stanford SUIF也挺通用的。它的偉大之處就在於,能把已有技術很好地整合到一個系統,比同類(如SUIF)更有野心,並且在這個框架之下,能方便不斷融合新的技術——這些年不少論文的成果都被整合到LLVM中。我覺得這是一個大的進步。

再來說動態語言的編譯,以JavaScript為代表。新世紀以來(主要是最近五六年),JS引擎可謂突飛猛進(最近有所下降。。)。它們在技術上進步大么?V8的hidden class + inline caching技術起源於Smalltalk,SpiderMonkey的nan-boxing來自Lua JIT,而JIT、GC等技術有教科書式的JVM(當然也有其他歷史積累)。針對動態語言的Type specialization(動態的type feedback,靜態的type inference)算是這些年發展比較多的,將來會更多地採用異構分析——將兩者結合。 動態語言的實現,應該說是有所進步的,工業界+學術界都有比較強的驅動力,相信會有更多的技術進步。。

剛剛說到type inference,有些同學會說:函數式語言不早有了。由此引出第三個話題,program analysis。講LLVM時也說到,傳統的Fortran/C++用到很多Program Analysis(Data flow analysis, Pointer analysis,等等),函數式語言中加一個Type Inference,而且它們已經比較成熟,成熟到快做不下去了。。於是呢,這些年有個趨勢:把老技術移植到新語言,面向對象如Java,動態如JavaScript。當然這個移植也沒那麼簡單,,另外傳統的演算法層面,也是有一些進步的。。

PS: @TwoFrogs 在這方面比較專業。。

-------------------

待補充:Certified compiler,Multicore相關,函數式語言相關,GPU相關。。各種。。 @邵成 可以補充一下函數式語言的。。。

我先趕倆文章。。


https://www.haskell.org/haskellwiki/Research_papers

當然其中列的文獻也不完全都是函數式編譯器的進展,像怎麼寫逼格更高函數式程序的functional pearls,或者類型系統可以再擴展下什麼的,不算在內。

函數式的編譯優化技巧也很多,deforestation/fusion,inlining,strictness analysis等等,隨便一個拎出來又是幾十頁綜述才能講清楚的事,才疏學淺,只能搬運鏈接,各位自己體味了。


http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.78.2542rep=rep1type=pdf 這篇論文可以看一下


編譯器實在是太過悠久,也太過重要,無數人都在研究,於是編譯器的前端技術幾乎都被前人榨乾了,相當成熟了。現在的編譯器的主要賣點就是功率消耗與優化,比如編譯時候所需的時間、空間以及所執行的程序優化後的表現等。而這裡所說的功率消耗與優化,根本沒有辦法榨乾,如同人的慾望一樣,永遠想更好更快(如F1追求極速一樣,這就是本質上的一種追求)。而現在編譯器的優化方面,在我的閱歷中,沒有那種石破天驚的優化技術(如果出現了,我覺得你們都一定能聽到,因為這個不拿獎真的說不過去)。做優化其實是一件苦活,有時候甚至是一件體力活,同時也是一門玄學,無法摸到卻又真實存在。就目前而言,要達到非常好的優化,很多時候只有與硬體一起配合,這是沒有辦法的事情(也許抽象一個無限接近於底層性能表現的VM可以去辦到通用吧,這也是很多研究VM的想法,不斷提高VM的性能表現),於是可以發現能自己做硬體的公司都有自己的編譯器部門,這不是編譯器賺錢與否的問題,是不搞不行,能開編譯器部門的公司幾乎沒有想過靠編譯器部門賺錢,是養著這群人。編譯器最近因為LLVM的出現又火了一下,LLVM IR是我覺得很不錯的一種中間表示,至少讓我眼前是一亮的感覺。LLVM的目標也很偉大,但是我覺得Apple算是目前LLVM實現目標的最佳孵化場合了。


分散式編譯算不算?

還有所謂數據驅動型編譯器,說實話我沒弄懂什麼意思,但是不明覺厲。

可能編譯器優化方面已經只剩下死磕了,但是編譯方式方面似乎還是有潛力可挖。


說個非主流的, 剛剛看 湖的一篇論文, 把三維物體形狀編譯成針織機指令 算不算?


推薦閱讀:

微軟的 C# 難學嗎?和 Python 比起來
Scala 編譯器是如何實現Nothing、Null 這種bottom type的?
printf("%s", NULL) 和 printf("%s
", NULL) 的區別?

怎樣學習 Clojure?
現代編程語言需要具備什麼要素?

TAG:編程語言 | 編譯器 | 中間表示編譯原理 |