計算機程序設計

播音員 - 是...編譯器的類型。 轉換和廣播節目

程序,以及人們從一種語言翻譯到另一個需要一個翻譯或翻譯。

基本概念

該方案是計算語言學表示:ⅰ→第→P(i)中。 解釋器是被提供給輸入程序P和一些輸入x的程序。 它執行為P X:I(P,X)= P(x)的。 那只有一個翻譯器能夠執行所有可能的方案(可在正式的系統來表示)的事實是非常深刻的,顯著發現圖靈。

該處理器的機器語言程序的解釋。 一般太貴編寫高級語言翻譯,讓他們轉化成一種形式,更容易理解。

有些種類的翻譯有很奇怪的名字:

  • 彙編翻譯彙編語言程序轉換成機器語言。
  • 編譯器把高層次的語言,以較低的語言。

廣播器 - 是一個程序,在一些語言S IN這樣的方式,它們都具有相同的語義作為輸入數據的程序,並產生T項目:P→X→Q.即,∀x。 P(X)= Q(x)的。

如果廣播整個程序分成東西可解釋的,它被稱為執行,或AOT編譯之前彙編。 AOT編譯器可以串聯使用,其中後者往往是彙編程序,例如:

源代碼編譯→(譯者)→→彙編代碼彙編器(編譯器)→→CPU機器代碼(解釋程序)。

如果程序被廣播,當由其它先前編譯一部分執行操作發生或者動態編譯。 JIT編譯器記住他們已經這樣做不會一次又一次重複的源代碼。 他們甚至可以產生基於程序執行環境的行為是自適應的編譯和重新編譯。

許多語言允許在編譯時執行代碼,並在運行時編譯新的代碼。

平移台

廣播包括分析和綜合的步驟:

源代碼分析器→→→概念表示(合成器)→目標代碼。

這是由於這些原因:

  • 任何其它方法是不適合的。 詞翻譯根本不起作用。
  • 良好的工程解決方案:如果你想寫進行有針對性的需要只寫M + N簡單的程序(polukompilyatorov)M和N源語言,而不是M×N個複雜的翻譯(筆譯總的)。

然而,在實踐中的很少足夠的表現力和足夠強大的概念圖,以涵蓋所有可能的源語言和目標語言。 雖然有些人能夠接近這個。

真正的編譯器經過許多階段。 當創建您自己的編譯器不需要重複所有的人都做過創造交涉和發電機的辛勤工作。 您可以在JavaScript或C直接翻譯你的語言,並充分利用現有的JavaScript引擎和C編譯器來完成剩下的。 您也可以使用現有的中間表示和虛擬機。

記錄翻譯

廣播器 - 是一個程序或硬件,這涉及到三種語言:源,目標和基座。 它們可以被寫在一個T形,將以下原始左,右和目標基站。

有三種類型的編譯器:

  • 播音員 - 是samokompilyator如果它對應於基本的源語言。
  • 其目標語言編譯器是基準,被稱為samorezidentnym。
  • 播音員 - 一個交叉編譯器,如果他有針對性的和基本的各種語言。

為什麼這很重要?

即使你從來沒有做一個真正的編譯器,其創作的技術,良好的知識,因為用於此目的的概念被廣泛使用,例如:

  • 格式文本;
  • 語言查詢 到數據庫;
  • 先進的計算機體系結構;
  • 廣義優化問題;
  • 圖形用戶界面;
  • 腳本語言;
  • 控制器;
  • 虛擬機;
  • 機器翻譯。

此外,如果你想寫的預處理器,鏈接器,加載器,調試器和分析器,你必須經過相同的步驟編寫編譯器時。

您還可以了解如何編寫更好的節目,因為翻譯的語言的製作機構更好地理解其複雜性和模糊性。 廣播的一般原則的研究也讓你成為一名優秀的設計師的語言。 所以它的問題有多陡,如果它不能得到有效執行的語言?

綜合技術

編譯器技術涵蓋了計算機科學的許多不同的領域:

  • 語言的形式理論:語法,語法分析,可計算性;
  • 計算機體系結構:指令集,RISC或CISC,流水線處理核心時鐘週期等;
  • 編程語言的概念,例如,進行順序控制,條件執行迭代,遞歸功能分解,模塊化,同步,元編程,適用範圍,恆定亞類型,模板,輸出類型,原型,註釋,流量,單子,郵箱,繼續,通配符,正則表達式,事務存儲器,繼承,多態性,模式設置,等等等等。;
  • 抽象的語言和虛擬機;
  • 算法和數據結構:正則表達式,解析算法,圖形算法, 動態規劃,培訓;
  • 編程語言:語法,語義(靜態和動態),支持範例(結構,面向對象,功能,邏輯,堆棧,平行度,元編程);
  • 創建軟件(編譯器,通常是龐大而複雜的):本地化,緩存,組件化,API接口,再利用,同步。

