天天看點

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

原創: 秦隴紀 科學Sciences 今天

科學Sciences導讀:繼本号作業系統、指令集等計算機科普文章後,接着介紹編譯器相關知識。本文按事、人、物的順序,介紹編譯器的發展史、典型人物、技術知識。

編譯器發展史5個十年3大人物及編譯器知識(25289字)

目錄

A編譯器發展史5個十年(6864字)

第一個十年

第二個十年

第三個十年

第四個十年

第五個十年

置身于平行世界

B編譯器發展史3大人物(12591字)

1.世界首個編譯器作者GraceMurray Hopper格蕾絲·穆雷·霍珀

2.編譯器優化創始者JohnCocke約翰·科克

3.矢量化Parafrase編譯系統作者DavidJ. Kuck大衛·卡克

C編譯器知識(5721字)

1工作原理

2種類(▪處理器▪前端▪後端)

3代碼分析

4工作方法

5編譯器優化

6進行對比

7曆史

參考文獻(3832字)

Appx.資料簡化DataSimp社群簡介(835字)

A編譯器發展史5個十年(6864字)

編譯器發展史5個十年

文|Michael Wolfe,科學Sciences20181019Fri

作者:自20世紀70年代就讀伊利諾伊大學研究所學生院以來,Michael Wolfe就一直主攻并行計算方面的語言和編譯器。在此過程中,他與别人創辦Kuck and Associates(已被英特爾收購),在俄勒岡州研究所學生院(自與俄勒岡健康與科學大學合并以來)投身學術界,并在PGI開發高性能Fortran(PGI先被意法半導體收購,最近被英偉達收購)。如今大部分時間,他在一個為高度并行計算、尤其是為英偉達GPU加速器開發和改進PGI編譯器的團隊擔任技術主管。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

如果想了解我們在計算機架構和驅動計算機架構的編譯器方面的現狀,有必要看看編譯器如何在六十年間由一種架構改用另一種架構。

先讓目光回到1957年的第一個在IBM 704計算機上實作的編譯器IBM Fortran,并首次成功運作了FORTRAN程式。之前在1951年,美國IBM公司約翰·貝克斯(John Backus)針對彙編語言的缺點着手研究開發FORTRAN語言(注1:源自于“公式翻譯”的英語FormulaTranslation的縮寫)。FORTRAN是世界上最早出現的計算機進階程式設計語言,廣泛應用于科學和工程計算領域。如果你看看它的起源和取得的成果,付出的巨大努力是今天的人都無法想象的,這種程式設計語言是一項了不起的技術。

IBM想要銷售計算機,想要銷售讓更多的人能夠進行程式設計的計算機。當時程式設計是用彙編語言完成的。這太難了,IBM很清楚這一點。于是藍色巨人希望人們有辦法更快地編寫程式,又不犧牲性能。Fortran的開發人員(注2:指發明Fortran的那些人,而不是發明使用編譯器和語言的程式的那些人)希望利用如今所謂的進階程式設計語言編寫的程式,提供盡可能接近手動調整的機器代碼的性能。

說到編譯器,你必須考慮三個P:性能、生産力和可移植性。Fortran的發明者拿機器代碼的性能作了比較。生産力方面的好處是,程式員再也不必編寫機器代碼。我不知道IBM在可移植性方面的最初意圖,不過你在1957年無法為軟體獲得專利權,IBM也沒有抱怨其他企業組織實作Fortran。是以沒過多久,市面上出現了來自其他供應商的面向其他機器的Fortran編譯器。這立即為Fortran程式提供了機器代碼無法想象的可移植性。

從這一刻起,編譯器開始迅猛發展起來。讓我們看看每個十年的情況。

第一個十年

在20世紀60年代(注3:作者出生前),計算機架構師和編譯器編寫者首先開始考慮并行性。即使那樣,人們仍然認為計算機速度不夠快,速度提升也不夠快,覺得并行性有望解決這個問題。我們看到指令級并行性引入到了Seymour Cray公司的CDC 6600和CDC 7600以及IBM System/360 Model 91中。更為激進的做法是開發出了由伊利諾伊大學的研究人員設計并由Burroughs公司制造的ILLIAC IV、Control Data Corp STAR-100以及德州儀器(TI)Advanced Scientific Computer。CDC和TI的系統是記憶體到記憶體的長向量機,而ILLIAC IV是我們今天所說的SIMD機器。(注4:SingleInstruction Multiple Data,單指令多資料流,能夠複制多個操作數,并把它們打包在大型寄存器的一組指令集。)ILLIAC之是以功能有限,是由于沒有主要的标量處理器,程式設計起來确實很難。面向STAR-100的Fortran編譯器添加了用于描述長連續向量操作的文法。TI ASC機器最值得關注,因為它擁有第一個自動向量化編譯器。TI做了一番了不起的工作,确實提升了當時編譯器分析的最新水準。

第二個十年

20世紀70年代,Cray-1成為第一台商業上大獲成功的超級計算機。它有衆多的跟随者和模仿者,許多讀者可能了如指掌。Cray機器的成功很大程度上歸功于引入了向量寄存器。就像标量寄存器一樣,向量寄存器讓程式可以對小小的資料向量執行許多操作,沒必要從記憶體加載和存儲到記憶體。Cray Research還開發了一種非常大膽的向量化編譯器。它在許多方面與早期的TI編譯器類似,但Cray編譯器擁有讓它非常備受關注的附加功能。其中最重要的一項功能是能夠為程式員提供編譯器回報。

如今開發人員編譯程式時,如果程式含有文法錯誤,編譯器将生成出錯消息。程式員不斷修複這些錯誤并重新編譯,直到擁有一個正常運作的程式。如果開發人員希望程式運作得更快,可以啟用編譯器優化标志,好讓生成的可執行檔案運作得更快——他們希望如此。在大多數計算機上,優化代碼和非優化代碼之間的性能可能相差兩倍,通常差異小得多,比如相差10%、20%或者50%。與之相比的是原始Cray機器上可用的向量指令集。在這種情況下,代碼被Cray編譯器優化和向量化後,程式員常常會看到性能提升5倍到10倍。程式員、尤其是高性能計算(HPC)程式員願意做大量工作,以便将性能提升5倍或更高。

來自Cray編譯器的回報将告訴程式員它在第110行向量化了一個循環(loop),在第220行向量化了另一個循環,但是沒有在第230行向量化循環,原因是第235行有無法被向量化的I/O語句或函數調用。或者,可能存在編譯器無法分析的數組引用,或者某個數組的第二個下标中的一個未知變量阻礙了依賴項分析,是以該循環無法進行向量化。想要獲得向量性能的Cray程式員格外注意這些消息。他們根據這種回報修改了代碼,可能從循環中取出I/O語句,或者将循環推入到子程式,或者修改數組引用以删除某個未知變量。有時他們會添加一個編譯器指令,以便向編譯器傳達可以安全地進行向量化這一資訊,即使編譯器無法通過依賴項分析來确定這一點。

多虧了編譯器的回報,發生了三件事。首先,更多的程式被向量化,更多的程式員得益于Cray向量性能。其次,Cray程式員受過了教育訓練,不再将I/O語句、條件語句和過程調用放入到循環的中間。他們明白一個步長(stride)的資料通路很重要,確定内部循環中的數組通路是一個步長。第三,用Cray編譯器自動向量化的程式可以在來自Alliant、Convex、Digital、富士通、日立、IBM和NEC的許多類似的向量機上重新編譯。所有這些系統都擁有帶向量寄存器的向量處理器和自動向量化編譯器,之前針對Cray優化的代碼在所有這些機器上都可以進行向量化,并很順暢地運作。簡而言之,Cray程式員終于實作了性能、生産力和可移植性這三個目标。

這個編譯器回報有多重要、教育訓練整整一代HPC開發人員為向量機程式設計有多成功,怎麼強調都不為過。每個使用它的人都很高興。那時候,我還在伊利諾伊大學,我們考慮開一家立足于并行化編譯器技術的公司。當然,我們的技術比别人的要好,因為我們是一流的學者。在Cray編譯器的早期階段,使用者抱怨編譯器無法對任何内容進行向量化,因而不得不重寫代碼。我們認為自己有望解決這些問題,于是開了這家小公司專門搞這一塊。幾年後,我們接觸同樣那樣使用者、展示我們用于并行化和向量化循環的工具時,他們回複自己不需要這類工具,因為Cray編譯器已經向量化了所有循環。倒不是說Cray編譯器變得更聰明,不過我确信它會漸漸變得更好。主要是程式員在如何編寫可向量化的循環方面訓練有素。

第三個十年

20世紀80年代,多處理得到了廣泛的實施和使用。早些時候已有多處理器,包括IBM System /370s和Burroughs系統。但是32位單片微處理器的問世推動多處理技術進入了主流。要開一家計算機公司,你不再需要設計處理器——可以徑直購買。你沒必要編寫作業系統,可以購買Unix的許可。隻需要有人全部組裝起來、貼上銘牌。要是有編譯器就好了。Sequent、Encore和SGI都建構了有一個微處理器、性能出色的系統,但如果可以讓一批處理器并行運作,那就更好了。

