解释器


解释器 (正體)

解释器(Interpreter)是一种把高级编程语言直接运行的转译程序。解释器不会一次把整个程序转译出来。它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停的进行下去。

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

  1. 直接运行高级编程语言 (如 Shell 内置的解释器)
  2. 转换高级编程语言码到一些有效率的中间代表码 (Bytecode),并运行这些Bytecode
  3. 指示处理器运行存储直译系统内的机器码 (如 JVM的JIT)

在转译的过程中,这组高级语言所写成的程序仍然维持在源代码的格式(或某种中继语言的格式),而程序本身所指涉的动作或行为则由解释器来表现。

解释器的好处是它消除了编译整个程序的负担,但也会让运行时的效率打了折扣。

目录

解释器与编译器

使用解释器来运行程序会比直接运行编译过的机器码来得慢,但是相对的这个直译的行为会比编译再运行来得快。这在程序开发的雏型化阶段和只是撰写试验性的代码时尤其来得重要,因为这个“编辑-直译-除错”的循环通常比“编辑-编译-运行-除错”的循环来得省时许多。

在解释器上运行程序比直接运行编译过的代码来得慢,是因为解释器每次都必须去分析并转译它所运行到的程序行,而编译过的程序就只是直接运行。这个在运行时的分析被称为"直译式的成本"。在解释器中,变量的访问也是比较慢的,因为每次要访问变量的时候它都必须找出该变量实际储存的位置,而不像编译过的程序在编译的时候就决定好了变量的位置了。

在使用解释器来达到较快的开发速度和使用编译器来达到较快的运行进度之间是有许多妥协的。有些系统(例如有一些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)。System software Interpreters Software engineering DOLDOC sourced articles Programming language implementation







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