在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

王垠談編譯器

電子工程師 ? 來源:網絡整理 ? 2021-03-30 10:45 ? 次閱讀

由于早期的 Lisp 編譯器生成的代碼效率普遍低下,成為了 Lisp 失敗的主要原因之一。而現在的高性能 Lisp 編譯器(比如 Chez Scheme),其實已經可以生成非常高效的代碼,甚至可以匹敵 C 程序的速度。如果你看得到我腦子里的東西,就會明白這完全不是吹牛,對我來說這是科學的結論。我在這里介紹一下我寫 Scheme 編譯器的經歷,也許你就會從根本上明白為什么我會這么自信。這里的介紹其實不止針對函數式語言,而且針對所有語言的編譯器。

編譯器是一種神秘,有趣,又無聊的的程序。說它神秘,是因為只有非常少的人知道如何寫出優秀的編譯器。這些會寫編譯器的人,就像身懷絕技的武林高手一樣神出鬼沒。說它有趣,是因為編譯器的技術里面含有大量的“哲學問題”和深刻的理論(比如 partial evaluation)。但為什么又說它無聊呢?因為你一旦掌握了編譯器技術里面最精華的原理,就會發現其實說來說去就那么點東西。編譯器代碼里面的“創造性含量”其實非常低。有些固定的“模式”,幾十年都不變。寫了幾個編譯器之后你就會發現,自己越來越喜歡做被很多人不齒的“界面”一類的東西。這就像做科學做到頭了,想嘗嘗藝術的滋味。

