什么是批处理编译器?


28

我在编译器的课程中有以下引文(在图形着色的情况下):

因为它很慢,所以在批处理编译器中倾向于使用图形着色,而在JIT编译器中倾向于使用线性扫描。

我在网上找不到清晰的定义。那么,是什么使编译器成为批处理编译器呢?


这个问题不在这里。softwareengineering.stackexchange.com是一个更好的地方要问
巴西莱Starynkevitch

Answers:


42

JIT(即时)编译器在运行时即程序运行时编译代码。因此,编译成本是程序执行时间的一部分,因此应将其最小化。

与之相反的是提前(AOT)编译器,它基本上与“批处理编译器”同义。这会将源代码转换为机器代码,然后仅分发机器代码。因此,编译器可能非常慢,因为它不会影响生成程序的执行时间。

如今,当人们说“编译器”时,它们通常是指AOT编译器。确实,术语“ AOT编译器”直到最近才真正开始流行起来,因为人们开始为JIT编译语言(尤其是JavaScript)制作AOT编译器。这些语言中的许多语言(例如C#)会编译为VM的中间语言,然后在运行时将JIT编译为机器代码。术语“ AOT编译器”的含义是将源代码直接编译为机器代码,因此在运行时不需要任何形式的JIT编译。

在这一点上,“批处理编译器”有点陈旧。与流行的批处理编译器的真正对比是增量编译器。增量编译通常与您拥有REPL的语言(例如Lisp)相关联,您可以交互地请求语言实现来编译特定功能。如果执行了之前未请求编译的函数,则通常会对其进行解释。相比之下,批处理编译器可以一次(即成批)编译所有函数。


1
在过去根本无法交互运行的编译器中,您必须将作业提交到批处理队列中才能编译程序
Neuromancer

一些语言实现(GNU的awk,cpython等)在运行时的第一步是将整个输入编译为内部表示形式,其中混合了此处描述的一些属性。
dmckee '17

1
@dmckee大多数(如果不是全部)语言实现,实际上
user253751

另一种不确定性:工具叫做存在了MSDOS操作系统,这些编译批处理文件转换成可执行文件的批量编译器....
rackandboneman

当然总会有一个内部表示。但是有时它本身就是一种语言,例如Gcc,Llvm或.Net。这是由于前端/中间/后端体系结构,前端将语言(C,C ++,Java,fortran ..)转换为通用的较低级语言,然后运行了优化算法,并且最后,这种经过优化的通用语言代码由后端转换为字节码或汇编器,可执行文件,静态或动态库。

11

您提供的报价中暗含了含义!它源于不实时执行任务时使用的计算术语“ 批处理”,但是当负载(通常用于实时活动)较少时,它计划由操作系统稍后执行。

批处理编译器是一种在用户不等待编译结果时进行编译的编译器。我们可以说,这是使用更现代的术语在后台完成的。

这是JIT(即时)的反面,它在需要的确切时间“实时”完成,而无需花费额外的时间来更彻底地进行处理。

批处理编译速度较慢的示例如下:

在此处输入图片说明

资料来源:https : //xkcd.com/303/

甚至这个:

在此处输入图片说明

资料来源:http//dilbert.com/strip/2013-06-22

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.