不像大獲成功的自動向量化,自動并行化基本上一敗塗地。它适用于最内層循環,但要實作大幅的并行加速,通常需要對外層循環進行并行化。不過當然,外層循環增添了控制流的複雜性,常常包括過程調用,現在你的編譯器分析完全崩潰了。一種确實可行的方法是,讓程式員參與其中,分析并行性,并輸入編譯器指令來驅動它。我們由此看到了面向并行循環的各種指令集紛紛出現。Cray、Encore、IBM和Sequent都有各自的指令集,唯一的共同點就是SGI采用Sequent指令。同樣,許多可擴充的系統要傳遞網絡消息,這促使開發了衆多針對特定供應商的、學術性的消息傳遞庫。

第四個十年

20世紀90年代,所有那些消息傳遞庫都被消息傳遞接口(MPI)取而代之,所有那些針對特定供應商的并行化指令都被OpenMP取而代之。出現了擴充性更強的并行系統,比如Thinking Machines CM-5以及有成千上萬個商用微處理器的其他系統。基于微處理器的可擴充系統主要用MPI進行程式設計,但MPI是一個庫,對編譯器來說不透明。MPI作為一種程式設計模型而具有的優點是,雖然通信開銷很大,但通信在程式中是完全暴露的。MPI程式員知道何時插入顯式通信調用,他們不遺餘力地盡可能減少和優化通信。缺點是從程式設計模型的角度來看,它非常低級,MPI程式員沒有得到編譯器的幫助。

OpenMP誕生于針對特定供應商的并行指令集百花齊放的時期,因為使用者需要它。使用者們才不願僅僅為了能在可供使用的所有不同系統上運作程式而将程式重寫12次。OpenMP的整個宗旨就是以同樣的方式彰顯“并行性可以”。不像MPI,編譯器必須支援指令,因為指令是語言的一部分。你無法将OpenMP作為一個庫來實作。

同樣在20世紀90年代,市面上出現了面向單晶片微處理器的SIMD指令集,比如來自英特爾的SSE和SSE2,我們看到編譯器恢複了當時已有20年或25年曆史的同樣的向量化技術,以便自動利用那些SIMD指令。(注5:同注4的SIMD單指令多資料流)

第五個十年

2000年後不久,衆多供應商開始普遍提供多核微處理器。全世界突然意識到必須為大家解決這個并行程式設計問題。

當時,許多應用程式在一塊晶片上的所有核心上以及分布式記憶體節點上使用扁平的MPI程式設計模型。你始終可以添加更多的MPI序号(rank)來使用更高的并行性。這一招效果有限,但是你開始獲得大量序号時,一些MPI程式會遇到擴充問題。資料在每個MPI序号中複制時,記憶體使用會有點失控。一旦你開始在每個節點上放置一二十個核心,複制的每一項資料可供使用的記憶體量是12倍或24倍。如果是為單個節點程式設計,OpenMP及其他共享記憶體并行程式設計模型開始受到追捧。比如在20世紀90年代,英特爾推出了線程構模組化塊(又名TBB);有人聲稱,TBB是如今最受歡迎的并行程式設計語言。

大概在同一時期,異構HPC系統開始出現,不過異構性其實不是新話題。我們在20世紀60年代就遇到了異構性,使用附加的協處理器用于數組處理。附加的處理器大受歡迎,原因是它們可以比CPU更快地完成專門操作。它們常常能夠以小型機的價格提供大型機的性能,大約15年來浮點系統在這方面做得很好。在21世紀初期,有幾款專門為HPC市場開發或加以改造的加速器,比如ClearSpeed加速器和IBM Cell處理器。這兩款産品都取得了一些真正的技術成功,但是HPC市場規模太小,無法支援開發獨立的定制處理器晶片。

這給GPU計算留下了缺口。GPU相對定制加速器的優勢在于,GPU的主打功能很好——早期的主要任務是圖形和遊戲,現在還包括AI和深度學習,是以從最新矽片技術和驅動矽片所需的軟體方面來看,開發處理器非常高昂的成本維持得下去。

伴随異構性而來的是這個顯而易見的問題:我們如何為這些系統程式設計?早在那時,浮點系統提供了在底層使用加速器的子程式庫。程式員調用該庫,HPC使用者可以高效地使用加速器,無需實際程式設計(不過有一些程式員進行了程式設計)。今天,想支援多年來在标量、向量和可擴充系統上開發的衆多應用程式,HPC開發人員需要能夠為加速器高效地程式設計,他們希望程式看起來盡可能正常。使用OpenCL或CUDA可以為你提供了很強的控制性,但是對于現有HPC源代碼的影響可能非常大。程式員通常将有待在加速器上運作的代碼提取到特别注釋的函數中,而且編寫的方式常常與為主機編寫的方式全然不同。這時候,專門為通用并行程式設計設計的基于指令的程式設計模型和語言就有一些優勢,而優秀的優化編譯器大有用場。

置身于平行世界

這給我們引出了另一個至關重要的方面。20世紀60年代為指令級并行性開發的所有技術現在都在微處理器裡面。20世紀70年代的向量處理概念存在于微處理器裡面的SIMD寄存器中。20世紀80年代Cray和基于商用處理器的系統的多個處理器都以多個核心的形式存在于微處理器裡面。今天的微處理器可以說整合了過去50年來所做的全部架構工作,而由于我們現在擁有出色的半導體技術(數十億個門),我們可以這麼做。另外我們現在還有異構性;在一些情況下,我們甚至可以在同一塊晶片上做到異構性。比如說,中國太湖之光系統中的“神威”晶片從封裝的角度來看是一塊晶片,但晶片上每個四分之一的部分都包括一個主處理器和64個計算處理器。是以,它基本上是異構的,程式設計起來更像是CPU-GPU混合體,而不是像多核處理器。

為了充分利用異構的GPU加速節點,程式需要具有很強的并行性,而且是類型合适的并行性。這些高度并行處理器不是通過更快的時鐘提供性能,不是由于某種異常奇特的架構。确切地說,那是由于更多的可用門用于并行核心,而這些并行核心用于緩存、亂序執行或分支預測。商用CPU的所有那些主要任務被排除在GPU之外,結果是大規模并行處理器在合适的核心和應用程式上提供更高的吞吐量。

這讓我們回到了三個P,而性能不是HPC開發人員的唯一目标。程式員需要高性能、良好的生産力和廣泛的可移植性。大多數程式員希望程式隻編寫一次,而不是多次。

在當時隻有節點上的單處理器、所有并行性橫跨節點的時期,程式員可以使用扁平的MPI來應付。這類程式可在一系列廣泛的機器上順暢運作,但這不再是我們現在所置身的HPC環境。我們在一個節點中有多個處理器,有SIMD指令,還有異構加速器,引入了更多類型的并行性。為了獲得可移植性,我們需要能夠編寫針對不同數量的核心、不同的SIMD或向量長度可以高效映射的程式,以及同構或異構的系統,沒必要每次改用新系統就要重寫程式。為了確定生産力,我們需要把其中盡可能多的部分抽取出來。我們使用編譯器為今天的HPC系統試圖做到的是與IBM在六十年前使用第一個Fortran編譯器做到同樣的抽象品質,後者實際上是第一種任何類型的進階語言編譯器。

目标是在如今極其複雜的硬體上獲得盡可能接近手動程式設計的性能。今天,就小小的簡單代碼塊而言,針對英偉達GPU的PGI OpenACC編譯器常常可以提供接近原生CUDA的性能。對于像大型函數這種更複雜的代碼序列,或者整批調用樹被移植到GPU時,接近原生代碼性能要困難得多。

客觀地說,OpenACC編譯器天生處于劣勢。在CUDA中重寫代碼時,程式員可能查明某個資料結構不适合GPU,可能改變資料結構以增強并行性或性能。也許程式員查明程式邏輯的一部分不是很适合GPU,或者查明資料通路模式并不理想,是以重寫該邏輯或循環以改進資料通路模式。如果你在對應的OpenACC程式中進行同樣這些更改,常常也會獲得好得多的性能。但是你最好不這麼做,如果重寫減慢了多核CPU上代碼的運作速度,更是如此。是以,OpenACC代碼可能無法獲得與你花了這番程式設計工作量同樣的性能級别。即便如此,如果OpenACC代碼的性能足夠接近GPU上的CUDA,基于指令的程式設計模型在生産力和可移植性方面的好處常常很明顯。

盡管過去的60年間我們在編譯器技術方面取得了諸多進展,但一些人仍然認為編譯器與其說是解決辦法,還不如說是問題。他們想要的是來自編譯器的可預測性,而不是在背景優化編譯器的進階分析和代碼轉換。這可能引出了這條道路:我們嘗試從編譯器中擷取功能,将更多的責任交到程式員的手裡。有人會說,這正是OpenMP今天所走的道路;我看到的危險是,我們到頭來可能為了可預測性而犧牲了可移植性和生産力。比如說,設想你仍然得使用英特爾的SSE和AVX内部函數,對每個循環進行手動向量化,而不是針對英特爾至強處理器上的SIMD指令進行自動向量化。你實際上在編寫内聯彙編代碼。這具有很強的可預測性,但很少有程式員想要在該層面編寫所有的計算密集型代碼,你要為每一代SIMD指令重寫代碼,或者在非X86 CPU上使用SIMD指令時更是如此。

