Programming languages 将高级语言翻译成机器语言的过程是什么?

Programming languages 将高级语言翻译成机器语言的过程是什么?,programming-languages,Programming Languages,我不认为我会很难找到这方面的信息,但是 过程是什么?我所学到的与我所发现的相矛盾 我的想法是: HLL -> Compiler -> Assembly Language -> Assembler -> Machine Code 这似乎是: HLL -> Compiler -> Machine Code 它仅仅依赖于高级语言吗 如果后者是真的,怎么办?(如果答案很大,不要担心。) 两者都是“编译器”功能的相对准确/适用的定义。严格地说,当然,编译器通常只是吐

我不认为我会很难找到这方面的信息,但是

过程是什么?我所学到的与我所发现的相矛盾

我的想法是:

HLL -> Compiler -> Assembly Language -> Assembler -> Machine Code
这似乎是:

HLL -> Compiler -> Machine Code
  • 它仅仅依赖于高级语言吗
  • 如果后者是真的,怎么办?(如果答案很大,不要担心。)

  • 两者都是“编译器”功能的相对准确/适用的定义。严格地说,当然,编译器通常只是吐出传递给汇编程序的机器代码,但同时,如果gcc默认吐出汇编代码,而不是通过汇编程序传递该程序来生成二进制代码,大多数人会感到惊讶


    这主要是一个关于定义的语义学问题——你是否关心一个实际的概念,或者你只是想知道一个公认的术语?

    这两个都是关于“编译器”功能的相对准确/适用的定义。严格地说,当然,编译器通常只是吐出传递给汇编程序的机器代码,但同时,如果gcc默认吐出汇编代码,而不是通过汇编程序传递该程序来生成二进制代码,大多数人会感到惊讶


    这主要是一个关于定义的语义问题——您关心的是一个实际的概念还是一个公认的术语?

    这个过程不仅在高级语言上,而且在编译器上都有很大的不同。如果你仔细观察,可能有比你想象的更多的步骤

    有些编译器确实在机器代码之前使用汇编语言,但老实说,它们几乎是同义词!只有两种表达同一事物的方式——翻译真的很容易。“movleax,ebx”总是成为同一台机器的同一组二进制文件


    现在编译器实际上倾向于将东西编译成一种中间语言,特别是像
    llvm
    这样的语言。LLVM将把任意数量的高级语言翻译成相同的中间语言,然后运行一系列优化过程(最终基本上是相同的中间语言),最后通过几个过程将其转换为特定于机器的代码。(这仍然是简化的,有许多过程和几种中间语言)。

    这个过程不仅在高级语言上,而且在编译器上都有很大的不同。如果你仔细观察,可能有比你想象的更多的步骤

    有些编译器确实在机器代码之前使用汇编语言,但老实说,它们几乎是同义词!只有两种表达同一事物的方式——翻译真的很容易。“movleax,ebx”总是成为同一台机器的同一组二进制文件


    现在编译器实际上倾向于将东西编译成一种中间语言,特别是像
    llvm
    这样的语言。LLVM将把任意数量的高级语言翻译成相同的中间语言,然后运行一系列优化过程(最终基本上是相同的中间语言),最后通过几个过程将其转换为特定于机器的代码。(这仍然是简化的,有许多过程和几种中间语言)。

    实际上汇编语言和机器代码是完全一样的,即汇编语言中的每个命令只有一个机器代码的翻译,反之亦然(检查PS)

    唯一真正的区别是“人类可读性”

    所以你们两条路都是正确的,都有相同的意义


    当然,如果你把机器代码翻译成汇编代码,所有变量名和一些其他元数据都会丢失,因为这些元数据不是实际的代码,但你仍然能够转换这些“新代码”它将提供初始二进制可执行文件

    实际上汇编语言和机器代码是完全相同的,即汇编语言中的每个命令只有一个机器代码翻译,反之亦然(请检查PS)

    唯一真正的区别是“人类可读性”

    所以你们两条路都是正确的,都有相同的意义


    当然,如果你把机器代码翻译成汇编代码,所有变量名和一些其他元数据都会丢失,因为这些元数据不是实际的代码,但你仍然能够转换这些“新代码”我想我只是想知道,如果有人问我这个问题,我会回答什么。读了所有的答案后,听起来我会说“这取决于”,我会说这取决于你被问到的背景。一般来说,我会说“汇编”。我想我只是想知道,如果有人问我这个问题,我会回答什么。读了所有的答案后,听起来我会说“这取决于”,我会说这取决于你被问到的背景。我一般说来是“汇编”。