编译器 vs 解释器 vs 转译器

65

在我参加的一个ReactJS会话中,演讲者使用了一个术语转译器来描述代码转换/移植过程。以前,我听过编译器和解释器这些术语,通常用于将用户编写的语言代码转换为计算机系统上可运行的形式。但是转译器对我来说是新的。转译器与编译器或解释器有何不同,为什么需要它?


9
你说得对 - “transpiler”是一个多余的术语,不应该使用。任何编译器都可以称为“transpiler”。 - SK-logic
7
亲爱的给差评的人 - 如果您能留下适当的反馈/评论,那么我就可以采取适当的措施来改进帖子。 - RBT
7个回答

54

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

示例:

  • "开发人员代码" -> "机器码"
  • PHP -> C
  • Java -> 字节码

转译器 - 将代码编译为相同级别的代码/抽象。

示例:

  • "开发人员代码" -> "另一个开发者的代码或版本"
  • JavaScript ES2015+ -> JavaScript ES5

解释器 - 解释代码,与上述两者不在同一类/层次/上下文中。

示例:php.exe

  • "您在index.php中的PHP代码/脚本" -> "结果为html或类似于纯index.html"

快速提问,如果我使用C++创建一种语言,并将该语言的源代码作为我的“编译器”的一部分转换为C++,那么这是否真的只是转换而非编译? - Alex
你认为Python在这个解释中的位置是什么?Python将源代码编译成字节码,然后使用一个字节码解释器来执行。考虑到所有这些,我认为Python和Java一样处于同一个级别:都是编译器。 - Tyson

35

如同这篇维基百科文章所述,源代码转换器是一种编译器,它将源代码从一种编程语言翻译成另一种编程语言。源代码可能采用一些不再使用的语言,或者不支持最新的硬件/软件进展,或者是为了程序员的方便和喜好。

VB6到VB.NET转换器可以被视为一个Transpiler。我认为COBOL到C# / C++ / Java工具也可以被视为一个Transpiler。


