直譯器


直譯器 (简体)

直譯器(Interpreter)是一種把高階程式語言轉換成機器碼的轉譯程式。直譯器不會一次把整個程式轉譯出來。它每轉譯一行程式敘述就立刻執行轉譯後的機器碼,然後再轉譯下一行,再執行,如此不停的進行下去。

在轉譯的過程中,這組高階語言所寫成的程式仍然維持在原始碼的格式(或某種中繼語言的格式),而程式本身所指涉的動作或行為則由直譯器來表現。

直譯器的好處是它消除了編譯整個程式的負擔,但也會讓執行時的效率打了折扣。

目錄

直譯器與編譯器

使用直譯器來執行程式會比直接執行編譯過的機器碼來得慢,但是相對的這個直譯的行為會比編譯再執行來得快。這在程式開發的雛型化階段和只是撰寫試驗性的程式碼時尤其來得重要,因為這個「編輯-直譯-除錯」的循環通常比「編輯-編譯-執行-除錯」的循環來得省時許多。

在直譯器上執行程式比直接執行編譯過的程式碼來得慢,是因為直譯器每次都必須去分析並轉譯它所執行到的程式行,而編譯過的程式就只是直接執行。這個在執行的時候進行的分析動作被稱為"直譯式的成本"。在直譯器中,變數的存取也是比較慢的,因為每次要存取變數的時候它都必須找出該變數實際儲存的位置,而不像編譯過的程式在編譯的時候就決定好了變數的位置了。

在使用直譯器來達到較快的開發速度和使用編譯器來達到較快的執行進度之間是有許多妥協的。有些系統(例如有一些LISP)允許直譯和編譯的程式碼互相呼叫並共用變數。這意味著一但一個子程式在直譯器中被測試並除錯過之後,它就可以被編譯以獲得較快的執行進度。許多直譯器並不像其名稱所說的那樣執行原始程式碼,反而是把原始程式碼轉換成更壓縮的內部格式。舉例來說,有些BASIC的直譯器會把keywords取代成可以用來在jump table中找出相對應指令的單一byte符號.直譯器也可以使用如同編譯器一般的文字分析器(lexical analyzer)和語法分析器(parser)然後再轉譯產生出來的抽象語法樹(abstract syntax tree)。

Bytecode直譯器

考量程式執行之前所需要進行分析動作的時間,存在了一個介於直譯與編譯之間的可能性。例如,用Emacs Lisp所撰寫的原始碼會被編譯成一種高度壓縮且最佳化的另一種 Lisp 原始碼格式,這就是一種 bytecode,而它並不是機器碼(因此不會被綁死在特定的硬體上)。這個"編譯過的"碼之後會被 bytecode interpreter(使用C寫成的)轉譯。在這種情況下,這個"編譯過的"碼可以被說成是 virtual machine (不是真的硬體,而是一種 bytecode 直譯器)的機器碼。這個方式被用在 Open Firmware 系統所使用的 Forth 程式碼中: 原始程式將會被編譯成 "F code" (一種bytecode),然後被一個特定平臺的虛擬機器直譯和執行。

即時編譯(Just-in-time compilation)

Just-in-time compilation,又名JIT,是指一種在執行時期把bytecode編譯成原生機器碼的技術;這項技術是被用來改善虛擬機器的效能的。該技術在近幾年來才開始獲得重視,而它後來模糊了直譯、byte-code直譯及編譯的差異性。在.NETJava的平臺上都有用到JIT的技術。大約在1980年代Smalltalk語言出現的時候JIT的技術就存在了。

一個簡單的直譯器的例子

Literate programming文章中有一個簡單的程式和一個直譯器。

打孔卡讀卡機

"interpreter"這個字眼有時候是指一些可以讀取打孔卡片的機器。這些機器可以讀取卡片上的孔並以人們讀得懂的格式列印出來。IBM 550數字讀卡機和IBM 557字母讀卡機是主要的兩個例子。

參見

外部連結


本文參考了依GFDL授權發佈的《自由線上電腦詞典》(FOLDOC)。
This article was originally based on material from the Free On-line Dictionary of Computing and is used under the GFDL.

System software

Interpreters Software engineering DOLDOC sourced articles Programming language implementation


! __







Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History