实时编译

实时编译【实时编译】即时编译(英语:Just-in-time compilation),又译及时编译、实时编译,动态编译的一种形式,是一种提高程式运行效率的方法 。
基本介绍中文名:实时编译
外文名:Just-in-time compilation
性质:动态编译的一种形式
学科:计算机
简介通常,程式有两种运行方式:静态编译与动态解释 。静态编译的程式在执行前全部被翻译为机器码,而解释执行的则是一句一句边运行边翻译 。即时编译器则混合了这二者,一句一句编译原始码,但是会将翻译过的代码快取起来以降低性能损耗 。相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性 。类型即时编译器有两种类型,一是位元组码翻译,二是动态编译翻译 。微软的.NET Framework,还有绝大多数的Java实现,都依赖即时编译以提供高速的代码执行 。Mozilla Firefox使用的JavaScript引擎SpiderMonkey也用到了JIT的技术 。Ruby的第三方实现Rubinius和Python的第三方实现PyPy也都通过JIT来明显改善了解释器的性能 。动态编译动态编译是某些程式语言在执行时用来增进效能的方法 。儘管这技术源于Self,但使用此技术最为人所知的是Java 。此技术可以做到一些只在执行时才能完成的最佳化 。使用动态编译的执行环境一开始执行速度较慢,之后,完成大部分的编译和再编译后,会执行得比非动态编译程式快很多 。因为初始化时的效能延迟,动态编译不适用于一些情况 。在许多实作中,一些可以在编译时期做的最佳化被延到执行时期才编译,导致不必要的效能降低 。即时编译是一种动态编译的形式 。一个非常近似的技术是递增式编译 。递增式编译器用于POP-2、POP-11、一些Lisp的版本,如Maclisp和最少一种版本的ML语言(PoplogML) 。这需要程式语言的编译器成为执行环境的一部分作为要件以实作 。如此便得以在任何时候从终端、从档案、或从执行中程式所建造数据结构中读取源码 。然后,转成机器码区块或函式(有可能取代之前同名的函式),之后可立即被程式使用 。因为执行中对互动开发和测试的速度的要求,编译后的机器码所做的最佳化程度不如标準“批次编译器” 。然而,递增式编译过的程式跑起来通常比同一个程式的一般解译版本还快 。递增式编译因而能够同时提供编译和解译语言优点 。为了增加可移植性,递增式编译通常采两步骤 。第一个步骤会编译到中间、与平台独立的语言,然后再到机器码 。在这个例子中,移植只须改变“后端”编译器 。不同于动态编译,递增式编译在程式执行后不会做更进一步的最佳化 。编译器编译器(compiler),是一种电脑程式,它会将用某种程式语言写成的原始码(原始语言),转换成另一种程式语言(目标语言) 。它主要的目的是将便于人编写、阅读、维护的高级计算机语言所写作的原始码程式,翻译为计算机能解读、运行的低阶机器语言的程式,也就是执行档 。编译器将原始程式(source program)作为输入,翻译产生使用目标语言(target language)的等价程式 。原始码一般为高级语言(High-level language),如Pascal、C、C++、C# 、Java等,而目标语言则是彙编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code) 。一个现代编译器的主要工作流程如下:原始码(source code)→预处理器(preprocessor)→编译器(compiler)→彙编程式(assembler)→目标代码(object code)→连结器(Linker)→执行档(executables), 最后打包好的档案就可以给计算机去判读运行了 。