编译与透明

时间:2017-07-05 16:24:05

标签: compiler-construction abstraction transpiler

在搜索差异时,我发现了这些定义:

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

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

我明白抽象是什么。

但是"类似的抽象水平"在上面的定义意味着什么?我们如何找到语言中的抽象级别?

6 个答案:

答案 0 :(得分:25)

上面引用的定义对于初学者来说过于笼统,完全无法理解,所以让我把它简化为我们实际看到的东西。

编译器:是一个总称,用于描述一个程序,该程序采用一种语言编写的源代码,并以其他语言生成(或许多)输出文件。 在实践中,我们主要使用这个术语来描述一个编译器,例如gcc,它接受C代码作为输入,并产生二进制可执行文件(机器代码)作为输出。

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

转发器的一些例子:

  1. Emscripten:将C / C ++透明化为JavaScript
  2. Babel:将ES6 +代码透明到ES5(ES6和ES5是JavaScript语言的不同版本或代)
  3. 现在,它们是什么意思"类似的抽象水平": 正如我所说,它编译/转换为源文件,可以说汇编语言也是源文件,因此gcc也是一个转换器。所以,这个论点就是这个类似的抽象层次无效。

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

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

    因此,一个转换器编译成一种语言,这种语言更接近你在这个抽象方面开始的语言(或者更接近于中低级语言阶梯中该语言的级别)。

    希望这有帮助!

答案 1 :(得分:9)

这是一种回答

的描述方式

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

Renderer Info: <SCNRenderer 0x14ede9890: scene = <SCNScene: 0x14edc6f30>, pointOfView = <SCNNode: 0x14ed3f680 | camera=<SCNCamera: 0x14edc5260> | no child>, sceneTime = 0.000000, context = 0x108255000> 

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

答案 2 :(得分:3)

将Angular的示例添加到其他答案中。

Angular 2是使用TypeScript构建的。 TypeScript对ECMAScript 6标准有很好的支持。 JavaScript语言标准正式称为ECMAScript。在过去的几年中,从ECMAScript版本1一直到ECMAScript版本7发行了许多版本的ECMAScript。

  

当今可用的大多数现代浏览器都支持ECMAScript 5。   浏览器对ECMAScript 6的支持仍然不完整。但是,使用   称为Transpilation的过程,可以将ECMAScript 6转换为   所有现代浏览器都支持ECMAScript 5。

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:0)

我大多同意塔潘南德的答案,但是...


定义

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

我们现在倾向于使用转译器来指定编译器,该编译器将代码转换为与源代码“更相似”的其他一些代码,而编译器可能会这样做。并且用于在相同的上下文中同时提及这两种情况时(大多数情况下再次暗示必须至少再次编译一种翻译语言)来区分两者。


示例

所以,一切都是主观的。在撰写本文时:

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

fazit

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

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

答案 5 :(得分:0)

“相似抽象级别”的含义

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

高级语言(高度抽象)---- 相似级-----> 高级语言(高度抽象)
(TypeScript 源代码到 JavaScript 源代码)

中级语言(抽象性差)---- 相似级-----> 中级语言(抽象性差)

高级语言(高度抽象)---- 抽象级别不相似-----> 中级另一种语言(抽象程度差)