解释器

解释器(英语:Interpreter),又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。

中文名

外文名

Interpreter

分    类

电脑程序

1执行方式

PythonTCL和各种Shell程序一般而言是使用解释器执行的。微软公司Qbasic语言也是解释方式,它不能生成可执行程序(但Quick BasicVisual Basic可以);运用广泛的网络编程语言java则同时有解释和编译方式

在开始之前有必要再次强调:下面介绍的解释器是一个源代码解释器。也就是说,解释器在执行时,每次读入一条语句,并且根据这条语句执行特定的操作;然后再读入下一条语句,依次类推。这与伪代码解释器是有所区别的,例如早期的Java运行时系统。两者的区别在于:源代码解释器直接对程序的源代码解释执行;而伪代码解释器先将程序的源代码转化为某种与机器无关的中间代码,然后再执行中间代码。相比之下,源代码解释器更易于创建,并且不需要一个独立的编译过程。

2子系统

Small BASIC解释器包括两个主要的子系统:一个是表达式解析器,负责处理数字表达式;另一个是解释器,负责程序的实际执行。对于前者,可采用本书第二章所介绍的表达式解析器。但是在这里做了某些改进,使得解析器能够解析包含在程序语句中的数字表达式,而不是只能解析孤立的表达式。

解释器子系统和解析器子系统包含在同一个解释器类中,该类名为SBasic。尽管从理论上讲可以使用两个独立的类:一个包含解释器,另一个包含表达式解析器;但是将两者用同一个类来实现的代效率会更高,因为表达式解析器和解释器的代码是密不可分的。例如,两个子系统都操作保存着程序代码的同一个字符数组。如果将它们分别安排在两个类中,将会增加可观的额外开销,并导致性能上的损失和功能上的重复。此外,由于程序解释的任务繁重,而解析表达式只是其中的一部分,因此将整个解释机制包含在单个类中是很有意义的。

解释器执行时,每次从程序的源代码中读入一个标识符。如果读入的是关键字,解释器就按照该关键字的要求执行规定的操作。举例来说,当解释器读入一个PRINT后,它将打印PRINT之后的字符;当读入一个GOSUB时,它就执行指定的子程序。在到达程序的结尾之前,这个过程将反复进行。可以看到,解释器只是简单地执行程序指定的动作。

3解释编译

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

1.直接运行高级编程语言 (如 Shell 自带的解释器)

2.转换高级编程语言码到一些有效率的字节码 (Bytecode),并运行这些字节码

3.以解释器包含的编译器对高级语言编译,并指示处理器运行编译后的程序 (例如:JIT)

PerlPythonMATLAB,与Ruby是属于第二种方法,而UCSD Pascal则是属于第三种方式。在转译的过程中,这组高级语言所写成的程序仍然维持在源代码的格式(或某种中继语言的格式),而程序本身所指涉的动作或行为则由解释器来表现。

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

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

在使用解释器来达到较快的开发速度和使用编译器来达到较快的运行进度之间是有许多妥协的。有些系统(例如有一些LISP)允许直译和编译的代码互相调用并共享变量。这意味着一旦一个子程序在解释器中被测试并除错过之后,它就可以被编译以获得较快的运行进度。许多解释器并不像其名称所说的那样运行原始代码,反而是把原始代码转换成更压缩的内部格式。举例来说,有些BASIC的解释器会把keywords取代成可以用来在jump table中找出相对应指令的单一byte符号。解释器也可以使用如同编译器一般的文字分析器(lexical analyzer)和语法分析器(parser)然后再转译产生出来的抽象语法树(abstract syntax tree)。

可携性佳,直译式程序相较于编译式程序有较佳的可携性,可以容易的在不同软硬件平台上运行。而编译式程序经过编译后的程序则只限定于运行在开发环境平台。

4字节解释

考量程序运行之前所需要分析的时间,存在了一个介于直译与编译之间的可能性。例如,用Emacs Lisp所撰写的源代码会被编译成一种高度压缩且优化的另一种Lisp源代码格式,这就是一种字节码(bytecode),而它并不是机器码(因此不会被绑死在特定的硬件上)。这个"编译过的"码之后会被字节码直译器(使用C写成的)转译。在这种情况下,这个"编译过的"码可以被说成是虚拟机(不是真的硬件,而是一种字节码解释器)的机器码。这个方式被用在Open Firmware系统所使用的Forth代码中: 原始程序将会被编译成 "F code" (一种字节码),然后被一个特定平台的虚拟机直译和运行。[1]