計算機架構方面任何合理的進步都伴随編譯器技術方面合理的進步。不能僅用那些架構和編譯器所提供的性能來衡量好處,還要用程式從一代HPC系統移植到下一代(不必完全重寫)後,節省的人力和提高的生産力來衡量。

B編譯器發展史3大人物(12591字)

編譯器發展史3大人物

文|秦隴紀,科學Sciences20181107Wed1118Sun

寫出一個作業系統,還是寫出一個編譯器的程式員,哪個更厲害?

一般人可能會想,雖然沒寫過編譯器,但應該寫作業系統比編譯器要簡單多了。

非也!講作業系統實作的書很多,但講編譯器或調試器實作的則極少,參考資料很難找。多年從事開發的程式員,如果需要寫作業系統(類Linux等簡單的),花一定時間能做成;但要寫個編譯器或調試器,則可能束手無策。寫編譯器難在詞法分析、文法分析、邏輯分析、嵌套分解、優化算法、CPU二進制碼對應等,是真正的計算機科學。完全從源碼分析,如GDB源碼,會讓人看不下去而崩潰放棄,更不要說GCC之類的源碼,極其枯燥、抽象、難梳理。事實上,編譯器是與CPU架構一起發展的,從基礎的“程式-指令”體系不斷演進越來越複雜。識字讀書思考的僞專家編寫的CS、EE、IT專業教科書,基本都是碎片化表達的國文知識,缺乏科學性理論和技術演進過程。這方面的差距不是一天兩天是事,而是長期以來外行上司專業領域、不注重科學理論和工程實踐造成的。

這裡,秦隴紀整理維基百科、百度百科、IT網站等公開資料,列舉3名經典編譯器作者、創始者,他們無不具備堅實的數學、邏輯功底。未來再整理其他計算機語言相關的編譯器。

1.世界首個編譯器作者Grace Murray Hopper格蕾絲·穆雷·霍珀

世界上第一位程式員是女性;世界上第一個編譯器也是女性開發的!下面介紹開發世界上第一個編譯器的女牛人:Grace Murray Hopper格蕾絲·穆雷·霍珀。

1.1 啟蒙

格蕾絲·霍珀Grace Hopper(1906–1992)本姓穆雷Murray,Hopper為夫姓。1906年12月9日生于美國紐約一個海軍世家,其祖父軍銜曾達少将。她的外祖父則是一名進階土木工程師,常帶她去上班,她也十分高興地幫着扶紅白相間的測量杆,這培養了她對于幾何學和數學的興趣。Grace的父親因患動脈硬化導緻雙腿截肢,長期住院,這使得作為長女的她從小就更加懂事和勤奮。

Grace回憶她小時候最喜歡上的課是數學課,特别是幾何課。因為在幾何課上,她可以把鉛筆盒裡所有彩色的筆全部拿出來用。雖然她是個女孩子,可是各種量角器、計算尺她都喜歡拿來玩,研究它們的原理和作用。她還做過一些很像男孩子做的事情:她曾經在六、七歲的時候,把家裡所有的鐘都拆開,但是沒有一個成功裝回去,是以還受到了嚴厲的處罰。

1.2 教育

進入大學前,Grace就讀于私立Wardlaw-Hartridge學校。1928年她大學畢業于瓦薩學院(Vassar College)并取得數學和實體的雙學士學位,在校期間是美國資優學生聯誼會(Phi-Beta-Kappa Society)成員(PBK是一個有着兩百多年曆史、很好很強大的學生社團,成員如老布什、克林頓、厄普代克)。随後去耶魯大學(Yale University)攻讀數學碩士,1930年獲碩士學位。1930年6月15日她與VincentFoster Hopper結婚(注1:Vincent是紐約大學英文系教授,1945年過世,Hopper與她沒有生育子女)。

結婚沒多久,Grace就決定攻讀博士。她一邊教書一邊在耶魯大學進修博士學位,并在1934年取得博士學位,前後隻花了四年時間,這算是相當快的。博士論文題為《代數方程可約的一個新準則》(A NewCriterion for Reducibility of Algebraic Equations),但是讓許多人驚奇的是,她是用幾何方法證明這個準則的。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

作為女性,獲得數學博士學位是一個很大的成就,因為在數學上取得成就而獲得博士學位本身就很困難。據統計,從1862-1934年間,全美總共授予1279個博士學位,平均每年不到18個,而女性獲得數學博士學位更是鳳毛麟角。在求職方面,女數學家通常隻能到高中教課,極難上大學講台。但Grace做到了,碩士畢業後被母校瓦薩學院聘任,短短幾年就從助教升到副教授。不過,到這個階段為止,我們還看不出來她會跟計算機産生任何關系。

1.3 轉折

1941年是Grace人生的轉折點。珍珠港事件後,Grace有了從軍念頭,她想加入海軍。當時女性從軍都是做後備軍人,大部分都是護士,要不然就是做後勤。如果是受過高等教育的女性,就會被配置設定去做有關計算的工作。由于家族傳統,她選擇參加海軍的WAVES組織(Women Accepted forVoluntary Emergency Service)。

在馬薩諸塞州北安普敦(Northampton, MA)海軍軍官學校接受教育訓練後,她被授予上尉軍銜。考慮到她的數學背景,她被派到哈佛大學著名計算機專家霍德·艾肯Howard Aiken(1900-1973)教授手下參與Mark I研制工作。Aiken教授是1939年哈佛實體博士,是Mark I、II、III、IV一系列電機計算機的設計及制造者。(注2:Mark I原來叫ASCC(Automatic Sequence Controlled Calculator),由哈佛大學與IBM合資建造,完成于1943年,重35噸,内部線路長達500英裡。但在1944年Mark I啟用典禮之後,IBM和哈佛就鬧翻了,原因是哈佛認為IBM隻是個出錢的财主,主要的智力貢獻是哈佛人的功勞,IBM認為自己也在工程上做了許多研究和創新,而哈佛卻認為那些工程上的創新都不值一提。是以IBM就從哈佛的Mark計劃中退出。後來的十年間,IBM在學術界的主要合作夥伴,變成了哥倫比亞大學。)

Grace從小就喜歡各種計算尺,當她走進哈佛的計算工廠見到這台電機計算機時,她說這是她看過最有趣的計算尺。在她之前,有兩名男工程師在Mark上寫過程式,這兩個男士幫助Grace在三天之内寫出了她的第一個程式。是以算起來,Grace是世界上第三個在電機計算機上寫程式的人。

1.4 榮耀

1945年9月9日,發生了一件對計算機界而言非常重要的轶事。那天的天氣很熱,從業人員把窗戶都打開了,後來有一隻蛾飛了進來,結果那隻蛾死在一隻繼電器裡面,造成電路不通,機器當機,他們沒辦法算出他們要的結果。經過了近一天的檢查,Grace找到了那隻蛾,她設法用她的發夾把那隻蛾弄了出來,還把那隻蛾的屍體貼在她的管理日志上,上面寫道:“就是這個Bug,害我們今天的工作無法完成。”這個消息傳開之後,那個實驗室裡的人每逢老闆詢問為何還沒做出結果時,都把過錯推給Bug。爾後,”bug”(小蟲)和”debug”(除蟲)這兩個本來普普通通的詞彙,成了計算機領域中特指莫明其妙的“錯誤”和“排除錯誤”的專用詞彙流傳至今。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

Grace對計算機界的貢獻相當多,Bug這個名詞的引用,其實隻算是一個小小的插曲。

她對計算機的最大貢獻是發明了世界上第一個編譯器(Compiler),名字叫做A-0。當時沒有任何組合語言及程式語言存在,所有的程式設計人員都要把程式翻譯成機器碼,即“0011000101011”這樣的形式,在紙上打孔,再送到機器裡去讀。Grace進入Eckert-Mauchley公司後産生一種想法,想設計一種程式,讓人可以用類似英文的文法,把想做的事寫下來,然後用這個程式把英文翻譯成機器的文法,交給機器去執行。這個想法就是今日的Compiler(編譯器)。

當初她提出這樣的構想時,衆人皆曰不可。所有人都告訴她計算機隻能做計算,隻能處理數字,計算機是不懂英文的。在50年代,大部分人都尚未意識到計算機是用來處理資訊的工具,所有的人就認為計算機隻是個電腦而已。

Grace Hopper可能是第一個想到這個問題并且有機會做下去的人。爾後,她就到處去演講以籌集資金來做這項計劃。這段期間,有很多朋友問她:“你怎麼這麼勇敢呢?萬一搞砸了,你該怎麼辦?”Grace回答道:“It isalways easier to ask forgiveness than it is to get permission.”(以後要道歉,比現在要拿到錢簡單多了。)這句話後來成為她一生中的至理名言之一。

當初在寫世界上第一個編譯器A-0時,為了向能出錢的老闆炫耀,Grace還設計了三個版本:英文版、德文版、法文版,表明編譯器不僅看得懂英文,也看得懂德文跟法文。但後來德文版和法文版的編譯器都沒再做下去。到1956年,她開發出來一套很完整的程式語言,叫做FLOW-MATIC。

海軍采用了這套系統(這時Grace還是海軍的一員)。因為海軍幅員廣大,如果各地自行稍加将編譯器修改一小部分,就會發生A地的程式在B地無法執行的問題。于是Grace寫了一套程式,用來檢查這些程式之間是不是采用同樣的編譯方式,稱作Validation。後來影響到民間,漸漸發展出一套新的語言,偏向于商業使用的文法,這套程式語言就是著名的COBOL(Common BusinessOriented Language)。這也是Grace Hopper對計算機界的第二個重大貢獻。

那個年代,總共隻有三種程式語言:COBOL、ART、FORTRAN(IBM的産品)。有人把Grace叫做“COBOL之母”,這個稱号雖然被學術界的某些人所反對(因為她沒有直接參COBOL語言的設計工作),但她對COBOL的形成與發展所起的重大作用卻是世人一緻公認的。據20世紀80年代初的統計,全美在運作中的程式有80%是用COBOL語言編寫的,由此可見COBOL語言對計算機應用發展所起的作用。1971年,為了紀念現代數字計算機誕生25周年,美國計算機學會特别設立了“格蕾絲·霍珀獎”,頒發給每年最優秀的30歲以下的青年計算機工作者,是以,“霍珀獎”也是全球電腦界“少年英雄”的标志。1980年,霍珀獲得國際IEEE組織頒發的首屆計算機先驅獎。

1.5 後記

Grace Hopper是個非常amazing的人(常被稱為AmazingGrace),崇拜她的人相當多。雖然她的事迹很多,但是還有很多有類似事迹的人并沒有像她這樣受到衆人的崇拜。由其中一點我們可以看出來:從1947年開始(二戰結束第二年),她獲得第一個榮譽博士學位(賓州大學)以後,她先後被40多所大學授予榮譽博士學位,其中包括芝加哥大學、華盛頓大學、馬裡蘭大學等知名學府。

各種婦女社會團體和學術組織都曾授予Grace各種稱号和獎勵。1991年,布什總統在白宮授予她的“美國國家技術獎”(National Medal of Technology)是其中的最高獎項,她也是至今惟一獲此殊榮的美國女性。她的名言有很多,她自己最喜歡的,也是她最喜歡對所謂的“年輕人”說的(在她年老時,她所謂的年輕人就是“年齡不到我的一半的人就叫做年輕人”),這句話是:“A ship in port is safe, but that is not what ships are builtfor.”(船舶入港安全,但這不是造船目的。)

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

1992年1月7日,華盛頓阿靈頓國家公墓,美國海軍為在元旦淩晨睡夢中安然去世的退休海軍女軍官格蕾絲·穆雷·霍珀(Grace Murray Hopper)舉行了隆重的葬禮。海軍儀仗隊和衆多肅穆的海軍官兵按照海軍的禮儀向這位令人尊敬的長者作最後的告别。千千萬萬的美國人則通過電視轉播觀看了葬禮的實況。格蕾絲·霍珀珍惜生命,她希望能夠活到94歲新世紀來臨那天,卻未能如願。

四年後的1996年1月6日,美國海軍在緬因州的巴斯港(Bath, Maine)為它建立造的一艘阿利·伯克級驅逐艦舉行了隆重的命名儀式,把它命名為“霍珀号”。這是第二次世界大戰以後第一次、整個美國海軍曆史上第二次以一位女性的名字命名一艘戰艦。

2.編譯器優化創始者John Cocke約翰·科克

RISC(Reduced InstructionSet Computer精簡指令系統計算機)架構設計師JohnCocke約翰·科克,1972年獲得IBM公司頒贈給内部員工的最高榮譽稱号“IBM小子”,同年還獲得了美國國家技術勳章和圖靈獎。1991年,老布什總統親自授予他國家科學獎(國家技術勳章和國家科學獎是美國最具榮耀的兩項政府大獎)。作為科學家的一生中,Cocke在高性能系統設計中取得的革命性進步,為資訊技術的發展做出獨一無二的創造性貢獻。在系統架構和編譯器優化研究領域取得了大量進步,他當之無愧地成為編譯器優化的創始者和革新帶頭人。

約翰·科克John Cocke,1925年,出生于北卡羅萊那州(North Carolina)的夏洛特(Charlotte)。他是從機械到數學、又從數學轉到計算機方向上來的學者。1946年,杜克大學(Duke University)先後取得機械工程學士學位和碩士證書,幹了幾年實際工作以後,他又回到母校讀研究所學生,于1956年取得數學博士學位。第二年,他加盟IBM公司直到退休。在IBM開始了他的計算機生涯并為IBM計算機市場的開拓和計算機科學技術的發展,尤其是RISC架構和編譯器優化[11],做出了巨大貢獻。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

中文名:約翰·科克,外文名:John Cocke,國籍:美國,出生地:美國北卡羅來納州夏洛特,出生日期:1925年,職業:IBM老資格的研究員,計算機科學家,畢業院校:杜克大學,主要成就:RISC架構之父、ACM圖靈獎(1987)[12],IEEE約翰·馮諾依曼獎(1994)[13],美國國家科學獎章(1994)[14],代表作品:《各種變換的優化方法》(A Catalogof Optimizing Transformations)。

2.1 學術生涯

他的計算機生涯始于IBM,在計算機市場開拓和計算機科學技術發展均做出巨大貢獻。由于學過機械和數學,基礎紮實、知識面廣,加上科克興趣廣泛,善于動腦,他在IBM許多産品的設計開發和技術問題的解決中都起過至關重要的作用,有衆多的發明創造。在沃特森研究中心,在很長一段時間裡,每當人們有疑難問題需要解決的時候,自然就會說:“找約翰讨論去”。事實上,科克也總能提出有益的建議,因而受到其同僚的普遍敬仰和尊重[11]。

Cocke在IBM公司從事的第一個項目是研究Stretch計算機(世界上第一個“超級計算機”型号),他很快成為大型機專家。1974年,Cocke和他上司的研究小組開始嘗試研發每秒能夠處理300線呼叫的電話交換網絡。為了實作這個目标,他不得不尋找一種辦法來提高交換系統已有架構的交換率。1975年,Cocke研究IBM370的CISC(ComplexInstruction Set Computing複雜指令集計算)系統,發現占總指令數20%的簡單指令發出了80%程式調用,而占總指令數80%的複雜指令卻隻有20%的機會被用到。由此,他提出了RISC概念,其中心思想就是簡化硬體設計,硬體隻執行一部分很有限的最常用的指令,大部分複雜的操作則使用成熟的編譯技術,由簡單指令合成。RISC的最大特點是指令長度固定,指令格式種類少,尋址方式種類少,大多數是簡單指令且都能在一個時鐘周期内完成,易于設計超标量與流水線,寄存器數量多,大量操作在寄存器之間進行。

1980年,Cocke在IBM位于約克城(Yorktown)的華生研究中心(Watson Research Center)裡開始研制IBM801(PowerPC前身),首台RISC機器就作為801微電腦項目的一部分最終開發成功。RISC技術推出以來,由于其優化指令系統帶來運算速度提高的優勢,使得RISC技術在1980年代後期,逐漸在高端伺服器和工作站領域中取代了CISC成為主流微處理器設計架構之一。各個具備一定技術實力的廠家開始在這個架構上研發出自己的處理器,經過近二十年的發展,各大型計算機和超級伺服器都采用RISC架構的處理器。現在,RISC處理器已經成為高性能計算機的代名詞。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

RISC模型

2.2 貢獻成就

科克的貢獻和成就首先是在高性能計算機的體系結構方面。科克是60年代IBM推出的半導體大型計算機,也是世界上第一個“超級計算機”(Supercomputer)型号STRETCH的技術負責人。Stretch包含15萬隻半導體,其速度比IBM上一個主流計算機型号IBM704快75倍。STRETCH首創的靈活的尋址技術、指令提前執行(即流水線技術)、差錯校正碼ECC(Error Correcting Code)等至今仍被廣泛使用着。Stretch共生産了8台,被洛斯阿拉莫斯(Los Alamos)國家實驗室(這是研制出了世界上第一顆原子彈的著名的原子能研究中心)等機構所采用。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

模型

