複製鏈接
請複製以下鏈接發送給好友

解釋器

鎖定
解釋器(英語:Interpreter),又譯為直譯器,是一種電腦程序,能夠把高級編程語言一行一行直接轉譯運行。解釋器不會一次把整個程序轉譯出來,只像一位“中間人”,每次運行程序時都要先轉成另一種語言再作運行,因此解釋器的程序運行速度比較緩慢。它每轉譯一行程序敍述就立刻運行,然後再轉譯下一行,再運行,如此不停地進行下去。
中文名
解釋器
外文名
Interpreter
分    類
電腦程序

解釋器執行方式

PythonTCL和各種Shell程序一般而言是使用解釋器執行的。微軟公司的Qbasic語言也是解釋方式,它不能生成可執行程序(但Quick BasicVisual Basic可以);運用廣泛的網絡編程語言java則同時有解釋和編譯方式
在開始之前有必要再次強調:下面介紹的解釋器是一個源代碼解釋器。也就是説,解釋器在執行時,每次讀入一條語句,並且根據這條語句執行特定的操作;然後再讀入下一條語句,依次類推。這與偽代碼解釋器是有所區別的,例如早期的Java運行時系統。兩者的區別在於:源代碼解釋器直接對程序的源代碼解釋執行;而偽代碼解釋器先將程序的源代碼轉化為某種與機器無關的中間代碼,然後再執行中間代碼。相比之下,源代碼解釋器更易於創建,並且不需要一個獨立的編譯過程。

解釋器子系統

Small BASIC解釋器包括兩個主要的子系統:一個是表達式解析器,負責處理數字表達式;另一個是解釋器,負責程序的實際執行。對於前者,可採用本書第二章所介紹的表達式解析器。但是在這裏做了某些改進,使得解析器能夠解析包含在程序語句中的數字表達式,而不是隻能解析孤立的表達式。
解釋器子系統和解析器子系統包含在同一個解釋器類中,該類名為SBasic。儘管從理論上講可以使用兩個獨立的類:一個包含解釋器,另一個包含表達式解析器;但是將兩者用同一個類來實現的代效率會更高,因為表達式解析器和解釋器的代碼是密不可分的。例如,兩個子系統都操作保存着程序代碼的同一個字符數組。如果將它們分別安排在兩個類中,將會增加可觀的額外開銷,並導致性能上的損失和功能上的重複。此外,由於程序解釋的任務繁重,而解析表達式只是其中的一部分,因此將整個解釋機制包含在單個類中是很有意義的。
解釋器執行時,每次從程序的源代碼中讀入一個標識符。如果讀入的是關鍵字,解釋器就按照該關鍵字的要求執行規定的操作。舉例來説,當解釋器讀入一個PRINT後,它將打印PRINT之後的字符;當讀入一個GOSUB時,它就執行指定的子程序。在到達程序的結尾之前,這個過程將反覆進行。可以看到,解釋器只是簡單地執行程序指定的動作。

解釋器解釋編譯

解釋器運行程序的方法有:
1.直接運行高級編程語言 (如 Shell 自帶的解釋器)
2.轉換高級編程語言碼到一些有效率的字節碼 (Bytecode),並運行這些字節碼
3.以解釋器包含的編譯器對高級語言編譯,並指示處理器運行編譯後的程序 (例如:JIT)
PerlPythonMATLAB,與Ruby是屬於第二種方法,而UCSD Pascal則是屬於第三種方式。在轉譯的過程中,這組高級語言所寫成的程序仍然維持在源代碼的格式(或某種中繼語言的格式),而程序本身所指涉的動作或行為則由解釋器來表現。
使用解釋器來運行程序會比直接運行編譯過的機器碼來得慢,但是相對的這個直譯的行為會比編譯再運行來得快。這在程序開發的雛型化階段和只是撰寫試驗性的代碼時尤其來得重要,因為這個“編輯-直譯-除錯”的循環通常比“編輯-編譯-運行-除錯”的循環來得省時許多。
在解釋器上運行程序比直接運行編譯過的代碼來得慢,是因為解釋器每次都必須去分析並轉譯它所運行到的程序行,而編譯過的程序就只是直接運行。這個在運行時的分析被稱為"直譯式的成本"。在解釋器中,變量的訪問也是比較慢的,因為每次要訪問變量的時候它都必須找出該變量實際存儲的位置,而不像編譯過的程序在編譯的時候就決定好了變量的位置了。
在使用解釋器來達到較快的開發速度和使用編譯器來達到較快的運行進度之間是有許多妥協的。有些系統(例如有一些LISP)允許直譯和編譯的代碼互相調用並共享變量。這意味着一旦一個子程序在解釋器中被測試併除錯過之後,它就可以被編譯以獲得較快的運行進度。許多解釋器並不像其名稱所説的那樣運行原始代碼,反而是把原始代碼轉換成更壓縮的內部格式。舉例來説,有些BASIC的解釋器會把keywords取代成可以用來在jump table中找出相對應指令的單一byte符號。解釋器也可以使用如同編譯器一般的文字分析器(lexical analyzer)和語法分析器(parser)然後再轉譯產生出來的抽象語法樹(abstract syntax tree)。
可攜性佳,直譯式程序相較於編譯式程序有較佳的可攜性,可以容易的在不同軟硬件平台上運行。而編譯式程序經過編譯後的程序則只限定於運行在開發環境平台。

解釋器字節解釋

考量程序運行之前所需要分析的時間,存在了一個介於直譯與編譯之間的可能性。例如,用Emacs Lisp所撰寫的源代碼會被編譯成一種高度壓縮且優化的另一種Lisp源代碼格式,這就是一種字節碼(bytecode),而它並不是機器碼(因此不會被綁死在特定的硬件上)。這個"編譯過的"碼之後會被字節碼直譯器(使用C寫成的)轉譯。在這種情況下,這個"編譯過的"碼可以被説成是虛擬機(不是真的硬件,而是一種字節碼解釋器)的機器碼。這個方式被用在Open Firmware系統所使用的Forth代碼中: 原始程序將會被編譯成 "F code" (一種字節碼),然後被一個特定平台的虛擬機直譯和運行。 [1] 
參考資料