时间: 2024-08-03 09:55:08

解释器的相关文章

解释器模式 Interpreter

代码例子 参考 1.解释器模式定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 说明:解释器模式设计到文法规则和抽象语法树. 2.解释器模式的结构 解释器模式包含四个角色: 1)抽象表达式(AbstractExpress):声明抽象的解释操作,它是所有终结符表达式和非终结符表达式的公共父类. 2)终结符表达式(TerminalExpress):是抽象表达式的子类,实现了与文法中的终结符相关联的解释操作,句子中的每一个终结符都是该类的一个实例.

【译】使用 Python 编写虚拟机解释器

原文地址:[Making a simple VM interpreter in Python](https://csl.name/post/vm/) **更新:根据大家的评论我对代码做了轻微的改动.感谢 robin-gvx. bs4h 和 Dagur,具体代码见[这里](https://github.com/cslarsen/python-simple-vm)** Stack Machine 本身并没有任何的寄存器,它将所需要处理的值全部放入堆栈中而后进行处理.Stack Machine 虽然简

怎样写一个解释器

我这个标题起的有一些不厚道,与大神的文章同名,倒不是因为我自比大神,是因为这两个说的是同一个东西. 简单地说,这篇是我在学习了 eopl 前面三章之后,把里面课后作业的解释器的构建过程,拿出来给团队同事们介绍一遍,并且从两条最简单的语法规则开始(输入一个字符串,返回一个数字),逐步完成书中介绍的 ``let-lang'' 的全部语法: 在这个简单的解释器里面,介绍了 AST, environement, closure 等名词,会使你了解一些平时困扰你的问题,比如 pyhton 的 lambda

设计模式之解释器模式

定义:给定一个语言,定义它的方法的一种表示,并定义一个解释器.这个解释器使用该表示解释语言中的句子 结构图: 演示样例代码: public abstract class AbstractExpression { public abstract void interpret(Context context); } public class NonterminalExpression extends AbstractExpression { @Override public void interpr

python 什么是全局解释器锁GIL

什么是全局解释器锁GIL Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在任意时刻,只有一个线程在解释器中运行.对Python 虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行. 在多线程环境中,Python 虚拟机按以下方式执行: 1. 设置GIL2. 切换到一个线程去运行3. 运行:    a. 指定数量的字节码指令,或者 b.

Python解释器

1        Python解释器 1.1   CPython 当我们从Python官方网站下载并安装好Python 3.5后,我们就直接获得了一个官方版本的解释器:CPython.这个解释器是用C语言开发的,所以叫CPython.在命令行下运行python就是启动CPython解释器. CPython是使用最广的Python解释器.教程的所有代码也都在CPython下执行. 1.2   IPython IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交

java编写编译器和解释器

 on 2012-07-14 21:24 Bang 阅读(102) 评论(0) 编辑 收藏  续 第二部分 初始后端实现 框架后端支持编译器和解释器.现在框架抽象类Backend有两个极简版实现,一个为编译器另一个为解释器.图2-7 展示了它们的UML类图. 图2-7 子类CodeGenerator和Executor分别是后端的编译器和解析器实现. 编译器 编译器后端做代码生成.backend.compiler包中的类CodeGenerator实现框架抽象类Backend.现在它被最大简化了.清

[工作中的设计模式]解释器模式模式Interpreter

一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我很少附上类图,但解释器模式确实比较抽象,为了便于理解还是放了上来,此模式的要点是: 1.客户端提供一个文本.表达式或者其他,约定解析格式 2.针对文本中可以分为终结符表达式和非终结符表达式, 3.终结符表达式无需进一步解析,但仍需要转化为抽象接口的实例 4.针对非终结表达式,没一种标示需要定义一种解

python解释器快捷键

13. 交互式输入的编辑和历史记录 某些版本的 Python 解释器支持编辑当前的输入行和历史记录,类似于在 Korn shell 和 GNU Bash shell 中看到的功能.这是使用GNU Readline库实现的,它支持 Emacs 风格和 vi 风格的编辑.这个库有它自己的文档,在这里我不就重复了:然而,基本原理很容易解释.本章讲述的交互式编辑和历史记录功能在 Unix 版本和 Cygwin 版本中是可选的. 13.1. 行编辑 如果支持,无论解释器打印主提示符还是从属提示符,输入行一

学习日记之解释器模式和Effective C++

解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. (1),如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言的句子.这样可以构建一个解释器,该解释器通过解释这些句子来解决该问题. (2),当一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可使用解释器模式. (3),容易改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变和扩展该文法