編譯器後端優化有哪些經典的必讀論文?


經典的文獻有很多,但不一定都用得上;囿於個人能力,更難列出」必讀「之類的單子。。

找文獻的話,可能有各種方法:

龍、虎、鯨等書每章最後的Reference;

PLDI/POPL/...每年的Best paper;

CompIiler相關高級課程的Reading Lists;

某個作者/團體評出的Most influence paper。。

下面是個人體會:

1. 通讀綜述性/工具書性的文章/書籍,如《The garbage collection handbook》《The SSA Book》《Principle of Program Analysis》之類的。

2. 熟悉乃至參與相關的工具項目:經典的和當前的,工業界的和學術界的。。

在這些過程中,自然會接觸到各種文獻,建立類似」知識圖譜「的東西;

而當你能跟進state-of-art的工作,經典的差不多都知道,該看的大概也讀不少了。。

換言之,可以從下面兩個角度來看(只是一種參考):

1. 怎樣成為相關領域合格的Phd乃至做開創性的工作?

2. 怎樣才能去相關領域的頂尖公司乃至自己做東西發大財?

幸運的是,CS某些領域(比如體系結構、編譯)的人在兩個層次都能混得比較爽。。

補充一下相關工具/項目:

JavaScript

引擎:V8、xxMonkey

分析:JSAI、TAJS

驗證:lambda_{JS}、JSCert 等等

另外Self,Smalltalk有幾篇經典的論文(Dynamic typing、Visual Machine相關)。

Infrastructure

編譯:LLVM,Chris的碩士論文可以看看

分析:SUIF,Soot(針對Java的)

二進位分析:BAP、BitBlaze

Microsoft CLR和DLR也可參考

Java、C、Haskell相關的不再列出。。


幾乎經典的論文都在龍書里用簡單的例子和易懂的描述給咱總結好了。現在編譯優化的論文都是很有針對性的了,一些還沒有經過時間的檢驗。純編譯的會如cgo和cc你可以按照引用次數參考並按照自己的需求看是否有必要讀。嵌入式編譯會如lctes,並行編譯會如pact,還有那些包含編譯內容的大會如pldi也都可以按照引用參考。但是還是建議把04年的cgo會議llvm那篇額外讀一一下,

llvm: a compilation framework for lifelong program analysis and transformation

看看編譯器的革新是在什麼背景,出於什麼目的進行的,相信會有啟發。

還要需要說明的很重要的一點是很多優化技術是基於interprocedural analysis的,而這些跨函數優化要基於指針分析,雖然當前利用指針分析來進行跨函數優化的論文不少,但是都是學術上的,真正的編譯器如gcc,open64或llvm並不會用在實際當中。同樣,soot, wala, chord, doop等分析工具對java也是類似的情況,這裡不包括JIT的優化,詳見文章TOPLAS"07 fast online pointer analysis。這主要是因為指針分析受語言的一些特性的影響,造成最終結果可能不sound, 例如c語言的pointer arithmetic,java的reflection等,但是優化卻恰恰需要sound的結果,因此真正編譯器和分析器中能用的優化大都是基於intraprocedual analysis的。


PLDI 出過一部合集,Best of PLDI 1979-1999。裡面有不少是關於編譯器後端技術的奠基性文章。可以參考一下:)


Making Graphs Reducible with Controlled Node Splitting

這個問題好像根本就沒什麼人討論。很多網上的教程在這裡直接就糊弄過去了,雖然糊弄過去影響也不大。反過來看,這篇的確是必讀的,因為類似的內容別的地方根本就找不到嘛 (逃


http://www.cse.unsw.edu.au/~cs4133/Papers/ssapre.toplas97.pdf

50頁,慢慢看吧


後端那主要就是寄存器分配和指令調度了。寄存器分配經典的就是那兩篇了。指令調度對有大窗口的亂序執行的處理器來說,影響已經不大了。寄存器分配和調度的互相影響一直是個有趣的問題


推薦閱讀:

繼續學習編譯原理的意義是什麼?
設計應用的二進位存儲格式有什麼要點?
各個編程語言的發明者是否能夠隨便反編譯各自的已編譯的二進位文件?
編譯原理學了有什麼用?

TAG:編程語言 | 編程 | 優化 | 編譯原理 | 編譯器 |