70年代中期,科克又主持了一個801計算機項目。(注3:或叫“80号大樓”項目,這是IBM的傳統,按研制小組所在建築物命名項目) 801計算機原是為每小時能處理100萬次呼叫的全數字電話交換機設計的專用機,但實作中被發展為一種具有小指令集、每個指令都是單位址、有固定格式、以流水線方式重疊執行、指令高速緩存和資料高速緩存則分開并互相獨立的一種超級通用小型機。IBM推出這種體系結構引起加州大學伯克利分校D.Patterson和斯坦福大學J.Hennessy的極大興趣和重視,經過進一步研究、改進和發展,最後形成為一種嶄新的計算機體系結構,即大家熟知的“精簡指令集計算機”RISC(ReducedInstruction Set Computer)。是以,RISC這個名詞雖然是1980年由Patterson提出的,但學術界公認科克是RISC概念的首創者。

除計算機體系結構外,科克在編譯器優化方面有很多重要貢獻。進階語言編譯器發展的初期,技術上不夠成熟,生成的目标代碼大,執行效率低,影響了進階語言的推廣應用。科克對編譯器的代碼生成技術進行了深入研究,提出了一系列優化方法,如過程(Procedure)的內建、循環(loop)的變換、公共子表達式(common subexpression)的消除、代碼移動(code motion)、寄存器定位、存儲單元重用等,編譯器品質大大提高,使編譯技術發展到一個新階段。科克在其主編的《各種變換的優化方法》(A Catalogof Optimizing Transformations, Prentice Hall, 1972)中詳細介紹了這些方法。

此外,科克在磁記錄技術、機器翻譯的統計方法等方面也都有過創造和發明。

在獲得圖靈獎以前,科克于1985年獲得過ACM的另一個獎項:Eckert Mauchly獎。這個獎是1979年紀念世界上第一台電子計算機ENIAC的兩位設計者而設立的,主要用來獎勵在計算機體系結構方面作出傑出貢獻的科學家。1991年,科克又榮獲美國全國性的國家技術創新獎章“National Medal of Technology”。

不知什麼原因,科克沒有出席圖靈獎頒獎儀式,由他的同僚A.Peled代為領獎并緻詞。但科克發表題為“對科學處理器性能的探索”(Thesearch for Performance in Scientific Processors)的書面圖靈獎演說,回顧了他一生追求高性能計算機的曆程,認為對計算機性能影響最大的三個因素是算法、編譯器和機器組織。雖然他本人從事機器組織和編譯器方面研究工作,但他認為,這三者中,算法改進是最重要的。Peled緻詞和科克書面演說全文在《Communicationsof ACM》1988年3月号刊載。

2.3 榮譽

“IBM小子”是RISC(Reduced InstructionSet Computer,精簡指令系統計算機)架構設計師——JohnCocke,在1972年得到的IBM公司頒贈給内部員工的最高榮譽稱号。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

約翰·科克

在IBM以外,他也受到廣泛的認可,獲得無數獎項,其中代表性的有:

ACM圖靈獎(1987)[12]

IEEE計算機先驅獎(1989)[15]

美國國家技術獎章(1991)[16]

美國國家科學獎章(1994)[14]

IEEE約翰·馮諾依曼獎(1994)[13]

國家技術勳章和國家科學獎是美國最具榮耀的兩項政府大獎,在作為科學家的一生中,他在高性能系統設計中取得的革命性進步,Cocke為資訊技術的發展做出了獨一無二的創造性貢獻。在系統架構和編譯器優化研究領域取得了大量進步,當之無愧地成為編譯器優化的創始者和革新帶頭人。

2.4 評價

“從1957到1992年,John Cocke在工作中把自己近40年的精力毫無保留地奉獻給了IBM,他取得了了不起(amazing)的成績”,Cocke的同僚兼密友Peter Capek這樣評價他:“他的經曆非同一般。他因為計算機架構而聞名,但他對很多領域同樣充滿濃厚興趣。包括邏輯模拟(logicsimulation)、編碼理論(coding theory)和編譯器優化(compiler optimization),他都可以把這些技術當成藝術來研究。”Cocke退休後還依然為IBM公司發揮餘熱,直到2002年7月16日病故。

2.5 關于RISC

簡介

RISC(reduced instruction set computer精簡指令集計算機)是一種執行較少類型計算機指令的微處理器,起源于80年代MIPS主機(即RISC機),RISC機中采用的微處理器統稱RISC處理器。這樣一來,能夠以更快的速度執行操作(每秒執行更多百萬條指令MIPS)。因為計算機執行每個指令類型都需要額外的半導體和電路元件,計算機指令集越大就會使微處理器更複雜,執行操作也會更慢。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

RISC&CISC

紐約約克鎮IBM研究中心的JohnCocke證明,計算機中約20%的指令承擔了80%的工作,于1974年,他提出RISC的概念。第一台得益于這個發現的電腦是1980年IBM的PC/XT。再後來,IBM的RISCSystem/6000也使用了這個思想。RISC這個詞本身屬于伯克利加利福尼亞大學的一個教師David Patterson。RISC這個概念還被用在Sun公司的SPARC微處理器中,并促成了現在所謂的MIPS技術的建立,它是Silicon Graphics的一部分。許多目前的微晶片現在都使用RISC概念。

RISC概念已經引領了微處理器設計的一個更深層次的思索。設計中必須考慮到:指令應該如何較好的映射到微處理器的時脈速度上(理想情況下,一條指令應在一個時鐘周期内執行完);體系結構需要多“簡單”;以及在不訴諸于軟體的幫助下,微晶片本身能做多少工作等等。

除了性能的改進,RISC的一些優點以及相關的設計改進還有:

@如果一個新的微處理器其目标之一是不那麼複雜,那麼其開發與測試将會更快。

@使用微處理器指令的作業系統及應用程式的程式員将會發現,使用更小指令集使得代碼開發變得更加容易。

@RISC的簡單使得在選擇如何使用微處理器上的空間時擁有更多的自由。

@比起從前,進階語言編譯器能産生更有效的代碼,因為編譯器使用RISC機器上的更小的指令集。

除了RISC,任何全指令集計算機都使用的是複雜指令集計算(CISC)。RISC典型範例如:MIPSR3000、HP—PA8000系列,MotorolaM88000等均屬于RISC微處理器。

主要特點

RISC微處理器不僅精簡了指令系統,采用超标量和超流水線結構;它們的指令數目隻有幾十條,卻大大增強了并行處理能力。如:1987年SunMicrosystem公司推出的SPARC晶片就是一種超标量結構的RISC處理器。而SGI公司推出的MIPS處理器則采用超流水線結構,這些RISC處理器在建構并行精簡指令系統多處理機中起着核心的作用。

RISC處理器是當今UNIX領域64位多處理機的主流晶片

性能特點一:由于指令集簡化後,流水線以及常用指令均可用硬體執行;

性能特點二:采用大量的寄存器,使大部分指令操作都在寄存器之間進行,提高了處理速度;

性能特點三:采用緩存—主機—外存三級存儲結構,使取數與存數指令分開執行,使處理器可以完成盡可能多的工作,且不因從存儲器存取資訊而放慢處理速度。

1、應用特點:由于RISC處理器指令簡單、采用硬布線控制邏輯、處理能力強、速度快,世界上絕大部分UNIX工作站和伺服器廠商均采用RISC晶片作CPU用。如原DEC的Alpha21364、IBM的PowerPCG4、HP的PA—8900、SGI的R12000A和SUNMicrosystem公司的UltraSPARC-II。

2、運作特點:RISC晶片的工作頻率一般在400MHZ數量級。時鐘頻率低,功率消耗少,溫升也少,機器不易發生故障和老化,提高了系統的可靠性。單一指令周期容納多部并行操作。在RISC微處理器發展過程中。曾産生了超長指令字(VLIW)微處理器,它使用非常長的指令組合,把許多條指令連在一起,以能并行執行。VLIW處理器的基本模型是标量代碼的執行模型,使每個機器周期内有多個操作。有些RISC處理器中也采用少數VLIW指令來提高處理速度。

RISC和CISC差別

RISC和CISC是目前設計制造微處理器的兩種典型技術,雖然它們都是試圖在體系結構、操作運作、軟體硬體、編譯時間和運作時間等諸多因素中做出某種平衡,以求達到高效的目的,但采用的方法不同,是以,在很多方面差異很大,它們主要有:

(1)指令系統:RISC設計者把主要精力放在那些經常使用的指令上,盡量使它們具有簡單高效的特色。對不常用的功能,常通過組合指令來完成。是以,在RISC機器上實作特殊功能時,效率可能較低。但可以利用流水技術和超标量技術加以改進和彌補。而CISC計算機的指令系統比較豐富,有專用指令來完成特定的功能。是以,處理特殊任務效率較高。

(2)存儲器操作:RISC對存儲器操作有限制,使控制簡單化;而CISC機器的存儲器操作指令多,操作直接。

(3)程式:RISC彙編語言程式一般需要較大的記憶體空間,實作特殊功能時程式複雜,不易設計;而CISC彙編語言程式程式設計相對簡單,科學計算及複雜操作的程式社設計相對容易,效率較高。

(4)中斷:RISC機器在一條指令執行的适當地方可響應中斷;而CISC機器在一條指令執行結束後響應中斷。

(5)CPU:RISCCPU包含有較少的單元電路,因而面積小、功耗低;而CISCCPU包含有豐富的電路單元,因而功能強、面積大、功耗大。

(6)設計周期:RISC微處理器結構簡單,布局緊湊,設計周期短,且易于采用最新技術;CISC微處理器結構複雜,設計周期長。

(7)使用者使用:RISC微處理器結構簡單,指令規整,性能容易把握,易學易用;CISC微處理器結構複雜,功能強大,實作特殊功能容易。

(8)應用範圍:由于RISC指令系統的确定與特定的應用領域有關,故RISC機器更适合于專用機;而CISC機器則更适合于通用機。[17]

詞條标簽:非教師,行業人物,教師,人物。詞條統計:浏覽11252次,編輯16次曆史版本,最近更新:w_ou(2018-08-11)。[17]

3.矢量化Parafrase編譯系統作者David J. Kuck大衛·卡克

大衛·卡克David J. Kuck,密西根大學(Universityof Michigan)研究所學生畢業。(注4:奧運會銀牌得主Jonathan Kuck的父親) 1965年至1993年,他是伊利諾伊大學厄本那-香槟分校計算機科學系(Computer Science Department the University of Illinois at Urbana-Champaign)教授,開發了Parafrase編譯系統(1977)——自動矢量化和相關程式轉換(automaticvectorization and related programtransformations)開發的第一個測試平台。作為超級計算研究與開發中心(CSRD-UIUC, Center for Supercomputing Research andDevelopment)主任(1986-93),Kuck上司了CEDAR項目的建設——1988年在伊利諾伊大學完成的分層共享記憶體32處理器SMP超級計算機(a hierarchicalshared-memory 32-processor SMP supercomputer)。[19]

1979年,他建立Kuck and Associates(KAI)公司,以建構一系列行業标準的優化編譯器(aline of industry-standard optimizing compilers),專注于利用并行性(parallelism)。在CSRD之後,Kuck将他的全部注意力轉移到KAI及其在美國國家實驗室(US National Laboratories)的客戶身上。KAI于2000年3月被英特爾收購,Kuck目前在英特爾研究員、軟體和服務組(SSG, an IntelFellow, Software and ServicesGroup),開發人員産品部(DPD, Developer Products Division)任職。

與所有其他面向硬體的成員相比,Kuck是ILLIACIV項目中唯一的軟體人員。Kuck不僅負責開發許多關于如何重新建構計算機源代碼以實作并行性的初步想法,而且還負責教育訓練該領域許多該領域的主要參與者。

3.1 傑出博士論文獎Outstanding PhD Thesis Award

Kuck是1965-1993年的計算機科學教授。1977年,他開發了Parafrase編譯系統,該系統被用作開發關于矢量化和程式轉換的許多新想法的試驗台。他于1985年上司了Cedar的建設,這是一台在伊利諾伊州建造的32處理器SMP超級計算機。他是Kuck and Associates的創始人,并獲得了無數獎項,包括ACM/IEEE的Eckert-Mauchly獎,IEEE計算機學會的計算機先鋒獎,Charles Babbage傑出科學家獎以及[email protected]傑出教育家獎。2015年,Kuck入選工程學院名人堂(College of Engineering Hall of Fame)。

3.2 榮譽Honors

Kuck是美國科學促進會(AmericanAssociation for the Advancement of Science),計算機協會(ACM, the Association for Computing Machinery)和電氣和電子工程師協會(the Instituteof Electrical and Electronics Engineers)成員。他也是國家工程院(the National Academy of Engineering)成員。他赢得了ACM/IEEE頒發的Eckert-MauchlyAward獎和IEEE計算機協會CharlesBabbage獎(the IEEE Computer Society Charles BabbageAward)。Kuck是建立OpenMP的主要貢獻者。OpenMP是一種跨平台,基于指令的并行程式設計方法,在多核環境中尤其友好。2010年,Kuck被ACM和IEEE計算機學會高性能計算創新獎授予Ken Kennedy Award獎。[20][21]

C編譯器知識(5721字)

編譯器

文|秦隴紀,源|百度百科,科學Sciences2018110Thu

編譯器是将“一種語言(通常為進階語言)”翻譯為“另一種語言(通常為低級語言)”的計算機程式。一個現代編譯器的主要工作流程:源代碼(sourcecode)→預處理器(preprocessor)→編譯器(compiler)→目标代碼(objectcode)→連結器(Linker)→可執行程式(executables)。

進階計算機語言便于人編寫、閱讀交流、維護。機器語言是計算機能直接解讀、運作的。編譯器将彙編或進階計算機語言源程式(Source program)作為輸入,翻譯成目智語言(Target language)機器代碼的等價程式。源代碼一般為進階語言(High-level language),如Pascal、C、C++、Java、漢語程式設計等或彙編語言,而目标則是機器語言的目标代碼(Object code),有時也稱作機器代碼(Machine code)。

對于C#、VB等進階語言而言,此時編譯器完成的功能是把源碼(SourceCode)編譯成通用中間語言(MSIL/CIL)的位元組碼(ByteCode)。最後運作的時候通過通用語言運作庫的轉換,程式設計最終可以被CPU直接計算的機器碼(NativeCode)。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

圖1 MS VC++編譯器函數示範圖

中文名:編譯器,外文名:Compiler,别稱:譯碼器,表達式:源代碼→預處理器→編譯器→目标代碼,提出者:葛麗絲·霍普,提出時間:20世紀50年代末,應用學科:計算機,适用領域範圍:計算機,單片機,程式設計語言。

1 工作原理

編譯[1]是從源代碼(通常為進階語言)到能直接被計算機或虛拟機執行的目标代碼(通常為低級語言或機器語言)的翻譯過程。然而,也存在從低級語言到進階語言的編譯器,這類編譯器中用來從由進階語言生成的低級語言代碼重新生成進階語言代碼的又被叫做反編譯器。也有從一種進階語言生成另一種進階語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

圖2 MS宏彙編編譯器

典型的編譯器輸出是由包含入口點的名字和位址,以及外部調用(到不在這個目标檔案中的函數調用)的機器代碼所組成的目标檔案。一組目标檔案,不必是同一編譯器産生,但使用的編譯器必需采用同樣的輸出格式,可以連結在一起并生成可以由使用者直接執行的EXE,是以我們電腦上的檔案都是經過編譯後的檔案。

2 種類(▪處理器▪前端▪後端)

編譯器可以生成用來在與編譯器本身所在的計算機和作業系統(平台)相同的環境下運作的目标代碼,這種編譯器又叫做“本地”編譯器。另外,編譯器也可以生成用來在其它平台上運作的目标代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬體平台時非常有用。“源碼到源碼編譯器”是指用一種進階語言作為輸入,輸出也是進階語言的編譯器。例如:自動并行化編譯器經常采用一種進階語言作為輸入,轉換其中的代碼,并用并行代碼注釋對它進行注釋(如OpenMP)或者用語言構造進行注釋(如FORTRAN的DOALL指令)。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

圖3 ISTool編譯器

處理器

作用是通過代入預定義等程式段将源程式補充完整。

前端

前端主要負責解析(parse)輸入的源代碼,由文法分析器和語意分析器協同工作。文法分析器負責把源代碼中的‘詞塊’(Token)找出來,語意分析器把這些分散的單詞按預先定義好的文法組裝成有意義的表達式,語句,函數等等。例如“a = b + c;”前端文法分析器看到的是“a,=,b,+,c;”,語意分析器按定義的文法,先把他們組裝成表達式“b + c”,再組裝成“a = b + c”的語句。前端還負責語義(semantic checking)的檢查,例如檢測參與運算的變量是否是同一類型的,簡單的錯誤處理。最終的結果常常是一個抽象的文法樹(abstract syntax tree,或AST),這樣後端可以在此基礎上進一步優化,處理。。(注5:token詞義為象征、标志、紀念品、代币、代價券,和sign意思相同但比sign莊重文雅,常用于嚴肅場合。token有語言學詞義:[語言學]語言符号,計算機詞義:[計算機]令牌、标記。秦隴紀認為“符标”更合意,但常見NLP文獻裡token譯為“詞塊”,随大流吧。)

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

圖4 c/c++編譯器選項

後端

編譯器後端主要負責分析,優化中間代碼(Intermediaterepresentation)以及生成機器代碼(Code Generation)。一般說來所有的編譯器分析,優化,變型都可以分成兩大類:函數内(intraprocedural)還是函數之間(interprocedural)進行。很明顯,函數間的分析,優化更準确,但需要更長的時間來完成。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

3 代碼分析

編譯器分析(compiler analysis)的對象是前端生成并傳遞過來的中間代碼,現代的優化型編譯器(optimizing compiler)常常用好幾種層次的中間代碼來表示程式,高層的中間代碼(high level IR)接近輸入的源程式的格式,與輸入語言相關(language dependent),包含更多的全局性的資訊,和源程式的結構;中層的中間代碼(middle level IR)與輸入語言無關,低層的中間代碼(Low level IR)與機器語言類似。不同的分析,優化發生在最适合的那一層中間代碼上。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

圖6 編譯器工作流程

常見的編譯分析有函數調用樹(call tree),控制流程圖(Control flow graph),以及在此基礎上的變量定義-使用,使用-定義鍊(define-use/use-defineor u-d/d-u chain),變量别名分析(alias analysis),指針分析(pointeranalysis),資料依賴分析(data dependence analysis)等。

程式分析結果是編譯器優化(compiler optimization)和程式變形(compiler transformation)的前提條件。常見的優化和變形有:函數内嵌(inlining),無用代碼删除(Dead code elimination),标準化循環結構(loop normalization),循環體展開(loop unrolling),循環體合并,分裂(loop fusion,loop fission),數組填充(arraypadding),等等。優化和變形的目的是減少代碼的長度,提高記憶體(memory),緩存(cache)的使用率,減少讀寫磁盤,通路網絡資料的頻率。更進階的優化甚至可以把序列化的代碼(serial code)變成并行運算,多線程的代碼(parallelized,multi-threadedcode)。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

圖7 編譯器内部結構圖

機器代碼的生成是優化變型後的中間代碼轉換成機器指令的過程。現代編譯器主要采用生成彙編代碼(assemblycode)的政策,而不直接生成二進制的目标代碼(binaryobject code)。即使在代碼生成階段,進階編譯器仍然要做很多分析,優化,變形的工作。例如如何配置設定寄存器(register allocatioin),如何選擇合适的機器指令(instruction selection),如何合并幾句代碼成一句等等。

4 工作方法

首先編譯器進行文法分析,也就是要把那些字元串分離出來。

然後進行語義分析,就是把各個由文法分析分析出的文法單元的意義搞清楚。

最後生成的是目标檔案,也稱為obj檔案。

再經過連結器的連結就可以生成最後的EXE檔案了。有些時候需要把多個檔案産生的目标檔案進行連結,産生最後的代碼。這一過程稱為交叉連結。

5 編譯器優化

應用程式之是以複雜,是由于它們具有處理多種問題以及相關資料集的能力。實際上,一個複雜的應用程式就象許多不同功能的應用程式“粘貼”在一起。源檔案中大部分複雜性來自于處理初始化和問題設定代碼。這些檔案雖然通常占源檔案的很大一部分,具有很大難度,但基本上不花費CPU執行周期。

盡管存在上述情況,大多數Makefile檔案隻有一套編譯器選項來編譯項目中所有的檔案。是以,标準的優化方法隻是簡單地提升優化選項的強度,一般從O 2到O3。這樣一來,就需要投人大量精力來調試,以确定哪些檔案不能被優化,并為這些檔案建立特殊的make規則。

一個更簡單但更有效的方法是通過一個性能分析器,來運作最初的代碼,為那些占用了85一95% CPU的源檔案生成一個清單。通常情況下,這些檔案大約隻占所有檔案的1%。如果開發人員立刻為每一個清單中的檔案建立其各自的規則,則會處于更靈活有效的位置。這樣一來改變優化隻會引起一小部分檔案被重新編譯。進而,由于時間不會浪費在優化不費時的函數上,重編譯全部檔案将會大大地加快。[25]

6 進行對比

許多人将高階程式語言分為兩類:編譯型語言和直譯型語言。然而,實際上,這些語言中的大多數既可用編譯型實作也可用直譯型實作,分類實際上反映的是那種語言常見的實作方式。(但是,某些直譯型語言,很難用編譯型實作。比如那些允許線上代碼更改的直譯型語言。)

7 曆史

20世紀50年代,IBM的John Backus帶領一個研究小組對FORTRAN語言及其編譯器進行開發。但由于當時人們對編譯理論了解不多,開發工作變得既複雜又艱苦。與此同時,Noam Chomsky開始了他對自然語言結構的研究。他的發現最終使得編譯器的結構異常簡單,甚至還帶有了一些自動化。Chomsky的研究導緻了根據語言文法的難易程度以及識别它們所需要的算法來對語言分類。正如Chomsky架構(Chomsky Hierarchy),它包括了文法的四個層次:0型文法、1型文法、2型文法和3型文法,且其中的每一個都是其前者的特殊情況。2型文法(或上下文無關文法)被證明是程式設計語言中最有用的,而且今天它已代表着程式設計語言結構的标準方式。分析問題(parsing problem,用于上下文無關文法識别的有效算法)的研究是在60年代和70年代,它相當完善的解決了這個問題。它已是編譯原理中的一個标準部分。

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

圖8 反編譯器

有限狀态自動機(FiniteAutomation)和正規表達式(RegularExpression)同上下文無關文法緊密相關,它們與Chomsky的3型文法相對應。對它們的研究與Chomsky的研究幾乎同時開始,并且引出了表示程式設計語言的單詞的符号方式。

人們接着又深化了生成有效目标代碼的方法,這就是最初的編譯器,它們被一直使用至今。人們通常将其稱為優化技術(Optimization Technique),但因其從未真正地得到過被優化了的目标代碼而僅僅改進了它的有效性,是以實際上應稱作代碼改進技術(Code ImprovementTechnique)。

當分析問題變得好懂起來時,人們就在開發程式上花費了很大的功夫來研究這一部分的編譯器自動構造。這些程式最初被稱為編譯器的編譯器(Compiler-compiler),但更确切地應稱為分析程式生成器(ParserGenerator),這是因為它們僅僅能夠自動處理編譯的一部分。這些程式中最著名的是Yacc(Yet Another Compiler-compiler),它是由SteveJohnson在1975年為Unix系統編寫的。類似的,有限狀态自動機的研究也發展了一種稱為掃描程式生成器(Scanner Generator)的工具,Lex(與Yacc同時,由MikeLesk為Unix系統開發)是這其中的佼佼者。

在20世紀70年代後期和80年代早期,大量的項目都貫注于編譯器其它部分的生成自動化,這其中就包括了代碼生成。這些嘗試并未取得多少成功,這大概是因為操作太複雜而人們又對其不甚了解。

編譯器設計最近的發展包括:首先,編譯器包括了更加複雜算法的應用程式它用于推斷或簡化程式中的資訊;這又與更為複雜的程式設計語言的發展結合在一起。其中典型的有用于函數語言編譯的Hindley-Milner類型檢查的統一算法。其次,編譯器已越來越成為基于視窗的互動開發環境(Interactive DevelopmentEnvironment,IDE)的一部分,它包括了編輯器、連接配接程式、調試程式以及項目管理程式。這樣的IDE标準并沒有多少,但是對标準的視窗環境進行開發已成為方向。另一方面,盡管在編譯原理領域進行了大量的研究,但是基本的編譯器設計原理在近20年中都沒有多大的改變,它正迅速地成為計算機科學課程中的中心環節。

在20世紀90年代,作為GNU項目或其它開放源代碼項目标一部分,許多免費編譯器和編譯器開發工具被開發出來。這些工具可用來編譯所有的計算機程式語言。它們中的一些項目被認為是高品質的,而且對現代編譯理論感興趣的人可以很容易的得到它們的免費源代碼。

大約在1999年,SGI公布了他們的一個工業化的并行化優化編譯器Pro64的源代碼,後被全世界多個編譯器研究小組用來做研究平台,并命名為Open64。Open64的設計結構好,分析優化全面,是編譯器進階研究的理想平台。

編譯器相關專業術語: [26]

1. compiler編譯器;編譯程式
2. on-line compiler 連線編譯器
3. precompiler 預編譯器
4. serial compiler 串行編譯器
5. system-specific  compiler 特殊系統編譯器
6. Information  Presentation Facility Compiler 資訊展示設施編譯器
7. Compiler Monitor  System 編譯器監視系統

權威合作編輯

“科普中國”百科科學詞條編寫與應用工作項目.資源提供中國電子學會(Chinese Instituteof Electronic)提供資源類型:内容。詳情請大家直接看英文資料https://en.wikipedia.org/wiki/Compiler。詞條标簽:科學百科資訊科學分類,中國電子學會,軟體,網站,網際網路。詞條統計:浏覽558610次,編輯51次曆史版本,最近更新:w_ou(2018-08-12)。

—END—

參考文獻(3832字)

1.wikipedia.Compiler.[EB/OL];wikipedia,https://en.wikipedia.org/wiki/Compiler,2018-11-16.

2.雲頭條.編譯器的“五個十年”發展史.[EB/OL];雲頭條企鵝号,https://new.qq.com/omn/20181103/20181103A1R61K.html,2018-11-03.

3.wikipedia.John Cocke.[EB/OL];wikipedia,https://en.wikipedia.org/wiki/John_Cocke,2018-11-16.

4.Schofield, Jack (2002-07-27). "John Cocke". The Guardian. GuardianMedia Group. Retrieved 2011-05-10. "Cocke's idea was to use fewerinstructions, but design chips that performed simple instructions very quickly.[...] Later, this approach became known as reduced instruction set computing(Risc) [...]"

