编译与翻译

在寻找差异的过程中,我偶然发现了这些定义:

编译 是将用一种语言编写的源代码转换成另一种语言的通用术语。

横移 是一个特定的术语,用于将用一种语言编写的源代码转换为具有类似抽象级别的另一种语言。

我知道什么是抽象。

但是,在上面的定义中,“相似的抽象层次”意味着什么呢?我们如何在语言中找到抽象的层次?

60878 次浏览

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

如果你认为抽象层是这样的例子:

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

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

你上面引用的定义对于一个初学者来说太笼统了,不能完全理解,所以让我把它简化成我们实际看到的东西。

编译器: 是一个总括术语,用来描述一个程序,它使用用一种语言编写的源代码,并用另一种语言生成(或多个)输出文件。 在实践中,我们通常用这个术语来描述一个编译器,比如 gcc,它接受 C 代码作为输入,并生成二进制可执行文件(机器码)作为输出。

透明器 也称为源到源编译器。因此,从本质上讲,它们是编译器的一个子集,编译器接收源代码文件,并将其转换为其他语言或同一语言的不同版本的另一个 源代码文件源代码文件。这种输出通常是可以被人类理解的。这个输出仍然需要经过编译器或解释器才能在机器上运行。

一些翻译的例子:

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

现在,他们所说的“相似的抽象层次”是什么意思: 正如我所说,它将编译/转换为源文件,可以认为汇编语言也是源文件,因此 gcc 也是一个转换器。因此,这个论证就是类似抽象层次的空白。

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

像汇编这样的低级语言非常接近处理器架构,即对不同的处理器有不同的指令。而 C/C + +/Java/JavaScript,抽象所有这些提供更多的抽象。

因此,在这个抽象的术语中,一个传译器编译成一种更接近于您开始使用的语言(或者更接近于该语言在中低级语言阶梯中的级别)的语言。

我基本上同意塔帕纳和回答,但是..。


定义

词语是“造”出来的,所以它们是有意义的,而这也随着时间而改变。

我们现在倾向于使用传输器来指定一个编译器,该编译器将代码转换成与源代码“更相似”的其他代码,即编译器可能做的事情。并且主要用于在同一上下文中提到两者时对它们进行区分(同样主要意味着透明语言必须至少再编译一次)


例子

所以一切都是 非常主观的。在写这篇文章的时候:

  • 来自 Java 世界的我可以调用 CoffeeScript/TypeScript 传译器来描述结果代码并不比原始代码更高效。
  • CoffeScript文件说它是一个编译器,而 babel 是一个传输器。确实需要说 CoffeeScript 虽然非常相似,但不是 Javascript。至少不是它的一个版本,因为那是巴别塔生产的。
  • Babel 自称为编译器。

Fazit

因此,平淡无奇在这个时候已经很少使用了,只能区分两个编译器。

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

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

Https://en.wikipedia.org/wiki/microsoft_typescript ”MicrosoftTypeScript 是由 Microsoft 开发和维护的开源编程语言。它是 JavaScript 的一个严格的语法超集,并为语言添加了可选的静态类型。

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

“相似抽象层次”的含义

高级语言比低级语言更抽象。我所说的抽象是指更容易理解。

高级语言 (高度抽象)——相似级—— > 另一种语言(高度抽象)
(从 TypeScript 源代码到 JavaScript 源代码)

中级语言 (抽象程度差)——相似程度—— > 中级语言(抽象程度差)

高级语言 (高度抽象)——非相似的抽象级—— > 另一种语言(低度抽象)

编译器 用于将用一种语言编写的源代码编译成另一种语言。编译器通常使用与输入语言相同的语法,但它也可能是为其他类型的输入(如字节码)而设计的。

译码器 是不同的,因为它们将代码从一种编程语言翻译成另一种编程语言。最初的程序可能是用 JavaScript 编写的,但是传输程序会将其转换成 HTML。

计算机只能理解1和0: 你可以把计算机想象成一个盒子,里面塞满了开关——有点像电灯开关: 它们可以是“开”也可以是“关”——它们可以是“1”也可以是“0”。你可以用一系列的“1”和“0”来指示计算机哪些开关是你想要打开或关闭的。

人们需要编程语言: 人类并不擅长阅读/理解成千上万行的“1”和“0”... ..。但是我们可以被训练去理解人类的单词,比如: classbreak

编程语言允许我们编写计算机指令,它可以翻译成1和0(编译) ,或者可以翻译成其他编程语言。例如: 如果你有 elm代码,你可以很容易地把它转换成 javascript (transpiling)。

前情提要处理器”这个词经常被用作“传送器”的同义词。

“预处理器”这个词在90年代就已经广为人知了,它强调的是某些东西是经过 之前处理的某些东西。它还用于在编译代码之前删除注释的上下文中。

“ transiler”这个词在2010年变得更加流行(我是在2015年第一次从一个与 AngularJS 社区有联系的同事那里听到这个词的) ,他把把 TypeScript 引入 JavaScript 的过程称为“ transling”——一种类似于 com 皮拉法(检查数据类型等)的 变性人关系。

总结一下:

  • 当某些内容被翻译成某些类似于编译的功能时,“翻译”最为合适。
  • “预处理器”是一个更通用的术语,基本上是指以前处理的东西。