编译与编译


92

在寻找差异时,我遇到了以下定义:

编译是获取用一种语言编写的源代码并转换为另一种语言的总称。

Transpiling是一个特定术语,用于获取用一种语言编写的源代码并转换为具有相似抽象级别的另一种语言。

我了解什么是抽象。

但是在上面的定义中“相似的抽象水平”是什么意思?以及如何找到一种语言的抽象水平?



Answers:


142

您上面引用的定义对于初学者而言太笼统,无法完全理解,因此让我将其简化为我们实际看到的内容。

编译器:是一个笼统的术语,用于描述采用一种语言编写的源代码并生成某种其他语言的(或多个)输出文件的程序。实际上,我们主要使用该术语来描述诸如gcc之类的编译器,该编译器以C代码作为输入,并生成二进制可执行文件(机器代码)作为输出。

编译器也称为源到源编译器。因此,从本质上讲,它们是编译器的子集,它们将源代码文件带入并以某种其他语言或同一语言的不同版本转换为另一个源代码文件。输出通常是人类可以理解的。此输出仍必须通过编译器或解释器才能在计算机上运行。

转译器的一些示例:

  1. Emscripten:将C / C ++转换为JavaScript
  2. Babel:将ES6 +代码转换为ES5(ES6和ES5是JavaScript语言的不同版本或代)

现在,它们的意思是“相似的抽象水平”:正如我所说的那样,它可以编译/编译为源文件,因此可以说汇编语言也是源文件,因此gcc也是编译器。因此,这种论点就是这种类似级别的抽象无效。

将语言分为低级,中级和高级的概念基于它们从机器/体系结构的实际工作中提供的抽象级别。

诸如汇编之类的较低级语言非常接近处理器体系结构,即针对不同处理器具有不同的指令。在使用C / C ++ / Java / JavaScript时,请将所有这些内容抽象化以提供更多抽象。

因此,编译器会编译为一种语言,该语言在抽象方面更接近于您使用的语言(或者在中低阶语言阶梯中更接近该语言的级别)。

希望这可以帮助!


9
“一些编译器示例:” --- babel称自己为编译器。编译器和编译器之间的分离实际上是人为的。
zerkms

13
@zerkms如我所说,编译器是编译器的子集。
tapananand

1
我想补充一件事,我们在这里谈论自然语言。因此,期望模糊的定义。我希望转译器的“易读性”与以前的输出相似,而编译器会使事情更难以阅读。因此,Webpack / npm是一个编译器,您不想读取它的输出。(至少在你添加“装载机”为如.vue文件。
塞缪尔·阿斯伦德

1
意见:我认为定义应为:编译:语言->低级语言。翻译:语言->同级语言。
德吉

3
@Deji不一定是相同级别的语言,而是处于相似抽象级别的语言。
tapananand

33

这是一种描述性的回答方式

如果您将抽象层视为此示例:

(1) CPU-level (actual logic gates on the CPU)
(2)machine code
(3)assembly code
(4)[C/C++, JVM/bytecode]
(5)[JavaScript, Python]

编译器进入较低级别(较低数量)。编译器以相同的编号从一种语言(或一种语言的版本)切换到另一种语言。


1
很好奇,“抽象度”列表来自何处?
zerkms

只是随机的示例,我知道前两个有点糊涂,但是我想要更长的列表:P
Araymer

2
我喜欢它,如果它是像这样的“正式”分类,那将真的很酷。由于没有它,很难将工具(翻译器)归为一个或另一个类别。例如:是否javac为编译器。
zerkms'7

2

我大体上同意tapanandand的回答,但是...


定义

单词是“造”的,因此它们是有目的的。而且这也随着时间而改变。

现在,我们倾向于使用transpiler来指定编译器,该编译器将代码转换为与源代码“更相似”的其他代码,而编译器可能会这样做。当在同一个上下文中同时提及这两个词时,通常用于区分这两个词(再次主要是暗示必须至少再次编译一次翻译语言)


例子

因此,一切都是非常主观的。在撰写本文时:

  • 来自Java世界,我可以称呼CoffeeScript / TypeScript转译器来描述所产生的代码并不比原始代码更有效。
  • CoffeScript文档说它是一个编译器,而babel是一个编译器。想要说的是CoffeeScript尽管非常相似,但不是Javascript。至少不是它的一个版本,因为这是babel产生的。
  • Babel称自己为编译器。

azi子

因此,现在很少使用转堆了,只能将两个编译器区分开。

它可能会作为概念消失,因为编译要比它复杂得多(相同/更高/更低的语言,版本等),并且这个词似乎不再有用(“编译器”现在无处不在)


2

例如:TypeScript(Microsoft的JavaScript超集,具有类型安全检查功能)可以转换为JavaScript代码,该代码可以在不同类型的浏览器上运行。

https://zh.wikipedia.org/wiki/Microsoft_TypeScript “ Microsoft TypeScript是Microsoft开发和维护的一种开源编程语言。它是JavaScript的严格语法超集,并为该语言添加了可选的静态类型。

TypeScript是为开发大型应用程序而设计的,并可以编译为JavaScript。[5] 由于TypeScript是JavaScript的超集,因此现有的JavaScript程序也是有效的TypeScript程序。TypeScript可以用于开发JavaScript应用程序,以用于客户端和服务器端(Node.js)执行。”


有一个“ Typescript编译器”(或tsc)工具,其名称暗示TypeScript是不进行编译编译的……但是该工具将TypeScript转换为Javascript,这与底层硬件的抽象级别相同。TypeScript是已编译还是已转译?
Alex McMillan于

@AlexMcMillan TypeScript已编译,因为它是javascript的超集,因此已被编译为javascript。
Araymer

@Araymer您了解编译和反编译之间的区别吗?因为TS未编译;JS也不是。
Alex McMillan

是的,我愿意。并且由于TS是JS的超集,因此它被认为是更高的抽象级别,因此被称为“编译”。然后,已编译的JS被解释为正常。因此,为什么要查找TS,讨论最多的主题就是它的“编译”。但是,移植和编译之间的界限并没有正式的定量定义。它变得很糊状,所以您对编译内容的看法(与创作者不同)只是您的看法。
Araymer
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.