5.Jelinek, Frederick, "The Dawn of Statistical ASR and MT",Computational Linguistics, 35(4), 2009, pp. 483-494, doi:10.1162/coli.2009.35.4.35401

6.John Cocke, The search for performance in scientific processors: the TuringAward lecture. Communications of the ACM, Volume 31 Issue 3, March 1988, Pages250-253. doi:10.1145/42392.42394

7."National Science Foundation - The President's National Medal ofScience". Nsf.gov. Retrieved 2014-06-19.

8."John Cocke". thocp.net. Retrieved 21 December 2015.

9."John Cocke". Computer History Museum. Archived from the original on2013-05-09. Retrieved 2013-05-23.

10.線上閱讀.編譯器優化創始者:John Cocke.[EB/OL];中國Linux聯盟,http://www.lisdn.com/html/97/n-297.html,引用日期2012-12-05.

11.Association for Computing Machinery.CHRONOLOGICAL LISTING OFA.M. TURING AWARD WINNERS.[EB/OL];ACM官網,https://amturing.acm.org/byyear.cfm,引用日期2015-07-11,通路日期2018-11-16.

12.Institute of Electrical and Electronics Engineers.IEEE John von NeumannMedal Recipients.[EB/OL];IEEE官網,https://www.ieee.org/about/awards/bios/vonneumann-recipients.html#top,引用日期2015-07-11,通路日期2018-11-16.

13.National Science Foundation.The President's NationalMedal of Science: Recipient Search.[EB/OL];National ScienceFoundation官網https://www.nsf.gov/od/nms/recipients.jsp,引用日期2015-07-11,通路日期2018-11-16.

14.Institute of Electrical and Electronics Engineers.Computer Pioneer Award.[EB/OL];IEEE計算機協會官網,http://www.computer.org/web/awards/pioneer,引用日期2015-07-12,通路日期2018-11-16.

15.Office of the Chief Communications Officer,National Medal ofTechnology and Innovation (NMTI).The National Medal ofTechnology and Innovation 1991 Laureates.[EB/OL];The United States Patentand Trademark Office官網,https://www.uspto.gov/learning-and-resources/ip-programs-and-awards/national-medal-technology-and-innovation-nmti,引用日期2015-07-12,通路日期2018-11-16.

16.IT世界網..[EB/OL];IT世界網,http://www.it.com.cn/,通路日期2018-11-16.

17.最近更新:w_ou(2018-08-11).約翰·科克.[EB/OL];百度百科,https://baike.baidu.com/item/%E7%BA%A6%E7%BF%B0%C2%B7%E7%A7%91%E5%85%8B/7868274,2018-08-12,通路日期2018-11-14.

18.blackhu.[IT名人堂] 編譯器優化創始者:John Cocke.[EB/OL];CSDN,https://blog.csdn.net/blackhu/article/details/673604?utm_source=blogxgwz5,2006-04-23.

19.單片機論壇»論壇›非技術區›電子工程師雜談›51hei小林.世界上第一個編譯器的作者--女牛人Grace Murray Hoppe.[EB/OL];51黑電子論壇,http://www.51hei.com/bbs/dpj-55880-1.html,2016-9-24.

20.Alumn.David J. KuckOutstanding PhD Thesis Award.[EB/OL];the University of Illinoisat Urbana-Champaign,https://cs.illinois.edu/about-us/awards/graduate-fellowships-awards/david-j-kuck-outstanding-thesis-awards,通路日期2018-11-16.

21.wikipedia.David Kuck.[EB/OL];wikipedia,https://en.wikipedia.org/wiki/David_Kuck,2018-03-13.

22.秦隴紀,計算機的數學思想源頭(回複“計算機數學”可下載下傳PDF典藏版).[EB/OL];資料簡化DataSimp,https://mp.weixin.qq.com/s/JLGCOPN-OIyfyM5Rb0EKIw,2018-04-16.

23.最近更新:ActLikeDove(2018-10-28).約翰·馮·諾依曼.[EB/OL];百度百科,https://baike.baidu.com/item/%E7%BA%A6%E7%BF%B0%C2%B7%E5%86%AF%C2%B7%E8%AF%BA%E4%BE%9D%E6%9B%BC/986797,2018-10-28,通路日期2018-11-18.

24.編譯互動的部落格,胡月軍聊天的部落格.置頂:從實戰中了解編譯原理1(一斷、二比、三譯).[EB/OL];wikipedia,http://blog.sina.com.cn/compileinteract,2013-07-16,引用日期2013-07-31.

25.David Levinthal Vladimir Tsymbal.注重性能的編譯器使用:電腦程式設計技巧與維護,2005年:08期.

26.最近更新:w_ou(2018-08-12).編譯器.[EB/OL];百度百科,https://baike.baidu.com/item/%E7%BC%96%E8%AF%91%E5%99%A8,2018-08-12,通路日期2018-11-14.

x.秦隴紀.資料簡化社群Python官網Web架構概述;資料簡化社群2018年全球資料庫總結及18種主流資料庫介紹;資料科學與大資料技術專業概論;人工智能研究現狀及教育應用;資訊社會的資料資源概論;純文字資料溯源與簡化之神經網絡訓練;大資料簡化之技術體系.[EB/OL];資料簡化DataSimp(微信公衆号),http://www.datasimp.org,2017-06-06.

編譯器發展史5個十年3大人物及編譯器知識(25289字)

秦隴紀

簡介:編譯器發展史5個十年3大人物及編譯器知識。公号回複“編譯器”文末“閱讀原文”可下載下傳31k字1表17圖21頁PDF資料,歡迎轉發、贊賞、支援科普。藍色連結“科學Sciences”關注後下方菜單項有文章分類頁。作者:秦隴紀。來源:Michael Wolfe/維基百科/百度百科/資料簡化社群/秦隴紀微信群聊公衆号,引文出處附參考文獻。主編譯者:秦隴紀,資料簡化DataSimp/科學Sciences/知識簡化新媒體創立者,資料簡化社群創始人OS架構師/C/Java/Python/Prolog程式員,IT教師。每天大量中英文閱讀/設計開發調試/文章彙譯編簡化,時間精力人力有限,歡迎轉發/贊賞/加入支援社群。版權聲明:科普文章僅供學習研究,公開資料©版權歸原作者,請勿用于商業非法目的。秦隴紀2018資料簡化DataSimp綜合彙譯編,投稿合作、轉載授權、侵權錯誤(包括原文錯誤)等請聯系[email protected]溝通。歡迎轉發:“資料簡化DataSimp、科學Sciences、知識簡化”新媒體聚集專業領域一線研究員;研究技術時也傳播知識、專業視角解釋和普及科學現象和原理,展現自然社會生活之科學面。秦隴紀發起,期待您參與各領域~~

Appx.資料簡化DataSimp社群簡介(835字)

資訊社會之資料、資訊、知識、理論持續累積,遠超個人認知學習的時間、精力和能力。應對大資料時代的資料爆炸、資訊爆炸、知識爆炸,解決之道重在資料簡化(DataSimplification):簡化減少知識、媒體、社交資料,使資訊、資料、知識越來越簡單,符合人與裝置的負荷。資料簡化2018年會議(DS2018)聚焦資料簡化技術(DataSimplificationTechniques):對各類資料從采集、處理、存儲、閱讀、分析、邏輯、形式等方面做簡化,應用于資訊及資料系統、知識工程、各類資料庫、實體空間表征、生物醫學資料,數學統計、自然語言處理、機器學習技術、人工智能等領域。歡迎投稿資料科學技術、簡化執行個體相關論文送出電子版(最好有PDF格式)。填寫申請表加入資料簡化DataSimp社群成員,應至少一篇資料智能、程式設計開發IT文章:①高品質原創或翻譯美歐資料科技論文;②社群網站義工或完善S圈型黑白靜态和三彩色動态社群LOGO圖示。論文投稿、加入資料簡化社群,詳情通路www.datasimp.org社群網站,網站維護請投會員郵箱[email protected]。請關注公衆号“資料簡化DataSimp”留言,或加微信QinlongGEcai(備注:姓名/機關-職務/學校-專業/手機号),免費加入投稿群或“科學Sciences學術文獻”讀者微信群等。長按下圖“識别圖中二維碼”關注三個公衆号(搜名稱也行,關注後底部菜單有文章分類頁連結):

資料技術公衆号“資料簡化DataSimp”:

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

科普公衆号“科學Sciences”:

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

社會教育知識公衆号“知識簡化”:

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

(轉載請寫出處:©秦隴紀2010-2018彙譯編,歡迎技術、傳媒夥伴投稿、加入資料簡化社群!“資料簡化DataSimp、科學Sciences、知識簡化”投稿回報郵箱[email protected]。)

普及科學知識,分享到朋友圈

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

轉發/留言/打賞後“閱讀原文”下載下傳PDF

閱讀原文

編譯器發展史5個十年3大人物及編譯器知識(公号回複“編譯器”下載下傳PDF資料,歡迎轉發、贊賞、支援科普)

微信掃一掃

關注該公衆号

繼續閱讀