fbpx
维基百科

直譯器

解释器(英語:interpreter),是一种计算机程序,能够把解释型语言解释执行。解释器就像一位「中間人」。解释器边解释边执行,因此依赖于解释器的程序运行速度比较缓慢。解释器的好处是它不需要重新编译整个程序,从而减轻了每次程序更新后编译的负担。相对的编译器一次性将所有源代码编译成二进制文件,执行时无需依赖编译器或其他额外的程序。

历史

第一个解释器是由史帝芬·罗素(Steve Russell)写成的LISP的解释器,基于IBM 704机器码

解释器与编译器

解释器执行程序的方法有:

  1. 直接执行高级编程语言(如Shell内建的编译器)
  2. 转换高级编程语言到更有效率的字节码,并执行字节码
  3. 用解释器包含的编译器对高级语言进行编译,並指示中央处理器执行编译后的程序(例如:JIT

PerlPythonMATLAB,與Ruby是屬於第二種方法,而UCSD Pascal則是屬於第三種方式。在轉譯的過程中,這組高階語言所寫成的程式仍然維持在原始碼的格式(或某種中繼語言的格式),而程式本身所指涉的動作或行為則由直譯器來表現。

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

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

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

直譯式程式相較於編譯式程式有較佳的可攜性,可以容易的在不同軟硬體平台上執行。而編譯式程式經過編譯後的程式則只限定於執行在開發環境平台。

字节码直譯器

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

即時編譯

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

一個簡單的直譯器的例子

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

打孔卡讀卡機

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

有编译器的高级语言

参考文献

參閱

  • partial evaluation英语partial evaluation
  • 直譯語言
  • 编译语言
  • 動態編譯
  • Threaded code英语Threaded code, a compact form of code that depends on a simple interpreter.
  • Metacircular Interpreter英语Metacircular Interpreter

外部链接

  • IBM Card Interpreters (页面存档备份,存于互联网档案馆) page at Columbia University

本條目部分或全部内容出自以GFDL授權發佈的《自由線上電腦詞典》(FOLDOC)。

直譯器, 此條目没有列出任何参考或来源, 2020年6月25日, 維基百科所有的內容都應該可供查證, 请协助補充可靠来源以改善这篇条目, 无法查证的內容可能會因為異議提出而被移除, 解释器, 英語, interpreter, 是一种计算机程序, 能够把解释型语言解释执行, 解释器就像一位, 中間人, 解释器边解释边执行, 因此依赖于解释器的程序运行速度比较缓慢, 解释器的好处是它不需要重新编译整个程序, 从而减轻了每次程序更新后编译的负担, 相对的编译器一次性将所有源代码编译成二进制文件, 执行时无需依赖编译器或其. 此條目没有列出任何参考或来源 2020年6月25日 維基百科所有的內容都應該可供查證 请协助補充可靠来源以改善这篇条目 无法查证的內容可能會因為異議提出而被移除 解释器 英語 interpreter 是一种计算机程序 能够把解释型语言解释执行 解释器就像一位 中間人 解释器边解释边执行 因此依赖于解释器的程序运行速度比较缓慢 解释器的好处是它不需要重新编译整个程序 从而减轻了每次程序更新后编译的负担 相对的编译器一次性将所有源代码编译成二进制文件 执行时无需依赖编译器或其他额外的程序 目录 1 历史 2 解释器与编译器 3 字节码直譯器 4 即時編譯 5 一個簡單的直譯器的例子 6 打孔卡讀卡機 7 有编译器的高级语言 8 参考文献 9 參閱 10 外部链接历史 编辑第一个解释器是由史帝芬 罗素 Steve Russell 写成的LISP的解释器 基于IBM 704的机器码 解释器与编译器 编辑解释器执行程序的方法有 直接执行高级编程语言 如Shell内建的编译器 转换高级编程语言到更有效率的字节码 并执行字节码 用解释器包含的编译器对高级语言进行编译 並指示中央处理器执行编译后的程序 例如 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 Racket Scheme Haskell Idris Clojure Shell Perl Prolog Ruby Python PHP Hypertext Preprocessor C C Java参考文献 编辑參閱 编辑 计算机科学主题 计算机程序设计主题 软件主题 partial evaluation 英语 partial evaluation 直譯語言 编译语言 動態編譯 Threaded code 英语 Threaded code a compact form of code that depends on a simple interpreter Metacircular Interpreter 英语 Metacircular Interpreter 外部链接 编辑IBM Card Interpreters 页面存档备份 存于互联网档案馆 page at Columbia University 本條目部分或全部内容出自以GFDL授權發佈的 自由線上電腦詞典 FOLDOC 取自 https zh wikipedia org w index php title 直譯器 amp oldid 70732351, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。