2019年9月3日 做業一——編譯原理概述前端
1)簡述編譯程序與翻譯程序、彙編程序的聯繫與區別。程序員
① 編譯程序是現代計算機系統的基本組成部分之一,從功能上看,一個編譯程序就是一個語言翻譯程序。可是編譯語言不等同於翻譯語言,編譯語言是源語言想Pascal或者C這樣的高級語言,目標語言是像彙編語言或機器語言那樣的低級語言,這樣的翻譯程序才叫作編譯程序。編程
② 翻譯程序就是把一種語言(源語言)書寫的程序翻譯成另外一種語言(目標語言)的等價程序。後端
③ 彙編程序是一個翻譯程序,它把彙編語言程序翻譯成機器語言程序。架構
2)編譯過程包括哪幾個主要階段及每一個階段的主要功能。編程語言
編譯過程包括詞法分析、語法分析、語義分析、中間代碼生成、代碼優化和目標代碼生成6個階段。工具
階段 | 主要功能 |
①詞法分析 | 是編譯過程的第一個階段,是從左到右一個字符一個字符地讀入源程序,對構成源程序地字符流進行掃描和分解,從而識別出一個個單詞。 |
②語法分析 | 是編譯過程的第二個階段,任務是在詞法分析的基礎上將單詞序列分解成各種語法短語。這種語法短語也成爲語法單位,能夠表示成語法樹。 |
③語義分析 | 審查源程序有無語義錯誤,爲代碼生成階段收集類型信息。 |
④中間代碼生成 | 將源程序變成一種內部表示形式,這種內部表示形式叫作中間語言或中間代碼。所謂中間代碼是一種結構簡單、含義明確的記號系統,這種記號系統能夠設計爲多種多樣的形式。 |
⑤代碼優化 | 對前一階段產生的中間代碼進行變換或進行改造,目的是使生成的目標代碼更爲高效,即省時間和省空間。 |
⑥目標代碼生成 | 把中間代碼變換成特定機器上的絕對指令代碼或可重定位的指令代碼或彙編指令代碼。 |
3)簡述解釋程序與編譯程序的區別。性能
① 解釋程序不須要在運行前先把源程序翻譯成目標代碼,也能夠實如今某臺機器上運行程序並生成結果。工做模式是一個個的獲取、分析並執行源程序語句,一旦第一個語句分析結束,源程序就開始運行而且生成結果。特別適合程序員以交互方式工做的狀況,即但願在獲取下一個語句以前瞭解每一個語句的執行結果,容許執行時修改程序。學習
② 編譯程序是一個語言處理程序,它把一個高級語言程序翻譯成某個機器的彙編語言程序或二進制代碼程序,這個二進制代碼程序在機器上運行以生成結果。程序員能夠先準備好一個在該機器上運行的程序,而後這個程序便會以機器的速度運行,可是在不把整個程序所有翻譯完成以後,這個程序是不能開始運行,也不能產生任何結果,編譯和運行是兩個獨立分開的階段。優化
4)瞭解新開源的華爲方舟編譯器(https://www.openarkcompiler.cn/home),理解它的基本思想與採用的技術路線,談談它對安卓軟件生態會有什麼影響。
方舟編譯器是爲支持多種編程語言、多種芯片平臺的聯合編譯、運行而設計的統一編程平臺,包含編譯器、工具鏈、運行時等關鍵部件。 方舟編譯器還在持續演進中,陸續將上述能力實現和開源。
經過多語言統一IR表示,可實現應用中多種編程語言聯合編譯優化提高性能;在支持多平臺的同時,根據設備特徵提供便捷的開發與部署策略提高效率;將同一應用中的不一樣語言代碼聯合編譯、聯合優化,消除語言間的性能「鴻溝」,下降開發者的優化成本;經過編譯器的語言實現能力和優化能力加強,應用運行時的開銷更小;編譯器與芯片實現軟硬件協同優化,充分發揮硬件能效,應用體驗更佳;支持面向多樣化的終端設備平臺進行編譯和運行,根據設備特徵提供便捷的開發與部署策略,提升開發效率。
方舟編譯器架構示意圖
當前方舟編譯器支持Java/Kotlin程序字節碼的前端輸入,其它編程語言的支持(如 C/C++/JS 等)還在規劃中,方舟編譯器的中間表示(IR)轉換器將前端輸入轉換成方舟IR,並輸送給後端的優化器,最終生成二進制文件,二進制文件與編譯器運行時庫文件連接生成可執行文件,在方舟的運行環境中就可執行該文件。
在知乎上看到,有用戶說到華爲的野心是爲了將Java、JavaScript、Python、C、C++都要翻譯到Maple IR,而且Maple IR是爲了在芯片上運行作優化Wie目的的語言。雖然方舟編譯器在網上爭議仍是很大,有一些程序員對其進行了批評,可是咱們仍是不可否認進步,咱們能夠學習官方文檔,在使用過程當中找到bug,幫助這一技術更加完善。在硬件和軟件都要兼顧的狀況下,共同窗習,技術也是在一次次迭代中進步和完善,未來若是這項技術完善了,我認爲會提升安卓軟件生態的速度,提供給安卓用戶更好的使用感。