對話式編譯程式

對話式編譯程式

編譯程式把用高級語言書寫的程式翻譯成等價的機器語言程式或彙編語言程式。對話式編譯程式,是指有程式需要運行時才進行編譯的編譯器。對話式編譯程式能夠運行時特定化:根據運行時常量,將程式代碼特定化,然後在其中做各種最佳化工作。

基本介紹

  • 中文名:對話式編譯程式
  • 外文名:conversational compiler
  • 學科:計算機
  • 有關術語:編譯程式
  • 特點:將程式代碼特定化
  • 定義:程式運行時才進行編譯的編譯器
簡介,編譯技術,發展動力,

簡介

對話式編譯程式是一種提高程式運行效率的編譯程式,動態的二進制代碼轉換和最佳化:將針對一種體系結構產生的目標碼,直接移植到與之不同的另一類體系結構上運行。能進行Just-in-time 編譯:主要針對 Java 程式進行的運行時編譯, 並根據 profiling 收集到的profile 信息進行自適應的最佳化。一個非常近似的技術是遞增式編譯。遞增式編譯器用於POP-2、POP-11、一些Lisp的版本,如Maclisp和最少一種版本的ML語言(Poplog ML)。這需要程式語言的編譯器成為執行環境的一部分作為要件以實作。如此便得以在任何時候從終端、從檔案、或從執行中程式所建造數據結構中讀取源碼。然後,轉成機器碼區塊或函式(有可能取代之前同名的函式),之後可立即被程式使用。因為執行中對互動開發和測試的速度的要求,編譯後的機器碼所做的最佳化程度不如標準“批次編譯器”。然而,遞增式編譯過的程式跑起來通常比同一個程式的一般解譯版本還快。遞增式編譯因而能夠同時提供編譯和解譯語言優點。為了增加可移植性,遞增式編譯通常采兩步驟。第一個步驟會編譯到中間、與平台獨立的語言,然後再到機器碼。在這個例子中,移植只須改變“後端”編譯器。不同於動態編譯,遞增式編譯在程式執行後不會做更進一步的最佳化。

編譯技術

計算機語言之所以能由單一的機器語言發展到現今的數千種高級語言,就是因為有了編譯技術。編譯技術是計算機語言發展的支柱,也是計算機科學中發展最迅速、最成熟的一個分支,它集中體現了計算機發展的成果與精華。編譯技術的核心思想就是把同樣的邏輯結構和思想從一種語言表示轉化為另外一種語言表示。從高級語言,甚至是運行於虛擬平台的高級語言,到機器語言,最終到硬體執行的物理信號,這一層層轉化,無一不涉及到“編譯”這個概念的套用。因此,編譯技術是人類智慧到機器執行的橋樑,軟體到硬體層層推進的銜接力量。編譯程式是一個足夠複雜的程式,語言功能的完善,硬體結構的發展,環境的友好要求,都對編譯程式提出了更高的要求。要構造一個完全獨立的全新的編譯器可能性很小, 大部分可在現有編譯器的基礎上擴展,有的採用自展的方式,有的則用自編譯的方式。
自展法
隨著編譯技術的發展和社會對編譯程式需求的不斷增長,上世紀 60 年代起,不斷有人使用自展技術來構造編譯程式。自展的主要特徵是用被編譯的語言來書寫該語言自身的編譯程式。1971 年,PASCAL 的編譯程式用自展技術生成後,其影響就越來越大。
自動生成法
上世紀 70 年代,隨著諸多種類的高級程式設計語言的出現和軟體開發自動化技術的提高,編譯程式的構造工具陸續誕生,如 70 年代 Bell 實驗室推出的LEX 和YACC,這兩種工具在各種語言編譯程式的實現中還廣為套用。其中 LEX 是詞法分析器的自動生成工具, YACC 是語法分析器的自動生成工具。
自編譯方式
採用自編譯方式生成編譯程式的思想是先用目標機的彙編語言或機器語言對源程式的核心部分構造一個小小的編譯程式,再以它為工具構造一個能夠編譯更多語言成分的較大編譯程式。如此擴展下去,就像滾雪球一樣,越滾越大,最後生成人們所期望的整個源語言的編譯程式。

發展動力

語言范型
程式設計已經基本上從傳統的過程式轉向對象式,並且正在從對象式轉向組件型。 這其實是程式設計范型的變遷,是在計算機技術背景下認識世界的觀點的變化:過程式將完成事務看成是一系列的步驟,而對象式卻將世界看成是由一系列對象組成的,這些對象之間互動合作完成特定的事務。從過程式到對象式,有著質的變化,而非一般的修改和完善,由此帶來了語言的變化。因此,編譯技術的討論對象從過程式語言轉到對象式語言。
計算機體系結構
隨著學習計算機技術的深入,更加認為計算機系統是複雜度遞增的一層層封裝結構。 早期計算機系統結構單一,只有一次轉化,就是把機器語言轉化到電器信號,沒有涉及到我們一般意義上的程式設計語言之間的編譯轉化。然而這個單一簡單的系統結構,帶來的是程式編寫的極大困難,計算機套用無疑成了面向少數數學家的高端套用,其學習曲線的陡峭非常人所能及。 此外,這一極大的複雜度,也影響了編寫大型程式的能力。隨著彙編、乃至後來高級語言的出現,這一情況就有了改觀。

相關詞條

熱門詞條

聯絡我們