编译器 vs 解释器 vs 转译器

Compiler vs Interpreter vs Transpiler

提问人:RBT 提问时间:8/31/2016 最后编辑:RBT 更新时间:10/7/2022 访问量:20370

问:

在我参加的 ReactJS 会议期间,演示者使用了一个术语转译器来描述一些代码转换/移植。过去,我听说过编译器和解释器这两个术语。我曾在将用户编写的语言代码转换为计算机系统上的可运行形式时使用过。Transpiler 对我来说是新的。转译器与编译器或解释器有何不同,为什么需要它?

编译器构造 与语言无关 的术语 解释器 转译器

评论

9赞 SK-logic 8/31/2016
你是对的 - 转译器是一个多余的术语,永远不应该使用。任何编译器都是“转译器”。
7赞 RBT 4/23/2018
亲爱的投票者 - 如果您能留下适当的反馈/评论,那么我可以采取适当的行动来改进帖子。

答:

35赞 Ajay 8/31/2016 #1

正如这篇 Wiki 文章中提到的,它是一种将源代码从一种编程语言转换为另一种编程语言的编译器。源代码可能使用某种不再使用的语言,或者不支持最新的硬件/软件进步,或者根据程序员的方便/偏袒。

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

评论

0赞 Bruce Martin 9/1/2016
Xtend (eclipse.org/xtend)(netrexx.org) 是翻译成 Java 的 2 种语言NetRexx
2赞 Somnath Musib 4/28/2018
另一个例子是将 TypeScript 语言翻译(转译)为 JavaScript。
10赞 Ira Baxter 9/1/2016 #2

自 1980 年代以来,我一直在构建此类工具

我们称它们为“源到源程序转换系统”。

该任期任期为AFAICT服务了大约45年。这个想法可以追溯到很久以前。参见 Val Schorre 的 Meta II 编译器-编译器工作,了解这个想法的 1963 版本。

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

评论

25赞 Amadan 9/1/2016
而计算机曾经被称为“差分引擎”。鼠标曾经被称为“显示系统的 X-Y 位置指示器”。汽车的前身被称为“用于运输货车,尤其是火炮的消防车”。缩短事物是语言的本质:参见齐普夫定律和语言经济学。“这对我们来说已经足够好了,这些年轻人......”是垃圾。之所以称为转译器,是因为“源到源转换编译器”对于日常使用来说太长了,现在转译器日常使用(TypeScript/CoffeeScript/ES6 和 SCSS 是突出的例子)。
8赞 Ira Baxter 9/1/2016
你的例子都是“这是我们在只有几个人时使用的笨拙短语”;不久之后,标准术语就被建立起来了,人们还没有发明鼠标的替代术语。我的观点是这项技术已经与我们相伴了 50+ 年。“转换系统”是缩短较长短语的方式,如果你想要语言经济。这些已经在许多计算领域进行了日常使用;也许只是你没有注意到他们。出现 TypeScript 不会突然改变概念,并导致需要一个新术语。在我看来,你听起来像那些牧师之一。
5赞 user207421 9/2/2016
@Amadan 你甚至不准确。巴贝奇的设备被称为分析引擎。它的前身被称为差分引擎,但它不是计算机。那是1837年。目前所理解的“计算机”一词已经使用了七十年,
6赞 user207421 9/7/2016
@Amadan 我不认为你的任何例子实际上都是准确的,而且由于你的论点从根本上说是轶事,它取决于你的例子。语言是动态的,这一点没有争议。问题是我们是否需要为现有概念使用一个新术语。在语言评价中,对语言变化的负面反应与创新一样,是一股合理的力量:语言学家总是忽视这一点。
6赞 Cozzbie 10/5/2017
实际上,@Amadan个例子都是正确的。为他加油,连老鼠都不是这样命名的,而是那样“描述”的。en.wikipedia.org/wiki/Douglas_Engelbart艾拉·巴克斯特(Ira Baxter)查看了您的LinkedIn个人资料。你是个圣人。非常尊重。
22赞 fuma 9/7/2016 #3

它通常被称为“转译”,当你使用JS预处理器(如CoffeeScript、TypeScript)将代码翻译成纯JavaScript时。 但这真的不是 JS 独有的东西。它适用于所有类型的编程语言。大多数情况下,它只是称为编译。

转译是编写源代码的特定术语 在一种语言中,并转换为具有类似抽象级别的另一种语言。

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

因此,就您而言

  • 'compile' JSX => JavaScript(和 HTML),我认为这与上面的定义相匹配。
  • 因此,它可以称为“转译”。虽然称它为“编译”也可以。

另一个例子:

  • CoffeeScript / 打字稿 / ...whatEverScript..=> JavaScript,反之亦然。

评论

0赞 user1870400 8/27/2019
SQL到java代码怎么样?是编译器还是转译器?从上面的定义来看,它听起来像是一个编译器。不是吗?
0赞 fuma 9/2/2019
@user1870400 对于SQL,我在这里的意见是使用术语“代码生成”或“迁移”。这就是您在 SQL 等情况下可能在这里看到的。但这取决于你可能想做什么。我想说的是,SQL不是一种编程语言,而是一种“查询语言”(希望没有人会因为这种说法而嘲笑我)。此外,当您考虑 OpenAPI/swagger 时,您可以用定义格式生成代码。这可能不是应该称为编译的,而是“生成的”。
54赞 Jim M 11/17/2017 #4

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

例:

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

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

例:

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

解释器 - 解释代码,而不是与上述两个在同一类/联盟/上下文中。

例:php.exe

  • “你的PHP代码/脚本里面” -> “结果为或只是像纯index.phphtmlindex.html"

评论

0赞 Alex 8/31/2020
快速提问,如果我使用 C++ 创建一种语言,并将该语言的源代码转换为 C++ 作为我的“编译器”的一部分,那真的只是转译吗?
0赞 Tyson 6/10/2022
你认为Python在这种解释中的位置在哪里?Python 将源代码编译为字节码,然后使用字节码解释器执行。鉴于所有这些,我认为 Python 与 Java 处于同一级别:编译器。
7赞 shaahiin 11/27/2017 #5

源到源编译器在以大致相同的抽象级别运行的编程语言之间进行转换,而传统编译器则从高级编程语言转换为较低级别的编程语言。

来源 : 维基百科

  • 编译器 - 将源代码从高级语言转换为高级语言。
    示例:C编译器(C到机器码),JDK的javac工具(java到字节码)
  • Transpiler - 一种编译器,在相同抽象级别的源代码之间进行转换。
    示例:Babel(ES6+ 到 ES5) - 您可以使用它来编写 ES6 代码,同时仍然支持 IE 11 及以下版本等较旧的浏览器。
3赞 Valera Grishin 11/18/2018 #6

根据定义,转译器是一种特殊形式的翻译器。

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

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

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

评论

1赞 NoDataDumpNoContribution 7/30/2020
这个答案将受益于引用所用陈述的来源。我不是说这是错的,只是提供来源可以将其与其他答案区分开来。
3赞 Jeyanth 1/22/2019 #7

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

编译器的类型

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