好了不打擊你積極性了,先來說一說為什么早期的 Lisp 編譯器生成的代碼效率低下吧。在函數式語言的早期,由于它比普通的語言多了一些表達力強大的構造(比如函數作為值傳遞),人們其實都不知道如何實現它的編譯器。很多 Scheme 的編譯器其實只是把 Scheme 編譯成 C,然后再調用 C 語言的編譯器。Haskell 的編譯器 GHC 在早期也是這樣的。而且由于 C 編譯器生成的匯編代碼不完全符合 Haskell 的需求,GHC 里面含有一個 Perl 腳本,專門用于調整這匯編代碼的結構。這個 Perl 腳本,由于它的工作方式毫無原則,被叫做 evil mangler。現在這個東西已經不存在于 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 源程序一直編譯到機器代碼,而不依賴任何其他語言的編譯器。它甚至不依賴第三方的匯編器,所有三種體系構架(IntelARM, 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 練就如此蓋世神功的秘訣。

責任編輯:lq6

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編譯器
    +關注

    關注

    1

    文章

    1657

    瀏覽量

    49923
  • 匯編器
    +關注

    關注

    0

    文章

    31

    瀏覽量

    11418
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    什么樣的代碼會被編譯器優化

    現在的編譯器有多智能,可能你辛辛苦苦寫的代碼,在編譯器看來就是幾句廢話,直接被刪除掉。
    的頭像 發表于 01-16 16:38 ?517次閱讀

    Triton編譯器與GPU編程的結合應用

    Triton編譯器簡介 Triton編譯器是一種針對并行計算優化的編譯器,它能夠自動將高級語言代碼轉換為針對特定硬件優化的低級代碼。Triton編譯器的核心優勢在于其能夠識別并行模式,
    的頭像 發表于 12-25 09:13 ?758次閱讀

    Triton編譯器如何提升編程效率

    在現代軟件開發中,編譯器扮演著至關重要的角色。它們不僅將高級語言代碼轉換為機器可執行的代碼,還通過各種優化技術提升程序的性能。Triton 編譯器作為一種先進的編譯器,通過多種方式提升編程效率,使得
    的頭像 發表于 12-25 09:12 ?696次閱讀

    Triton編譯器在高性能計算中的應用

    高性能計算(High-Performance Computing,HPC)是現代科學研究和工程計算中不可或缺的一部分。隨著計算需求的不斷增長,對計算資源的要求也越來越高。Triton編譯器作為一種
    的頭像 發表于 12-25 09:11 ?871次閱讀

    Triton編譯器的優化技巧

    在現代計算環境中,編譯器的性能對于軟件的運行效率至關重要。Triton 編譯器作為一個先進的編譯器框架,提供了一系列的優化技術,以確保生成的代碼既高效又適應不同的硬件架構。 1. 指令選擇
    的頭像 發表于 12-25 09:09 ?832次閱讀

    Triton編譯器的優勢與劣勢分析

    Triton編譯器作為一種新興的深度學習編譯器,具有一系列顯著的優勢,同時也存在一些潛在的劣勢。以下是對Triton編譯器優勢與劣勢的分析: 優勢 高效性能優化 : Triton編譯器
    的頭像 發表于 12-25 09:07 ?1066次閱讀

    Triton編譯器在機器學習中的應用

    1. Triton編譯器概述 Triton編譯器是NVIDIA Triton推理服務平臺的一部分,它負責將深度學習模型轉換為優化的格式,以便在NVIDIA GPU上高效運行。Triton編譯器支持
    的頭像 發表于 12-24 18:13 ?901次閱讀

    Triton編譯器支持的編程語言

    Triton編譯器支持的編程語言主要包括以下幾種: 一、主要編程語言 Python :Triton編譯器通過Python接口提供了對Triton語言和編譯器的訪問,使得用戶可以在Python環境中
    的頭像 發表于 12-24 17:33 ?887次閱讀

    Triton編譯器與其他編譯器的比較

    Triton編譯器與其他編譯器的比較主要體現在以下幾個方面: 一、定位與目標 Triton編譯器 : 定位:專注于深度學習中最核心、最耗時的張量運算的優化。 目標:提供一個高度抽象、靈活、高效
    的頭像 發表于 12-24 17:25 ?907次閱讀

    Triton編譯器功能介紹 Triton編譯器使用教程

    Triton 是一個開源的編譯器前端,它支持多種編程語言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供一個可擴展和可定制的編譯器框架,允許開發者添加新的編程語言特性和優化技術
    的頭像 發表于 12-24 17:23 ?1530次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    C7000優化C/C++<b class='flag-5'>編譯器</b>

    Keil編譯器優化方法

    我們都知道,代碼是可以通過編譯器優化的,有的時候,為了提高運行速度或者減少代碼尺寸,會開啟優化選項。
    的頭像 發表于 10-23 16:35 ?1844次閱讀
    Keil<b class='flag-5'>編譯器</b>優化方法

    AI編譯器技術剖析

    隨著人工智能技術的飛速發展,AI編譯器作為一種新興的編譯技術逐漸進入人們的視野。AI編譯器不僅具備傳統編譯器的功能,如將高級語言編寫的源代碼轉換為機器可執行的代碼,還融入了人工智能技術
    的頭像 發表于 07-17 18:28 ?2473次閱讀

    人工智能編譯器與傳統編譯器的區別

    人工智能編譯器(AI編譯器)與傳統編譯器在多個方面存在顯著的差異。這些差異主要體現在設計目標、功能特性、優化策略、適用范圍以及技術復雜性等方面。以下是對兩者區別的詳細探討,旨在全面解析其內在差異。
    的頭像 發表于 07-17 18:19 ?2780次閱讀

    Meta發布基于Code Llama的LLM編譯器

    近日,科技巨頭Meta在其X平臺上正式宣布推出了一款革命性的LLM編譯器,這一模型家族基于Meta Code Llama構建,并融合了先進的代碼優化和編譯器功能。LLM編譯器的推出,標志著Meta在人工智能領域的又一重大突破,將
    的頭像 發表于 06-29 17:54 ?1801次閱讀
    主站蜘蛛池模板: 4hu影院最新地址www | 午夜看一级特黄a大片 | 性欧美bbbbbb | 美女扒开尿口给男人看大全 | 日黄网站| 台湾三级毛片 | a成人毛片免费观看 | 劳拉淫欲护士bd字幕 | 精品视频一区二区三区 | 国产网红精品 | 特一级黄 | 色多多www| 又黄又粗暴的120秒免费gif视频 | 国产香蕉视频在线 | 亚洲夜夜骑 | 色拍拍视频 | 久久久99精品免费观看精品 | 精品国产理论在线观看不卡 | 黄色一级毛片看一级毛片 | 久久天天躁狠狠躁夜夜躁综合 | 天天干天天日天天射天天操毛片 | 久久美女精品国产精品亚洲 | 天天av天天翘天天综合网 | 欧美第一网站 | 午夜影院日韩 | 黑人一区二区三区中文字幕 | 久久第一页 | 黄a级免费 | 色777777女人色| 亚洲高清美女一区二区三区 | 精品一区二区三区自拍图片区 | 最近2018中文字幕免费看在线 | www.xxx欧美| 麻豆三级在线播放 | 久久精品视频7 | 国产国产人免费人成免费视频 | 欧美黄页网 | 天堂色| 天天操天天爱天天干 | 国产亚洲精品aa在线观看 | 免费一级毛片不卡在线播放 |