词条 | 直译器 |
释义 | 直译器(英语:Interpreter),又译为解释器,是一种电脑程式,能够把高阶编程语言一行一行直接转译执行。直译器不会一次把整个程式转译出来,只像一位“中间人”,每次执行程式时都要先转成另一种语言再作执行,因此解释器的程式运行速度比较缓慢。它每转译一行程式叙述就立刻执行,然后再转译下一行,再执行,如此不停地进行下去。 直译器的好处是它消除了编译整个程式的负担,但也会让执行时的效率打了折扣。相对地,编译器并不执行程式或原程式码,而是一次将其翻译成另一种语言,如机械码,以供多次执行而无需再经编译。其制成品无需依赖编译器而执行,程式运行速度比较快。 直译器与编译器 直译器执行程式的方法有: 直接执行高阶编程语言 (如 Shell 内建的直译器) 转换高阶编程语言码到一些有效率的字节码 (Bytecode),并执行这些字节码 以直译器包含的编译器对高阶语言编译,并指示处理器执行编译后的程式 (例如: JIT) Perl,Python,MATLB,与Ruby是属于第二种方法,而 UCSD Pascal则是属于第三种方式。在转译的过程中,这组高阶语言所写成的程式仍然维持在源代码的格式(或某种中继语言的格式),而程式本身所指涉的动作或行为则由直译器来表现。 使用直译器来执行程式会比直接执行编译过的机器码来得慢,但是相对的这个直译的行为会比编译再执行来得快。这在程式开发的雏型化阶段和只是撰写试验性的程式码时尤其来得重要,因为这个“编辑-直译-除错”的循环通常比“编辑-编译-执行-除错”的循环来得省时许多。 在直译器上执行程式比直接执行编译过的程式码来得慢,是因为直译器每次都必须去分析并转译它所执行到的程式行,而编译过的程式就只是直接执行。这个在执行时的分析被称为"直译式的成本"。在直译器中,变量的存取也是比较慢的,因为每次要存取变量的时候它都必须找出该变量实际储存的位置,而不像编译过的程式在编译的时候就决定好了变量的位置了。 在使用直译器来达到较快的开发速度和使用编译器来达到较快的执行进度之间是有许多妥协的。有些系统(例如有一些LISP)允许直译和编译的程式码互相呼叫并共享变量。这意味着一旦一个子程式在直译器中被测试并除错过之后,它就可以被编译以获得较快的执行进度。许多直译器并不像其名称所说的那样执行原始程式码,反而是把原始程式码转换成更压缩的内部格式。举例来说,有些BASIC的直译器会把keywords取代成可以用来在jump table中找出相对应指令的单一byte符号。直译器也可以使用如同编译器一般的文字分析器(lex analyzer)和语法分析器(parser)然后再转译产生出来的抽象语法树(abstract syntax tree)。 可携性佳,直译式程式相较于编译式程式有较佳的可携性,可以容易的在不同软硬件平台上执行。而编译式程式经过编译后的程式则只限定于执行在开发环境平台。 字节码直译器考量程式执行之前所需要分析的时间,存在了一个介于直译与编译之间的可能性。例如,用Emacs Lisp所撰写的源代码会被编译成一种高度压缩且最佳化的另一种 Lisp源代码格式,这就是一种字节码(bytecode),而它并不是机器码(因此不会被绑死在特定的硬件上)。这个"编译过的"码之后会被字节码直译器(使用C写成的)转译。在这种情况下,这个"编译过的"码可以被说成是虚拟机(不是真的硬件,而是一种字节码直译器)的机器码。这个方式被用在 Open Firmware系统所使用的 Forth 程式码中: 原始程式将会被编译成 "F code" (一种字节码),然后被一个特定平台的虚拟机器直译和执行。 即时编译(Just-in-time compilation)即时编译,又名JIT,是指一种在执行时期把字节码编译成原生机器码的技术;这项技术是被用来改善虚拟机器的效能的。该技术在近几年来才开始获得重视,而它后来模糊了直译、字节码直译及编译的差异性。在.NET和Java的平台上都有用到JIT的技术。大约在1980年代Smalltalk语言出现的时候JIT的技术就存在了 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。