編譯器設計

一些在現實翻譯的發展中遇到的問題:

  • 問題的源語言。 是否容易編譯它? 是否有一個預處理器? 如何是哪幾類? 是否有一個圖書館嗎?
  • 分組編譯通行證:單路或多路?
  • 優化的程度所需。 很少或根本沒有優化的快速和不潔的廣播節目可以是正常的。 過度優化的編譯器將放緩,但在運行時更好的代碼可能是值得的。
  • 所需要的程度的誤差檢測。 翻譯可以只停留在第一個錯誤? 當它應該停止? 是否信任該編譯器的糾錯?
  • 工具的可用性。 如果原來的語言是不是很小,需要掃描儀和發生器分析儀。 還有發電機,代碼生成器,但他們不那麼常見。
  • 將要生成的目標代碼類型。 從純補充或虛擬機代碼來選擇。 或只寫一個創建流行中間表示如LLVM,RTL,或JVM入口部分。 或使用C或JavaScript源代碼原件及翻譯。
  • 目標代碼的格式。 您可以選擇 的彙編語言, 便攜式機器代碼,機器代碼存儲圖像。
  • 重新定向。 當設定發生器是好有一個共同的入口部。 出於這個原因,最好是有許多地方的輸入一台發電機。

編譯器架構:組件

這些是產生本地代碼(如果輸出程序是用C或虛擬機的程序,需要沒有那麼多級)編譯器的主要功能組件:

  • 輸入程序(流痕)被送入掃描儀(詞法分析器),將其轉換成標記的流。
  • 分析器(分析器)構建一個抽象語法樹。
  • 語義分析分解的語義信息,並檢查是否存在錯誤的樹節點。 其結果是,內置語義圖 - 有額外的屬性和建立聯繫的抽象語法樹。
  • 中間代碼生成器生成一個流圖(元組被分成主塊)。
  • 機器無關的代碼優化器進行程序內基本上剩餘本地(基本單元內)和全球(所有塊)優化。 減少冗餘代碼,並簡化了計算。 其結果是經修飾的流圖。
  • 發電機結合目標代碼的基本塊為直線傳輸控制代碼,創建一個對象文件彙編虛擬寄存器(可能無效)。
  • 機器相關的優化器,鏈接器將分配寄存器之間的內存,使規劃團隊。 它在該組件具有良好的使用流水線的執行彙編語言的轉換程序。

此外,使用錯誤檢測分系統管理和符號表。

詞法分析(掃描)

掃描器流源字符轉換為標記,刪除空白,註釋和擴大宏流。

掃描儀經常遇到的問題,比如是否要考慮到的情況下,利潤率,斷線和嵌入的註釋。

在掃描過程中可能出現的錯誤,稱為詞彙和包括:

  • 這是不是在字母字符;
  • 過量的字或行中的字符數目;
  • 不是一個封閉的標誌或一個字符串;
  • 在註釋文件的末尾。

解析(解析)

解析器的標記序列轉換為抽象語法樹。 樹中的每個節點被存儲為與命名的字段,其中有許多是本身樹節點的對象。 在這個階段,沒有循環。 當你創建一個解析器需要注意的語法(LL或LR)的複雜程度,並找出是否有任何規則歧義。 有些語言確實需要語義分析。

在這個階段中發現的錯誤稱為語法。 例如:

  • K = 5 *(7 - ÿ;
  • J = / 5;
  • 56 = X * 4。

語義分析

語義分析檢查的分析樹的規則和準部件允許性(允許參考名稱為隱式類型轉換插入操作,依此類推。D.)為了形成語義圖。

顯然,這組不同的不同的語言規則受理。 如果您編譯Java類語言,編譯器可能會發現:

  • 在其範圍內的多個變量聲明;
  • 一個參考其聲明之前的變量;
  • 對未申報的名稱引用;
  • 侵犯專利權;
  • 在一個方法調用的參數過多或不足號碼;
  • 類型不匹配。

中間代碼生成元組產生組成流程圖,歸納為基本塊。

代碼生成產生實機器代碼。 在籌備的第一步RISC機器傳統的編譯器,你創建的虛擬寄存器的無限數量的彙編。 對於CISC機器可能不會發生。

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 zhtw.delachieve.com. Theme powered by WordPress.