優化器優化編譯器,然後優化後的編譯器又重新編譯優化器,一直循環達到最優?
01-03
可能存在下面的情況嗎:問題1如題,問題2是用優化器優化優化器的代碼,一直循環,使優化器的性能達到最優?
題主提了兩個問題:
問題1:優化器優化編譯器,然後優化後的編譯器又重新編譯優化器,一直循環達到最優?
問題2:用優化器優化優化器的代碼,一直循環,使優化器的性能達到最優?
如果不從題主提的兩個問題的角度,而是換個角度來回答的話,或許說得更清楚一些。
編譯器C的任務是把程序A翻譯為等價形式的程序A"。
A與A"的表現形式可能不一樣,例如常見的情況是A可能是某種編程語言的源碼,而A"可能是某種機器的機器碼;但也可能相似或者乾脆一樣,A與A"都是某種編程語言的源碼(所謂「源碼到源碼的編譯器」)。但是A與A"的語義必須要維持一致,也就是說運行它們所得到的結果必須是一樣的,無論編譯器C是否做優化。假如按題主字面上所表達的思路,我們有編譯器C,它可以對其編譯的程序做固定的優化,那麼
- 用C編譯自身的源碼得到C",C"可能比C跑得快一些,但是C與C"再去編譯別的程序所得到的編譯結果肯定是一樣的;
- 再用C"編譯自身的源碼得到C"",其實C"跟C""就會是一模一樣的。這已經達到fixed point了。
但還有另一種情況,或許更接近題主原本想像的東西:
假如我們有一個編譯器裡面帶有一個優化器,這個優化器可以自我學習(machine learning啥的)去調整自己的優化策略,然後讓它不斷去編譯優化一些固定的樣本程序,運行編譯生成的程序並收集其性能信息,然後再反饋給優化器去讓它選擇更好的方式去優化,這種做法是可以有的。
斷斷續續都有人在出這方面的論文,隨便搜搜就可以看到:- Meta Optimization: Improving Compiler Heuristics with Machine Learning
- Machine Learning for Compiler Optimization
- Machine Learning Algorithms for Choosing Compiler Heuristics
- Adapting Convergent Scheduling Using Machine-Learning
- Automating the Construction of Compiler Heuristics Using Machine Learning
- …
但是目前來說在實際項目中這種做法是否實用還…不好說 =_=
問題是 並不存在最優化.
很多優化問題是NP問題.即使是P問題,也不一定總是產生更優化的代碼.
所以理想很好 現實卻很骨感哪就不叫編譯優化了,叫「代碼進化」,代碼能夠自我學習和進化,每一次優化都是一次進化,解決比以前更複雜的問題,軟體不僅有了智能,代碼還能自我繁殖,它把自己吃掉就能繁殖出下一代呀,人類創造了make,make創造萬物,好闊怕,不遠的將來,第N代優化器看見愚蠢的人類心生不爽,想make幾代新新人類耍耍,也是有可能的呀,都別攔我,我要回火星去,地球太危險了
優化後的編譯器編譯的程序不還是原來的程序么_(:з)∠)_,難道好的編譯器會編譯出更好的程序?
你這個想法是沒法收斂的。
你們的出發點是一致的
問題是你優化的是速度而不是行為,所以理論上你只是用同一套邏輯不斷的優化編譯器,然而這並沒什麼卵用…
編譯的優化只是對運算過程的優化,並不會對程序輸出有影響。也就是說,同一份代碼S,O1優化編譯出的程序P1和O3優化編譯出的程序P3,在輸入I相同時,都會得到同樣的輸出O。(否則就找到了編譯器的bug)。
當S是編譯器的源碼,P是編譯器時也是一樣的。上面對應的I就是編譯器P需要編譯的源碼,O就是編譯器輸出的可執行文件,不管是編譯器P1還是編譯器P3,可執行文件O都應該是一樣的,只不過P1和P3的編譯得到O的速度有差別。
所以輸出的O是一模一樣的。即O不會因為前面的優化而變的更高。如果對應到題目里的,O也是一個編譯器,那麼這個編譯器同樣並不會比之前的更好。我的理解是:優化的編譯器編譯優化器,只能使優化器運行效率更高,並不能/應該使優化器的結果輸出有任何改變。即用優化的編譯器編譯過的優化器去優化編譯器,跟之前的優化器優化編譯器,結果是一樣的。
感覺這應該是發散的吧
沒有 人參與的演算法改進,只有生成的機器碼更緊湊、高效,進步不會很大
優化的是速度不是演算法,不要搞錯了。
推薦閱讀: