《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 業界動態 > 王垠:談編譯器

王垠:談編譯器

2015-09-18
關鍵詞: 編譯器

  由于早期的 Lisp 編譯器生成的代碼效率普遍低下,成為了 Lisp 失敗的主要原因之一。而現在的高性能 Lisp 編譯器(比如 Chez Scheme),其實已經可以生成非常高效的代碼,甚至可以匹敵 C 程序的速度。如果你看得到我腦子里的東西,就會明白這完全不是吹牛,對我來說這是科學的結論。我在這里介紹一下我寫 Scheme 編譯器的經歷,也許你就會從根本上明白為什么我會這么自信。這里的介紹其實不止針對函數式語言,而且針對所有語言的編譯器。
  編譯器是一種神秘,有趣,又無聊的的程序。說它神秘,是因為只有非常少的人知道如何寫出優秀的編譯器。這些會寫編譯器的人,就像身懷絕技的武林高手一樣神出鬼沒。說它有趣,是因為編譯器的技術里面含有大量的“哲學問題”和深刻的理論(比如 partial evaluation)。但為什么又說它無聊呢?因為你一旦掌握了編譯器技術里面最精華的原理,就會發現其實說來說去就那么點東西。編譯器代碼里面的“創造性含量”其實非常低。有些固定的“模式”,幾十年都不變。寫了幾個編譯器之后你就會發現,自己越來越喜歡做被很多人不齒的“界面”一類的東西。這就像做科學做到頭了,想嘗嘗藝術的滋味。
  好了不打擊你積極性了,先來說一說為什么早期的 Lisp 編譯器生成的代碼效率低下吧。在函數式語言的早期,由于它比普通的語言多了一些表達力強大的構造(比如函數作為值傳遞),人們其實都不知道如何實現它的編譯器。很多 Scheme 的編譯器其實只是把 Scheme 編譯成 C,然后再調用 C 語言的編譯器。Haskell 的編譯器 GHC 在早期也是這樣的。而且由于 C 編譯器生成的匯編代碼不完全符合 Haskell 的需求,GHC 里面含有一個 Perl 腳本,專門用于調整這匯編代碼的結構。這個 Perl 腳本,由于它的工作方式毫無原則,被叫做 evil mangler?,F在這個東西已經不存在于 GHC 里面,但從它曾經的存在你可以看出,其實函數式編譯器的技術在早期是相當混沌的。
  在我看來,早期 Lisp 編譯器出現的主要問題,其實在于對編譯的本質的理解,以及編譯器與解釋器的區別。解釋器之所以大部分時候比編譯器慢,是因為解釋器“問太多的問題”。每當看到一個構造,解釋器就會問:“這是一個整數嗎?”“這是一個函數嗎?”…… 這些問題,在編譯器的理論里面叫做“解釋開銷”(interpretive overhead)。編譯的本質,其實就是在程序運行之前分析并且一勞永逸的回答這些“問題”。這樣編譯后的代碼就不再問這些問題,因為它直接就知道那個位置應該出現什么構造,應該做什么事。早期的 Lisp 編譯器,以及現在的很多 Scheme 編譯器出現的問題其實在于,它們并沒有完全的消除這些問題,或者根本沒有消除這些問題。
  當我最早學習 Scheme 語言的時候,我發現 Scheme 有太多的實現,PLT Scheme(現在叫 Racket), MIT Scheme, VSCM, Scheme 48, Bigloo, Chicken, Guile, ...讓人搞不清楚哪一個更好。有些 Scheme 實現顯得更高級一些,但實際用起來總是感覺不放心,因為你心里總想著,這代碼編譯出來到底能不能跟 C 語言代碼比?這也是我后來開始使用 Common Lisp 的原因,因為 Common Lisp 似乎有挺多高效的編譯器(CMUCL,Lispworks,Allegro 等等)。
  直到有一天,我發現了 Chez Scheme,它改變了我對 Scheme 編譯器,以至于整個編譯器概念的理解。當時我只下載了 Chez Scheme 的免費版本,叫做 Petite。Petite 與正式版 Chez Scheme 的區別是,它不輸出二進制代碼,所以你不能把編譯后的代碼拿去銷售。另外出于商業目的,Petite 的出錯信息非常的“簡約”,以至于有時候你不得不用其它的 Scheme 實現,才能找到 bug 的所在。但是一運行就見分曉,Petite 被作為一個“解釋器”直接運行 Scheme 代碼,比其他的 Scheme 實現編譯后的代碼速度還要快很多倍。
  Chez Scheme 導致了我命運的改變,怎么也沒有想到,我最終會成為它的作者的學生。我非常有幸的在 Indiana 大學參加了 Chez Scheme 的作者 R. Kent Dybvig(大家都叫他 Kent,雖然他的名字其實叫 R.)所授的編譯器課程,并且跟他合作研究了一個學期。我可以說,這個課程恐怕是世界上最好的編譯器課程,而我搭上了它的“末班車”。Kent 現在已經離開了 Indiana 大學,被重金聘請到某大公司進行一些機密的項目。誰都不知到他在干什么。
  Kent 單槍匹馬的寫出了 Chez Scheme,世界上唯一的商業 Scheme 編譯器,并且為此成立了自己的公司(Cadence Research Systems)。Chez Scheme 價格不菲,并且不明碼實價。它的價格跟項目的大小和公司的規模有關。有些大公司花重金購買 Chez Scheme 用于一些核心的項目。其中有些為了保證這編譯器的安全,又花了好幾倍的價錢買下了它的源代碼。Kent 的公司只有他一個人,不用操心管理,也不用操心銷售。所以他過的非常舒服,基本是一個不愁吃穿,不問世事的人。
  Kent 是我一生中見過的最神秘,最酷的人。他幾乎從來不表揚任何人,但也不貶低任何人。從冷漠的言語之中,你能感覺到他的內心相對于任何人的完全平等。他的心里有許許多多的秘密,你需要一些技巧才能套出他的真言。他很少發表論文,卻把別人的論文全都看得很透。沒有人知道他的核心技術,他也從來不在乎別人是否了解他的水平。他的名字叫 R. Kent Dybvig,卻從來沒有人知道那個 R. 是哪一個名字的簡寫。他的照片從來不放在網上,如果你真想知道他長得什么樣,我在網上找到一個跟他長得非常相似的人的照片:
  Chez Scheme 生成的“目標代碼”效率之高,我還沒有見到任何其它 Scheme 編譯器可以與之匹敵。而它的“編譯速度”之快,沒有任何語言的任何編譯器可以相提并論(注意我去掉了“Scheme”這個限定詞)。Chez Scheme 可以在 5 秒鐘之內完成從頭到尾的自我編譯。想想編譯 GCC 或者 GHC 需要多少時間,你就明白差距了。
  另外值得一提的是,Chez Scheme 從頭到尾都是 Kent 一個人的作品。它的工作原理是從 Scheme 源程序一直編譯到機器代碼,而不依賴任何其他語言的編譯器。它甚至不依賴第三方的匯編器,所有三種體系構架(Intel, ARM, Sparc)的匯編器,都是 Kent 自己寫的。為什么這樣做呢?因為幾乎沒有其它人的編譯器代碼能夠達到他的標準。連 Intel 自己給自己的處理器寫的匯編器,都不能滿足他的要求。
  如果你上了 Kent 的課,再來看看普通的編譯器書籍(比如有名的 Dragon Book),或者 LLVM 的代碼,你就會發現 Kent 的水平其實遠在這些知名的大牛之上。我為什么可以這么說呢?因為如果你的水平在別人之下,你自己都會對這種判斷產生懷疑。而如果你超過了別人,他們的一言一行,他們的每一個錯誤,都像是處于你的顯微鏡底下,看得一清二楚。實話實說吧,在編譯器這個領域,我覺得 Kent 很有可能就是世界的 No.1。
  如果你不了解 Scheme 的編譯器里面有什么東西,也許就會輕視它的難度。Scheme 是比 C 語言高級很多的語言,所以它的編譯器需要做比 C 語言的編譯器多很多的事情。在 Kent 的編譯器課程的前半段,我們其實本質上是在實現一個 C 語言的編譯器,把一種用“S表達式”表示的中間語言,編譯為 X64 匯編代碼。在后半學期的課程中,我們才加入了各種 Scheme 的先進功能,比如函數作為值(需要進行 closure conversion 以及 closure 優化),尾遞歸優化(tail-call optimization),等等。另外,我還自己為它加入了一種非常漂亮而先進的技術,叫做 online partial evaluation。這種技術可以在一個 pass 就完成普通編譯器需要好幾個 pass 才能完成的優化。所以你看到了,C 語言的編譯器其實連這個 Scheme 編譯器的一半難度都不到。
  Kent 的課程編譯器有非常好的結構,它被叫做“nanopass 編譯器構架”。因為它的每一個 pass 只做很小的一件事情,然后這些 pass 被串聯起來,形成一個完整的編譯器。你也許發現了,這其實就是 LLVM 的構架。但是我可以告訴你,我們的課程編譯器比 LLVM 干凈利落許多,處于遠遠領先的地位。每一節課,我們都學會一個 pass。每一個講義,都非常精確的告訴你需要干什么。每一次的作業,提交的時候都會經過上百個測試(當然 Kent 不可能把 Chez Scheme 的測試都給我們),如果沒有通過就會被拒絕接受。這些測試也可以下載,用于自己的調試。有趣的是,每一次作業我們都需要提交一些自己寫的新測試,目的是用于“破壞”別人的編譯器。所以我們每次都會想出很刁鉆的輸入代碼,讓同學的日子不好過。當然是開玩笑的,這種做法其實大大的提高了我們對編譯器測試的理解和興趣,以及同學之間的友誼。這比起我曾經在 Cornell 選過(然后 drop 掉)的編譯器課程,真是天壤之別。
  在課程的最后,我們做出了一個完整的編譯器,可以把 Scheme 最關鍵的子集,編譯到 X64 匯編代碼,然后通過 GNU 的匯編器,匯編成機器代碼。在最后的一節課,Kent 對我們的學期做了一個總結。他說:“你們現在寫出的這個編譯器里面,含有很多先進的技術。也許過一段時間回頭看這段代碼,你們才會發現它的價值。如果你們覺得自己已經成為了編譯器的專家,那我就告訴你們,你們提交的最快的編譯器,編譯速度比起 Chez Scheme 慢了 700 倍。但是不要灰心,我告訴你們哪些地方可以改進……”
  只有極少數的人見到過 Chez Scheme 的源代碼,我沒有看見過。但是見到過它的人告訴我,Chez Scheme 里面其實只有很少幾個 pass,而不是像我們的課程編譯器有 50 個左右的 pass,這節省了很多用于“遍歷”代碼樹所需要的時間。Chez Scheme 只使用了一些非常簡單的算法,沒有使用論文里很復雜的方法,這也是它速度快的原因之一。比如它的寄存器分配,沒有使用“圖著色”(graph coloring)方法,而是使用非常簡單的類似 linear scan 的算法,最后代碼的效率卻更高。另外,Scheme 使用“S表達式”作為它的語法,使得“語法分析”的速度非常之快。其它語言由于使用了復雜的語法,挺大一部分編譯時間其實花在了語法分析上面。
  實際上,Chez Scheme 早就有了超越 linear scan, SSA 之類的技術,Kent 卻從來沒有為它們發表論文。這是因為他自私嗎?不。如果你問他,他還是會告訴你他用的是什么方法。但是具體的細節,卻是解釋起來非常費事的事情,他為什么無緣無故要費工夫跟你解釋呢?所以很多時候,我都是自己摸索出解決方案,再去套他的口氣,看他是不是一樣的做法。有趣的是在課程進行之中的時候,我發現我的有些突發靈感的做法,其實超越了 Chez Scheme,以至于在某些 pass 會生成比它還要高效的代碼,然而我的編譯器代碼卻比它的還要短?。ó斎唤^大部分時間我的代碼不如 Chez Scheme)。于是我就隱約的發現,Kent 有時候會悄悄的花時間看我的作業,想搞明白我是怎么做的,但他卻不想讓我知道。有一天開會的時候 Kent 沒有來,Kent 的編譯器課程的助教 Andy 不小心說漏了嘴:“因為你寫的代碼,Kent 還在進行一些偵探工作……” 悄悄的從任何人那里得到啟發,吸收并且融入到自己的能力里面,也許就是 Kent 練就如此蓋世神功的秘訣。
  我想,這篇文章就該到此結束了。寫這些東西的目的,其實只是樹立人們對于函數式語言編譯器的信心。它們有些其實比 C 和 C++ 之類語言的編譯器高明很多。我沒有時間也沒有精力去講述這編譯器里面的細節,因為它實在是非常困難,卻又非常優雅的程序。如果你有興趣的話,可以看看我最后的代碼。由于版權原因,有些輔助部件我不能放在網上,所以你并不能運行它,只能看一個大概的形狀。如果你需要一個 Scheme 版本用于學習的話,Chez Scheme 有一個免費的版本叫做 Petite Chez Scheme,可以免費下載。因為 Petite 不提供友好的出錯信息,所以我也推薦 Racket 作為一個替補。

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲综合国产| 久久午夜影视| 国产老肥熟一区二区三区| 9l视频自拍蝌蚪9l视频成人| 亚洲男女自偷自拍| 欧美暴力喷水在线| 国产日韩久久| 国产精品女主播一区二区三区| 999亚洲国产精| 欧美日韩一区在线播放| 久久精品亚洲乱码伦伦中文| 国产精品二区影院| 免费在线观看一区二区| 欧美成人中文字幕| 猛干欧美女孩| 久久视频一区二区| 国产农村妇女毛片精品久久莱园子| 日韩午夜视频在线观看| 国产一区久久| 国产日韩成人精品| 欧美国产日韩精品| 国产精品第一区| 国产精品久久网| 欧美性猛片xxxx免费看久爱| 欧美四级剧情无删版影片| 一区二区三区在线视频播放| 国产一区二区三区久久| 亚洲一级在线| 亚洲欧美另类在线| 亚洲一区二区免费在线| 亚洲国产91色在线| 亚洲一卡二卡三卡四卡五卡| 欧美三区美女| 欧美成人在线网站| 一片黄亚洲嫩模| 久久成人av少妇免费| 亚洲一区二区精品视频| 欧美午夜美女看片| 国产欧美日韩亚洲一区二区三区| 国产一区视频观看| 国产精品久久影院| 制服诱惑一区二区| 欧美在线视频免费观看| 国产一级揄自揄精品视频| 久久久久www| 亚洲专区在线视频| 欧美成人一区二区三区在线观看| 国产精品国产三级国产专区53| 欧美成人午夜激情视频| 欧美福利一区| 裸体素人女欧美日韩| 亚洲一区三区在线观看| 久久亚洲国产成人| 欧美日韩999| 一色屋精品视频免费看| 99精品热视频只有精品10| 欧美精品久久久久久久免费观看| 亚洲电影免费在线观看| 国产亚洲成年网址在线观看| 在线一区二区三区做爰视频网站| 国产一区二区在线观看免费| 亚洲国产欧美另类丝袜| 国产精品久久| 亚洲免费影视第一页| 中国亚洲黄色| 亚洲欧洲三级电影| 99综合视频| 国产日韩欧美综合一区| 日韩视频一区二区在线观看| 国产亚洲成精品久久| 亚洲成色777777女色窝| 国产精品99免费看| 免费观看欧美在线视频的网站| 国产精品久久久一区二区三区| 国产视频不卡| 欧美精品国产精品| 久久综合久久久久88| 久久午夜激情| 国产欧美日韩亚洲| 在线视频精品一| 亚洲精品视频一区二区三区| 欧美不卡一卡二卡免费版| 母乳一区在线观看| 久久久久久香蕉网| 欧美www在线| 国产日韩精品一区二区浪潮av| 亚洲电影av在线| 久热爱精品视频线路一| 最新国产乱人伦偷精品免费网站| 欧美国产亚洲另类动漫| 久久久水蜜桃| 在线观看亚洲精品视频| 久久精品在线视频| 欧美日产一区二区三区在线观看| 亚洲精品影视在线观看| 蜜桃av一区| 亚洲视频一区在线观看| 欧美日韩免费观看一区二区三区| 亚洲精品乱码久久久久| 欧美精品一区三区| 亚洲黄色av一区| 亚洲久久视频| 欧美日韩视频在线一区二区| 欧美日韩精品久久久| 欧美日韩在线三区| 亚洲欧美日韩在线一区| 久久婷婷一区| 欧美精品福利视频| 欧美日韩国产综合在线| 国产精品视频免费一区| 国内精品视频久久| 欧美亚洲一区三区| 久久久天天操| 国产精品乱码一区二三区小蝌蚪| 欧美日本一区二区高清播放视频| 亚洲精品一区中文| 国产日韩在线一区| 一本色道久久99精品综合| 欧美日韩人人澡狠狠躁视频| 亚洲在线视频观看| 极品尤物一区二区三区| 99视频在线观看一区三区| 午夜激情一区| 久久精彩免费视频| 亚洲一区二区三区免费在线观看| 欧美一区二区私人影院日本| 国产精品久久久久9999高清| 国产亚洲一区二区三区在线播放| 亚洲欧美日韩精品一区二区| 亚洲精美视频| 狠狠色伊人亚洲综合成人| 欧美久久综合| 欧美日韩精品在线视频| 99综合电影在线视频| 一区二区三区欧美在线观看| 久久久久久久激情视频| 亚洲每日更新| 久热爱精品视频线路一| 欧美噜噜久久久xxx| 亚洲国产精品久久久久秋霞影院| 亚洲综合视频1区| 国产一区二区三区日韩欧美| 欧美aa国产视频| 国产又爽又黄的激情精品视频| 久久久99精品免费观看不卡| 国产视频一区欧美| 欧美专区日韩专区| 欧美亚州韩日在线看免费版国语版| 亚洲欧美日韩综合aⅴ视频| 欧美激情国产日韩| 亚洲精品久久久久久下一站| 久久9热精品视频| 欧美大香线蕉线伊人久久国产精品| 欧美99在线视频观看| 午夜久久99| 欧美一级片一区| 欧美日韩精品中文字幕| 国产精品系列在线| 蜜桃久久av一区| 国产视频久久久久久久| 在线成人av网站| 欧美一区午夜视频在线观看| 亚洲国产精品久久久久| 欧美一区二视频| 欧美激情一区二区三区蜜桃视频| 国产一区二区激情| 伊人一区二区三区久久精品| 激情成人在线视频| 中文精品视频一区二区在线观看| 国产欧美日韩激情| 国产精品综合色区在线观看| 欧美美女bbbb| 国产精品男女猛烈高潮激情| 亚洲日韩中文字幕在线播放| 国产亚洲一区二区三区在线观看| 亚洲一区久久| 亚洲第一搞黄网站| 欧美日韩国产大片| 久久久国产视频91| 欧美成人午夜77777| av成人动漫| 欧美人与禽猛交乱配视频| 亚洲美女中文字幕| 久久精品国内一区二区三区| 欧美视频在线看| 好看的av在线不卡观看| 欧美国产视频一区二区| 极品少妇一区二区三区| 老司机aⅴ在线精品导航| 欧美精品成人91久久久久久久| 久久久久久久久综合| 国产精品视频男人的天堂| 亚洲第一网站免费视频| 久久婷婷国产综合精品青草| 欧美日韩综合在线免费观看| 欧美日韩一区二区欧美激情| 亚洲国产精品成人综合| 国产精品腿扒开做爽爽爽挤奶网站| 国产精品欧美经典| 国产精品99久久久久久久女警| 欧美激情成人在线视频| 欧美日韩精品一区二区天天拍小说| 欧美精品午夜视频| 国产精品视频999| 一区二区三区国产在线观看| 国产精品亚洲产品| 欧美日韩国产限制| 在线看国产日韩| 亚洲每日更新| 国产精品麻豆va在线播放| 亚洲精品资源美女情侣酒店| 99在线精品视频在线观看| 亚洲精品久久久久久一区二区| 欧美亚洲综合另类| 国产中文一区| 亚洲欧美在线高清| 久久午夜国产精品| 亚洲综合另类| 久久久久国产精品一区| 国产欧美一区二区在线观看| 日韩西西人体444www| 午夜精品区一区二区三| 国产午夜精品麻豆| 欧美高清在线一区| 国产日韩精品在线播放| 亚洲视频电影在线| 美女黄毛**国产精品啪啪| 尤物yw午夜国产精品视频| 欧美日韩亚洲综合一区| 黄色在线一区| 亚洲人成人一区二区三区| 久久精品亚洲一区二区三区浴池| 亚洲尤物精选| 久久精品日韩欧美| 麻豆九一精品爱看视频在线观看免费| 久久av一区二区三区| 欧美日韩爆操| 亚洲一二三四久久| 欧美在线亚洲一区| 亚洲国产综合在线| 亚洲影院在线| 欧美日韩成人综合在线一区二区| 国内精品美女av在线播放| 免费成人av资源网| 国产亚洲精品aa午夜观看| 日韩一级裸体免费视频| 欧美精品一区二区三区四区| 欧美日韩免费视频| 欧美午夜精彩| 国产精品久久久久久久久久免费| 国产老女人精品毛片久久| 欧美区二区三区| 日韩视频二区| 亚洲人成在线观看网站高清| 国产精品久久二区| 亚洲国产一区在线| 狼人天天伊人久久| 国产精品久久7| 欧美日韩在线视频一区| 亚洲一级免费视频| 国产午夜精品一区二区三区欧美| 亚洲欧美日韩在线播放| 国产一区久久久| 好吊日精品视频| 欧美国产日韩精品| 黄色亚洲免费| 亚洲欧美日韩天堂| 亚洲国产电影| 亚洲国产黄色| 欧美日韩在线亚洲一区蜜芽| 国产精品视频午夜| 欧美日韩一级黄| 欧美特黄a级高清免费大片a级| 久久视频一区| 国产精品成人免费精品自在线观看| 日韩午夜在线| 在线观看亚洲专区| 亚洲免费av观看| 亚洲香蕉伊综合在人在线视看| 欧美精品麻豆| 欧美三级不卡| 国产精品久久久久久福利一牛影视| 日韩视频不卡| 亚洲自啪免费| 亚洲香蕉视频| 美女主播一区| 国产精品区一区二区三区| 久久亚洲不卡| 国产精品无码专区在线观看| 宅男噜噜噜66国产日韩在线观看| 亚洲春色另类小说| 亚洲免费在线视频| 亚洲综合久久久久| 亚洲国产精品久久久久秋霞不卡| 亚洲电影在线看| 亚洲人成网站777色婷婷| 欧美亚洲综合另类| 亚洲欧美中文字幕| 欧美激情一区在线| 精品不卡在线| 伊人精品久久久久7777| 国产精品久久久久久模特| 欧美人与性动交α欧美精品济南到| 亚洲欧美在线aaa| 亚洲视频狠狠| 一区二区在线视频观看| 亚洲影视九九影院在线观看| 国产精品网站在线播放| 国产欧美日韩不卡| 鲁大师成人一区二区三区| 国产精品一区二区黑丝| 欧美精品激情在线观看| 亚洲综合国产| 欧美一级片一区| 欧美va天堂va视频va在线| 正在播放日韩| 欧美亚洲专区| 最新亚洲一区| 久久久久久网站| 国产精品久久久久三级| 久久国产精彩视频| 欧美日韩国产综合视频在线观看| 亚洲性线免费观看视频成熟| 国产精品久久亚洲7777| 欧美不卡在线视频| 久久综合色综合88| 亚洲在线视频免费观看| 亚洲免费观看视频|