【发布时间】:2017-12-09 10:22:31
【问题描述】:
在搜索差异时,我发现了以下定义:
编译是将用一种语言编写的源代码转换成另一种语言的总称。
转译是一个特定术语,用于将用一种语言编写的源代码转换为具有相似抽象级别的另一种语言。
我明白什么是抽象。
但是在上述定义中“相似的抽象级别”是什么意思呢?我们如何找到一种语言的抽象级别?
【问题讨论】:
标签: compiler-construction abstraction transpiler
在搜索差异时,我发现了以下定义:
编译是将用一种语言编写的源代码转换成另一种语言的总称。
转译是一个特定术语,用于将用一种语言编写的源代码转换为具有相似抽象级别的另一种语言。
我明白什么是抽象。
但是在上述定义中“相似的抽象级别”是什么意思呢?我们如何找到一种语言的抽象级别?
【问题讨论】:
标签: compiler-construction abstraction transpiler
您上面引用的定义过于笼统,初学者无法完全理解,所以让我将其简化为我们实际看到的东西。
编译器: 是一个概括性术语,用于描述以一种语言编写的源代码并以其他语言生成(或多个)输出文件的程序。 在实践中,我们主要使用该术语来描述诸如 gcc 之类的编译器,它将 C 代码作为输入并生成二进制可执行文件(机器代码)作为输出。
转译器也称为源到源编译器。因此,从本质上讲,它们是编译器的子集,它们接收源代码文件并将其转换为其他语言或同一语言的不同版本的另一个源代码文件。输出通常是人类可以理解的。这个输出仍然需要经过编译器或解释器才能在机器上运行。
转译器的一些例子:
现在,“类似的抽象级别”是什么意思: 正如我所说,它编译/转译为源文件,有人可以说汇编语言也是源文件,因此 gcc 也是转译器。所以,这个论点就是这种类似的抽象级别的空洞。
将语言分为低级、中级和高级的概念是基于它们从机器/架构的实际工作中提供的抽象级别。
像汇编这样的低级语言非常接近处理器架构,即针对不同的处理器有不同的指令。在 C/C++/Java/JavaScript 中,将所有这些抽象出来,提供更多抽象。
因此,转译器编译成的语言在此抽象方面更接近您开始使用的语言(或者更接近中低级语言阶梯中该语言的级别)。
【讨论】:
这是一种描述性的回答方式
如果您将抽象层视为此示例:
(1) CPU-level (actual logic gates on the CPU)
(2)machine code
(3)assembly code
(4)[C/C++, JVM/bytecode]
(5)[JavaScript, Python]
编译器进入较低级别(较低的编号)。转译器以相同的编号从一种语言(或一种语言的版本)切换到另一种语言。
【讨论】:
javac 是否是编译器。
C/C++, JVM/bytecode 没有意义,4 应该只是字节码,C/C++ 应该在 5 中。JVM 是运行时环境,而不是代码。
例如:TypeScript(具有类型安全检查功能的 Microsoft JavaScript 超集)转译为可在不同类型浏览器上运行的 JavaScript 代码。
https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScript 是一种由 Microsoft 开发和维护的开源编程语言。它是 JavaScript 的严格语法超集,并为语言添加了可选的静态类型。
TypeScript 专为开发大型应用程序而设计,可转编译为 JavaScript。[5]由于 TypeScript 是 JavaScript 的超集,现有的 JavaScript 程序也是有效的 TypeScript 程序。 TypeScript 可用于开发用于客户端和服务器端 (Node.js) 执行的 JavaScript 应用程序。”
【讨论】:
我基本同意tapananand的回答,但是……
词是“造”出来的,所以它们是有目的的。而这也会随着时间而改变。
我们现在倾向于使用转译器来指定一个编译器,它将代码转换为与源代码“更相似”的其他代码,即编译器可能会做的事情。并且主要用于在同一上下文中同时提及它们时区分两者(再次主要暗示转译语言必须至少再次编译一次)
所以一切都是非常主观的。在撰写本文时:
所以 transpile 在这个时候已经很少使用了,只是为了区分两个编译器。
它可能会作为概念消失,因为编译比这复杂得多(相同/更高/更低的语言、版本等),而且这个词似乎不再有用(“转译器”现在无处不在)
【讨论】:
“类似抽象级别”的含义
高级语言比低级语言更抽象。抽象是指更容易理解。
高级语言(高度抽象)----相似级别 -----> 高级另一种语言(高度抽象)
(TypeScript Source code to JavaScript Source code)
中级语言(抽象性差)----相似级别-----> 中级语言(抽象性差)
高级语言(高度抽象)----不相似的抽象级别-----> 中级另一种语言(抽象程度低)
【讨论】:
计算机只能理解 1 和 0: 你可以把计算机想象成一个盒子,里面塞满了开关——有点像电灯开关:它们可以是“开”或“关”——它们可以是“1”或“0”。您可以通过一系列“1”和“0”来指示要打开或关闭的计算机。
人们需要编程语言:人类并不擅长阅读/理解数十万行的“1”和“0”......但我们可以受过理解人类语言的训练:例如:class 和 break。
编程语言允许我们编写计算机指令,这些指令可以翻译成 1 和 0(编译),也可以翻译成其他编程语言。例如:如果您有 elm 代码,您可以轻松地将其转换为 javascript (transpiling)。
【讨论】:
编译器用于将用一种语言编写的源代码编译成另一种语言。编译器通常会使用与输入语言相同的语法,但它也可能被设计用于其他类型的输入,例如字节码。
转译器是不同的,因为它们将代码从一种编程语言翻译成另一种。原始程序可能是用 JavaScript 编写的,但转译器将其转换为 HTML。
【讨论】: