Compiler construction 编译与传输

Compiler construction 编译与传输,compiler-construction,abstraction,transpiler,Compiler Construction,Abstraction,Transpiler,在寻找差异时,我遇到了以下定义: 编译是将用一种语言编写的源代码转换成另一种语言的通用术语 Transpiling是一个特定的术语,用于将用一种语言编写的源代码转换成具有类似抽象级别的另一种语言 我明白什么是抽象 但在上述定义中,“相似的抽象层次”是什么意思?我们如何在语言中找到抽象的层次 这里有一种描述性的回答方式 如果您认为抽象层就是这个示例: (1) CPU-level (actual logic gates on the CPU) (2)machine code (3)assembly

在寻找差异时,我遇到了以下定义:

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

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

我明白什么是抽象


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

这里有一种描述性的回答方式

如果您认为抽象层就是这个示例:

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

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

您上面引用的定义太笼统,初学者无法完全理解,因此让我将其简化为我们实际看到的内容

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

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

Transpiler的一些示例:

  • :将C/C++转换为JavaScript
  • :将ES6+代码传输到ES5(ES6和ES5是不同版本或不同代的JavaScript语言)
  • 现在,他们所说的“相似的抽象层次”是什么意思: 正如我所说的,它将编译/传输到源文件,可以说汇编语言也是源文件,因此gcc也是一个传输程序。所以,这个论点就是这个类似的抽象层次所无效的

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

    较低级别的语言(如汇编语言)非常接近处理器体系结构,即针对不同的处理器有不同的指令。当使用C/C++/Java/JavaScript时,将所有这些抽象化,提供更多抽象

    因此,transpiler编译成的语言更接近于您在此抽象中开始使用的语言(或者更接近于该语言在中低级-高级语言阶梯中的级别)


    希望这有帮助

    我基本上同意塔帕那和答案,但是


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

    我们现在倾向于使用transpiler来指定一个编译器,该编译器将代码翻译成与源代码“更相似”的其他代码,这就是编译器可能做的。当在同一上下文中提到这两种语言时,通常使用And来区分这两种语言(同样,这主要意味着一种transfile语言必须至少编译一次)


    例子 所以一切都很主观。在撰写本文时:

    • 来自Java世界,我可以调用CoffeeScript/TypeScript Transpiler来描述生成的代码并不比原始代码更高效
    • CoffeScript说它是一个编译器,而babel是一个transpiler。WandDo说,CoffeeScript虽然非常相似,但不是Javascript。至少不是它的一个版本,因为这是巴贝尔生产的
    • 称自己为编译器

    法兹特 所以transpile现在很少再被使用了,只是用来区分两个编译器

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

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

    “Microsoft TypeScript是一种由Microsoft开发和维护的开源编程语言。它是JavaScript的严格语法超集,并在语言中添加了可选的静态类型


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

    “transpilers的一些示例:”---巴贝尔称自己为编译器。transpilers和编译器之间的分离实际上是人为的。@zerkms正如我所说,transpilers是编译器的一个子集。我想补充一点,我们在这里讨论的是自然语言。因此,模糊定义是可以预期的。我希望“易于阅读”“transpiler的输出与以前类似,而编译器使内容更难阅读。因此Webpack/npm是一个编译器,您不想读取它的输出。(至少当你为例如.vue文件添加“加载器”时。观点:我认为定义应该是:编译:语言->低级语言。翻译:语言->同级语言。@Deji不一定是同级语言,而是处于类似抽象级别的语言。奇怪的是,“抽象级别”列表在哪里来自?只是随机的说明性示例,我知道前两个有点像tbh,但我想要一个更长的列表:PI喜欢它,如果它是的话,它会很酷