Xtend(http://www.eclipse.org/xtend/)和`NetRexx`(http://www.netrexx.org/)是两种被翻译成Java的编程语言。 - Bruce Martin
2
另一个例子是TypeScript语言,它被转译成JavaScript。 - Somnath Musib

22
通常情况下,当你使用JS预处理器(如CoffeeScript、TypeScript等)将代码转换为纯JavaScript时,这被称为“转译”。 但实际上,这并不是JS所独有的。它适用于各种编程语言。大多数情况下,它被称为编译。 “转译”是一个特定的术语,指将用一种语言编写的源代码转换为具有相似抽象级别的另一种语言。 根据https://www.stevefenton.co.uk/2012/11/compiling-vs-transpiling/。 因此,在你的情况下: - 将JSX编译为JavaScript(和HTML),我认为这符合上述定义,因此可以称之为“转译”。尽管称之为“编译”也可以。 另一个例子: - CoffeeScript / TypeScript / ... whatEverScript.. => JavaScript 反之亦然。

SQL转Java代码怎么样?它是编译器还是转译器?从上面的定义来看,它对我来说更像是编译器。不是吗? - user1870400
@user1870400 我对于 SQL 的看法是使用术语“代码生成”或“迁移”。这是在 SQL 等情况下你可能会听到的。但这取决于你想要做什么。我认为 SQL 不是一种编程语言,而是一种“查询语言”(希望没有人会因为这个说法而嘲笑我)。此外,当你考虑 OpenAPI/swagger 时,你可以从定义格式中生成代码。那可能不应该被称为编译,而是“生成”。 - fuma

10
我自1980年代以来一直在构建这样的工具
我们称之为“源到源程序转换系统”。这个术语在45年左右的时间里都很好用。这个想法早在此之前就已经存在了;可以查看Val Schorre的Meta II编译器-编译器工作,了解1963年版本的这个想法。
现在我们有了这个新术语;我几年前开始听说它。它并没有增加任何东西,但听起来很神秘、很酷。这就是教士们证明他们的价值的方式;他们为旧思想发明新词汇。

25
计算机曾经被称为“差分引擎”。 鼠标曾经被称为“用于显示系统的X-Y位置指示器”。 汽车的前身被称为“用于运送货车和特别是火炮的消防车”。 缩短词语是语言本质的一部分:参见Zipf定律和语言经济学。 “在我们那个年代,这已经足够好了,这些年轻人......”是无稽之谈。它被称为转换器,因为“源到源的转换编译器”对于日常使用来说太长了,现在转换器已经成为日常使用(TypeScript/CoffeeScript/ES6和SCSS是其中突出的例子)。 - Amadan
8
你的例子都是“这是我们在只有几个选择时使用的笨拙短语”;不久之后,标准术语就被确立了,人们也没有发明替代鼠标的术语。我的观点是,这项技术已经存在50多年了。如果你想在语言上更加简洁,"Transformation System"就是缩短长短语的方式。在计算机的许多领域中,这些术语已经成为日常用语;也许只是你没有注意到。TypeScript 的出现并没有突然改变概念,也没有导致需要新术语的需求。在我看来,你听起来像是那些牧师之一。 - Ira Baxter
5
@Amadan,你甚至都不准确。Babbage的设备被称为分析引擎。它的前身被称为差分机,但它并不是一台计算机。这是在1837年。像现在理解的那样使用术语“计算机”已经有70年了。 - user207421
6
我不认为你提出的任何例子都准确,因为你的论点基本上是凭借个人经验。语言是变化的这一点并不争议。问题是我们是否需要一个新术语来表达已有的概念。对语言变化的否定反应和创新一样是语言评估中合法的力量:这是语言学家常常忽略的一点。 - user207421
6
@Amadan给出的所有例子实际上都是错误的。本来还支持他,但连老鼠的名字都不是那个,只是被“描述”成那个。https://en.wikipedia.org/wiki/Douglas_Engelbart而且我查看了你的领英档案,Ira Baxter。你是一位贤者。非常尊重。 - Cozzbie
显示剩余5条评论

7
一种源到源编译器可以在大致相同的抽象层级上操作的编程语言之间进行翻译,而传统编译器则将高级编程语言翻译为低级编程语言。
来源:维基百科 - 编译器 - 将源代码从高级语言翻译为低级语言。
例如:C编译器(C到机器码),JDK的javac工具(Java到字节码) - 转译器 - 一种类型的编译器,可以在相同抽象级别的源代码之间进行翻译。
例如:Babel(ES6+到ES5)-您可以使用它编写ES6代码,同时仍支持IE 11及以下版本的旧版浏览器。

3
根据定义,转译器是一种特殊形式的翻译器编译器将高级源代码转换为更低抽象级别的代码。通常情况下,但不一定是,编译的目标是机器码。也就是说,可以直接由CPU执行的代码。编译器还可以生成字节码,这是一种模拟机器码的方式,但稍后会被所谓的虚拟机(例如Java虚拟机的Java字节码)解释。然而,术语编译器也可以应用于将代码转换为另一种不是机器可执行代码的编程语言的工具。编译器的显著区别在于它降低了抽象级别。 翻译器将源代码从一种编程语言转换为相同或不同抽象级别的另一种编程语言。请注意,如果源代码也是机器代码,则结果可以是机器代码。 转译器与翻译器非常相似,但专门将源代码在相同抽象级别的编程语言之间转换。请注意,编程语言在抽象方面有很大差异。尤其是在它们作为抽象所支持的不同概念方面,抽象级别有所不同。由于这个原因,转换(转译)通常在相似的抽象级别之间进行。

1
这个答案如果引用使用的陈述来源会更有益。我并不是说它是错误的,只是提供来源可以使其与其他答案区分开来。 - Trilarion

3

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

编译器类型

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接