編譯原理概述


1)簡述編譯程序與翻譯程序、匯編程序的聯系與區別。
   翻譯程序是指把高級語言源程序翻譯成機器語言源程序的軟件。
翻譯程序有兩種:一種是編譯程序,它將高級語言源程序一次性全部翻譯成目標程序,每次執行程序時,只要執行目標程序。另一種是解釋程序,它的執行過程是翻譯一句執行一句,並且不會生成目標程序。
編譯程序是先完整編譯后運行的程序;解釋程序是一句一句翻譯且邊翻譯邊執行的程序。

匯編程序也是一種語言翻譯程序,它把匯編語言源程序翻譯成機器語言程序。
編譯程序與匯編程序的區別:如果源語言是諸如C、C++、Java等“高級語言”,而目標語言是諸如匯編語言或機器語言之類的“低級語言”,這樣的一個翻譯程序稱為編譯程序。如果源語言是匯編語言,而目標語言是機器語言,這樣的一個翻譯程序 稱為匯編程序
2)編譯過程包括哪幾個主要階段及每個階段的主要功能。

編譯過程通常分為詞法分析、語法分析、語義分析、中間代碼生成、代碼優化和目標代碼生成六個主要階段。各個階段的主要功能如下:
詞法分析階段:讀入源程序,對構成源程序的字符流進行掃描和分解,識別出一個個單詞,並表示成計算機內部的形式。
語法分析階段:在詞法分析的基礎上,將單詞序列分解成各類語法短語,確定整個輸入串是否構成語法上正確的程序。
語義分析階段:審查源程序有無語義錯誤,為代碼生成階段收集類型信息。
中間代碼生成階段:將源程序翻譯成一種復雜性介於源程序與目標程序之間的內部形式(中間代碼)。
代碼優化:對前階段產生的中間代碼進行等價交換,目的是使將來生成的目標代碼更為高效。
目標代碼生成:把中間代碼變換成待定機器上的絕對指令代碼或可重定位的指令代碼或匯編指令代碼。

3)簡述解釋程序與編譯程序的區別。
   編譯程序能生成目標程序,而解釋程序不能。
編譯程序是整體編譯完了,再一次性執行。
而解釋程序是一邊解釋,一邊執行。 解釋一句后就提交計算機執行一句,並不形成目標程序。就像外語翻譯中的“口譯”一樣,說一句翻一句,不產生全文的翻譯文本。

編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快。
而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯后的程序運行的快的。這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言(是二進制的形式)

 

4)了解新開源的華為方舟編譯器(https://www.openarkcompiler.cn/home),理解它的基本思想與采用的技術路線,談談它對安卓軟件生態會有什么影響。
   編譯器是一種將“高級語言”翻譯為能直接被計算機或虛擬機執行目標代碼的程序,編譯器的效率直接影響程序運行性能和效率。
谷歌此前多次調整過安卓的編譯器模式,從Dalvik虛擬機、到JIT、再到ART,在Android 7.0版本,谷歌采用了AOT+ JIT+解釋執行的混合模式,為了達到一個安裝時間、空間占用和性能之間的平衡。
但熊軍民認為目前Android依然存在邊解釋邊執行的代碼運行方式,Google也多次調整編譯代碼的模式,但是相比iOS依然有性能差距。
而方舟編譯器則解決了這一問題。
方舟編譯器最大的優勢在於它繞過了VM。方舟編譯器是首家完全替代語言虛擬機的靜態編譯器,完全不需要解釋器。兼顧Java開發效率和C語言運行效率的編譯器。
相比安卓現有的編譯機制,方舟編譯器擁有3大優點:
1.方舟編譯器是一種靜態的編譯方式,而現有的安卓系統,運行一個應用程序首先啟動虛擬機,然后讀入應用程序代碼,逐條解釋執行。會占用較多的處理資源,影響程序執行的效率。當然,也有包括AOT或JIT等提前或運行時的編譯技術,把部 分程序轉換成機器碼直接在CPU上執行。但是,仍就無法做到100%做到擺脫虛擬機的執行,這也是當前安卓陣營不如IOS陣營的關鍵。
2.華為方舟編譯器的靜態編譯方式可將語言里的動態特性直接翻譯成機器碼,手機安裝應用程序后可全速運行程序,徹底消除虛擬機的弊病,帶來效率上的極大提升。
3.方舟編譯器是在開發環境部署的編譯器,而現有編譯過程,主要發生在手機上,帶來額外的資源消耗。
有鑒於此,華為方舟編譯器能帶來系統性能的顯著提升。
1.EMUI 9.1對系統主要服務System Server進行靜態編譯化。帶來了系統流暢度提升24%,系統響應性能提升44%以上的收益。
2.微博極速版實現了靜態化編譯后,流暢度提升高達60%。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM