编译器 vs 解释器 vs 转译器

Compiler vs Interpreter vs Transpiler

在我参加的 reactJS session 期间,演示者使用了一个术语转译器来表示某些代码 conversion/porting 发生。在将语言代码转换为计算机上可运行的形式时,我一直使用并听到术语编译器和解释器 system/machine。转译器对我来说是新的。转译器与编译器或解释器有何不同,为什么真正需要它?

如本 Wiki article 中所述,它是一种编译器,可将源代码从一种编程语言翻译 为另一种编程语言。源代码可能使用不再使用的某种语言,或者不支持最新的 hardware/software 进步,或者根据程序员的 convenience/favoritism.

一个VB6到VB.NET的转换器可以被认为是一个Transpiler。我可能会将 COBOL to C# / C++ / Java 工具视为转译器。

我去过 building such tools since the 1980s

我们称他们为"Source to source program transformation systems"。

AFAICT,这个词用了大约 45 年。这个想法可以追溯到很久以前;参见 Val Schorre 的 Meta II Compiler-compiler work 1963 年的版本。

现在我们有了这个新术语;我几年前开始看到它。它什么也没加,但听起来神秘而酷。祭司就是这样确立他们的价值的;他们为旧思想发明新词汇。

它通常被称为 'transpiling',当您使用 JS 预处理器(如 CoffeeScript、TypeScript(随便你怎么说))将代码转换为普通代码时 JavaScript。 但它确实不是 JS 独有的东西。它适用于所有类型的编程语言。大多数情况下它只是称为编译。

Transpiling is a specific term for taking source code written in one language and transforming into another language that has a similar level of abstraction.

根据https://www.stevefenton.co.uk/2012/11/compiling-vs-transpiling/

所以在你的情况下

  • 'compile' JSX => JavaScript(和HTML),我认为符合上面的定义。
  • 因此可以称为'transpiling'。虽然叫它 'compiling' 也可以。

另一个例子:

  • CoffeeScript / TypeScript / ...whatEverScript.. => JavaScript 反之亦然。

编译器 - 将代码编译成较低级别的代码。

示例:

  • "Developer code" -> "Machine code"
  • PHP -> C
  • Java -> bytecode

Transpiler - 将代码编译到 code/abstraction.

的同一级别

示例:

  • "Developer code" -> "Another developer code or version"
  • JavaScript ES2015+ -> JavaScript ES5

Interpreter - 解释代码,与上面两个不完全相同 class/league/context。

示例:php.exe

  • "Your PHP code/scripts inside index.php" -> "Results to html or just like pure index.html"

A source-to-source compiler translates between programming languages that operate at approximately the same level of abstraction, while a traditional compiler translates from a higher level programming language to a lower level programming language.

来源:Wikipedia

  • 编译器 - 将源代码从高级语言翻译成低级语言。
    示例:C编译器(C到机器码),javaJDK的c工具(java到字节码)
  • Transpiler - 一种在同一抽象级别的源代码之间进行转换的编译器。
    示例: Babel(ES6+ 到 ES5)——你可以用它来编写 ES6 代码,同时仍然支持旧版浏览器,如 IE 11 及更低版本。

根据定义 transpilertranslator.

的一种特殊形式

编译器 将高级源代码转换为较低抽象级别的代码。通常,但不一定,编译的目标是 机器码 。也就是CPU可以直接执行的一段代码。编译器还可以生成 字节码 ,这是机器码的模拟,但稍后由所谓的虚拟机解释(即 Java VM 的 Java 字节码)。然而,术语 compiler 可以适用于将代码转换为另一种不是机器可执行代码的编程语言的工具。编译器的显着差异是它降低了抽象级别。

Translator 将源代码从一种编程语言转换为另一种相同或不同 抽象级别的编程语言。请注意,如果源代码也是机器代码,则结果可以是机器代码。

Transpiler 与翻译器非常相似,但专门在相同 抽象级别的编程语言之间转换源代码。请注意,编程语言在抽象的内容上存在很大差异;抽象级别不同,特别是因为它适用于它们作为抽象支持的不同概念。因此,转换(transpilation)通常在 similar 之间,而不是相同的抽象级别。

编译器 - 它充当人机之间的接口,用于将人类理解语言转换为机器理解语言。

编译器类型

  • 本机代码编译器: 编译器仅用于为相同类型的平台编译源代码。此类编译器生成的输出只能在与编译器本身 运行 相同类型的计算机系统和操作系统 (OS) 上 运行。
  • 交叉编译器: 编译器用于为不同类型的平台编译源代码。用于制作可在多个平台上使用的嵌入式系统软件。
  • 源到源编译器: 将 HLL(高级语言)或源语言转换为 LLL(低级语言)或机器语言。
  • 转译器: 将 HLL(高级语言)转换为另一个 HLL