解釋器
歷史
第一個解釋器是由史帝芬·羅素(Steve Russell)寫成的LISP的解釋器,基于IBM 704的機(jī)器代碼。
解釋器與編譯器
解釋器運(yùn)行程序的方法有:
直接運(yùn)行高級編程語言(如Shell內(nèi)置的解釋器)
轉(zhuǎn)換高級編程語言碼到一些有效率的字節(jié)碼(Bytecode),并運(yùn)行這些字節(jié)碼
以解釋器包含的編譯器對高級語言編譯,并指示處理器運(yùn)行編譯后的程序(例如:JIT)
Perl,Python,MATLAB,與Ruby是屬于第二種方法,而UCSD Pascal則是屬于第三種方式。在翻譯的過程中,這組高級語言所寫成的程序仍然維持在源代碼的格式(或某種中繼語言的格式),而程序本身所指涉的動作或行為則由解釋器來表現(xiàn)。
使用解釋器來運(yùn)行程序會比直接運(yùn)行編譯過的機(jī)器碼來得慢,但是相對的這個解釋的行為會比編譯再運(yùn)行來得快。這在程序開發(fā)的雛型化階段和只是撰寫試驗性的代碼時尤其來得重要,因為這個“編輯-解釋-除錯”的循環(huán)通常比“編輯-編譯-運(yùn)行-除錯”的循環(huán)來得省時許多。
在解釋器上運(yùn)行程序比直接運(yùn)行編譯過的代碼來得慢,是因為解釋器每次都必須去分析并翻譯它所運(yùn)行到的程序行,而編譯過的程序就只是直接運(yùn)行。這個在運(yùn)行時的分析被稱為"解釋式的成本"。在解釋器中,變量的訪問也是比較慢的,因為每次要訪問變量的時候它都必須找出該變量實際存儲的位置,而不像編譯過的程序在編譯的時候就決定好了變量的位置了。
在使用解釋器來達(dá)到較快的開發(fā)速度和使用編譯器來達(dá)到較快的運(yùn)行進(jìn)度之間是有許多妥協(xié)的。有些系統(tǒng)(例如有一些LISP)允許解釋和編譯的代碼互相調(diào)用并共享變量。這意味著一旦一個子程序在解釋器中被測試并除錯過之后,它就可以被編譯以獲得較快的運(yùn)行進(jìn)度。許多解釋器并不像其名稱所說的那樣運(yùn)行原始代碼,反而是把原始代碼轉(zhuǎn)換成更壓縮的內(nèi)部格式。舉例來說,有些BASIC的解釋器會把保留字取代成可以用來在轉(zhuǎn)移表中找出相對應(yīng)指令的單一字節(jié)符號。解釋器也可以使用如同編譯器一般的文字分析器和語法分析器然后再翻譯產(chǎn)生出來的抽象語法樹。
可攜性佳,解釋式程序相較于編譯式程序有較佳的可攜性,可以容易的在不同軟硬件平臺上運(yùn)行。而編譯式程序經(jīng)過編譯后的程序則只限定于運(yùn)行在開發(fā)環(huán)境平臺。
字節(jié)碼解釋器
考量程序運(yùn)行之前所需要分析的時間,存在了一個介于解釋與編譯之間的可能性。例如,用Emacs Lisp所撰寫的源代碼會被編譯成一種高度壓縮且最優(yōu)化的另一種Lisp源代碼格式,這就是一種字節(jié)碼(bytecode),而它并不是機(jī)器碼(因此不會被綁死在特定的硬件上)。這個"編譯過的"碼之后會被字節(jié)碼直譯器(使用C寫成的)翻譯。在這種情況下,這個"編譯過的"碼可以被說成是虛擬機(jī)(不是真的硬件,而是一種字節(jié)碼解釋器)的機(jī)器碼。這個方式被用在Open Firmware系統(tǒng)所使用的Forth代碼中:原始程序?qū)痪幾g成"F code"(一種字節(jié)碼),然后被一個特定平臺的虛擬機(jī)解釋和運(yùn)行。
即時編譯
即時編譯(Just-in-time compilation)是指一種在運(yùn)行時期把字節(jié)碼編譯成原生機(jī)器碼的技術(shù);這項技術(shù)是被用來改善虛擬機(jī)的性能的。該技術(shù)在近幾年來才開始獲得重視,而它后來模糊了解釋、字節(jié)碼解釋及編譯的差異性。在.NET和Java的平臺上都有用到JIT的技術(shù)。大約在1980年代Smalltalk語言出現(xiàn)的時候JIT的技術(shù)就存在了。
一個簡單的解釋器的例子
在文學(xué)編程文章中有一個簡單的程序和一個解釋器。
打孔卡讀卡器
“interpreter”這個字眼有時候是指一些可以讀取打孔卡的機(jī)器。這些機(jī)器可以讀取卡片上的孔并以人們讀得懂的格式打印出來。IBM 550數(shù)字讀卡器和IBM 557字母讀卡器是主要的兩個例子。
有使用解釋器的計算機(jī)程序語言
AWK
BASIC
JavaScript
LISP
Shell
Perl
Prolog
Ruby
Python
PHP Hypertext Preprocessor
參見
partial evaluation ( 英語 : partial evaluation )
解釋語言
編譯語言
dynamic compilation ( 英語 : dynamic compilation ) including the section on incremental compilation.
Threaded code ( 英語 : Threaded code ) , a compact form of code that depends on a simple interpreter.
Metacircular Interpreter ( 英語 : Metacircular Interpreter )
. find an interpreter in Australia
本條目部分或全部內(nèi)容出自以GFDL授權(quán)發(fā)布的《自由在線電腦詞典》(FOLDOC)。
免責(zé)聲明:以上內(nèi)容版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請告知,我們將盡快刪除相關(guān)內(nèi)容。感謝每一位辛勤著寫的作者,感謝每一位的分享。
- 有價值
- 一般般
- 沒價值
{{item.userName}} 舉報
{{item.time}} {{item.replyListShow ? '收起' : '展開'}}評論 {{curReplyId == item.id ? '取消回復(fù)' : '回復(fù)'}}
{{_reply.userName}} 舉報
{{_reply.time}}