直譯器
Clash Royale CLAN TAG#URR8PPP
body.skin-minerva .mw-parser-output table.infobox captiontext-align:center
「直譯器」的各地常用別名 | |
---|---|
中国大陸 | 解释器 |
港臺 | 直譯器 |
程序执行 |
---|
基础概念 |
|
代码类型 |
|
编译策略 |
|
知名运行环境 |
|
著名编译器及工具链 |
|
直譯器(英语:interpreter),是一種電腦程式,能夠把高階程式語言一行一行直接轉譯執行。直譯器像是一位「中間人」,每次執行程式時都要先轉成另一種語言再作執行,因此直譯器的程式運行速度比較緩慢。它不會一次把整個程式轉譯出來,而是每轉譯一行程式敘述就立刻執行,然後再轉譯下一行,再執行,如此不停地進行下去。
直譯器的好處是它消除了編譯整個程式的負擔,程式可以拆分成多個部分來模組化,但這會讓執行時的效率打了折扣。相對地,編譯器已一次將所有原程式碼翻譯成另一種語言,如機械碼,執行時便無需再依賴編譯器或額外的程式,故而其運行速度比較快。
目录
1 历史
2 直譯器與編譯器
3 字节码直譯器
4 即時編譯
5 一個簡單的直譯器的例子
6 打孔卡讀卡機
7 有使用直譯器的電腦程式語言
8 参考文献
9 外部連結
10 参见
历史
第一个解释器是由史帝芬·羅素(Steve Russell)写成的LISP的解释器,基于IBM 704的机器代码。
直譯器與編譯器
直譯器執行程式的方法有:
- 直接執行高階程式語言(如Shell內建的直譯器)
- 轉換高階程式語言碼到一些有效率的字节码(Bytecode),並執行這些字节码
- 以直譯器包含的編譯器對高階語言編譯,並指示處理器執行編譯後的程式(例如:JIT)
Perl,Python,MATLAB,與Ruby是屬於第二種方法,而UCSD Pascal則是屬於第三種方式。在轉譯的過程中,這組高階語言所寫成的程式仍然維持在原始碼的格式(或某種中繼語言的格式),而程式本身所指涉的動作或行為則由直譯器來表現。
使用直譯器來執行程式會比直接執行編譯過的機器碼來得慢,但是相對的這個直譯的行為會比編譯再執行來得快。這在程式開發的雛型化階段和只是撰寫試驗性的程式碼時尤其來得重要,因為這個「編輯-直譯-除錯」的循環通常比「編輯-編譯-執行-除錯」的循環來得省時許多。
在直譯器上執行程式比直接執行編譯過的程式碼來得慢,是因為直譯器每次都必須去分析並轉譯它所執行到的程式行,而編譯過的程式就只是直接執行。這個在執行時的分析被稱為"直譯式的成本"。在直譯器中,變數的存取也是比較慢的,因為每次要存取變數的時候它都必須找出該變數實際儲存的位置,而不像編譯過的程式在編譯的時候就決定好了變數的位置了。
在使用直譯器來達到較快的開發速度和使用編譯器來達到較快的執行進度之間是有許多妥協的。有些系統(例如有一些LISP)允許直譯和編譯的程式碼互相呼叫並共享變數。這意味著一旦一個子程式在直譯器中被測試併除錯過之後,它就可以被編譯以獲得較快的執行進度。許多直譯器並不像其名稱所說的那樣執行原始程式碼,反而是把原始程式碼轉換成更壓縮的內部格式。舉例來說,有些BASIC的直譯器會把保留字取代成可以用來在转移表中找出相對應指令的單一字节符號。直譯器也可以使用如同編譯器一般的文字分析器和語法分析器然後再轉譯產生出來的抽象語法樹。
可攜性佳,直譯式程式相較於編譯式程式有較佳的可攜性,可以容易的在不同軟硬體平台上執行。而編譯式程式經過編譯後的程式則只限定於執行在開發環境平台。
字节码直譯器
考量程式執行之前所需要分析的時間,存在了一個介於直譯與編譯之間的可能性。例如,用Emacs Lisp所撰寫的原始碼會被編譯成一種高度壓縮且最佳化的另一種Lisp原始碼格式,這就是一種字节码(bytecode),而它並不是機器碼(因此不會被綁死在特定的硬體上)。這個"編譯過的"碼之後會被字节码直译器(使用C寫成的)轉譯。在這種情況下,這個"編譯過的"碼可以被說成是虚拟机(不是真的硬體,而是一種字节码直譯器)的機器碼。這個方式被用在Open Firmware系統所使用的Forth程式碼中:原始程式將會被編譯成"F code"(一種字节码),然後被一個特定平台的虛擬機器直譯和執行。
即時編譯
即时编译(Just-in-time compilation)是指一種在執行時期把字节码編譯成原生機器碼的技術;這項技術是被用來改善虛擬機器的效能的。該技術在近幾年來才開始獲得重視,而它後來模糊了直譯、字节码直譯及編譯的差異性。在.NET和Java的平台上都有用到JIT的技術。大約在1980年代Smalltalk語言出現的時候JIT的技術就存在了。
一個簡單的直譯器的例子
在文學編程文章中有一個簡單的程式和一個直譯器。
打孔卡讀卡機
“interpreter”這個字眼有時候是指一些可以讀取打孔卡的機器。這些機器可以讀取卡片上的孔並以人們讀得懂的格式列印出來。IBM 550數字讀卡機和IBM 557字母讀卡機是主要的兩個例子。
有使用直譯器的電腦程式語言
- AWK
- BASIC
- JavaScript
- LISP
- Shell
- Perl
- Prolog
- Ruby
- Python
- PHP Hypertext Preprocessor
参考文献
外部連結
IBM Card Interpreters page at Columbia University
参见
- partial evaluation
- 直譯語言
- 编译语言
dynamic compilation including the section on incremental compilation.
Threaded code, a compact form of code that depends on a simple interpreter.- Metacircular Interpreter
|
本條目部分或全部内容出自以GFDL授權發佈的《自由線上電腦詞典》(FOLDOC)。