【问题标题】:Who converts High Level Language to Assembly language谁将高级语言转换为汇编语言
【发布时间】:2023-09-15 19:31:01
【问题描述】:

好吧,通过计算机指令/程序的基本功能,我了解到我们用高级语言编写源代码。编译器将其转换为低级语言(机器代码/目标代码)。我还了解到,Assembler 将汇编语言转换为机器代码/目标代码。
然后我有以下疑问:

  1. 如果编译器直接将高级转换为低级,则从哪里生成此汇编语言。

  2. 如果转换过程必须通过汇编语言,即

高级语言 ====> 汇编语言 ====> 目标代码/机器码,
那么谁把这种高级语言转换成汇编语言,有什么用呢?强>

【问题讨论】:

  • 一般来说,没有人。高级编译器不会将源代码转换为汇编语言。相反,他们直接将其转换为目标代码/机器代码。汇编语言是对象/机器代码的人类可读版本,专为程序员设计。 (但是,正如其他答案所暗示的那样,几乎总是可以向编译器询问高级语言,以便为您提供它生成的对象/机器代码的汇编代码列表,这就是混乱开始的地方发生)。
  • @CodyGray:gcc 使用非常广泛,并且确实将 asm 编写为编译器的文本输出并在其上运行汇编程序,作为运行单独可执行文件的单独进程。 (tmp 文件或管道)。 binutils 甚至是一个独立于 gcc 本身的包。所以一些编译器肯定会以这种方式编译。 Clang 不会,其他不太便携的编译器也经常直接使用机器代码。
  • 您可以将汇编语言视为表示机器语言的一种方式。编译器不需要在汇编语言站停下来,

标签: assembly compilation


【解决方案1】:

这是一个非常笼统的问题(老实说,也有点难以理解)。

高级语言的编译器可以将高级代码转换为汇编程序,而辅助实用程序可以将汇编程序转换为您所说的机器代码。编译器也可以直接生成机器代码。任何一个选项都是有效的,由编译器的设计者决定哪个最合适。

也就是说,汇编距离“机器码”只有一步之遥,因此能够读取它以确定编译器所做的工作通常很有用。有时,这会导致可以优化高级代码的洞察力;其他时候,1337 程序员可能会选择手动编辑程序集。因此,即使编译器看起来直接生成机器代码,但通常情况下它可以生成汇编代码。

更多详情请参阅this SO answer

【讨论】:

  • gcc -S -fverbose-asm 实际上会将 cmets 放入 asm 中,因此它比简单地反汇编机器码输出更有意义。 ICC(英特尔的编译器)对分支的分支概率进行百分比估计。 clang 的 -fverbose-asm 包括 cmets 显示 SIMD 矢量洗牌的作用(例如 xmm0 = xmm1[3,2,3,2])。
  • @Richard:谢谢,我明白你的观点,这取决于实现。可能有两种情况 - :1.编译器将 HLL 转换为汇编语言,然后汇编器将汇编语言转换为 LL 语言(机器码/目标码)2.编译器直接将HLL转换为LLL(机器码/目标码)..如果你能帮助我解决这两个概念,将不胜感激:目标码或机器码..这些是什么时候生成的? (在哪些情况下)?
  • @laura:本网站的格式是尽可能一次只询问一个问题。如果此处尚不存在该问题的答案,则应将其作为新问题提出。
  • 我相信在您的第二段中,您使用的是汇编程序两次而不是汇编。正确的?汇编 = 语言,汇编器 = 将汇编转换为机器代码的“程序”。
【解决方案2】:

只是术语不精确和具体实现的问题。

在“经典”模型中,编译器将高级代码转换为汇编,汇编器将其汇编为机器代码,然后存储到目标文件中,然后链接生成可执行文件。

通常所有这些步骤大部分都是隐藏的(尤其是汇编部分),因为通常您通过“编译器驱动程序”调用编译器,它会自动调用此工具链的所有部分,尽管通常有一些选项可以在某些时候停止流程检查正在发生的事情的级别(在汇编级别停止检查编译器的工作很有趣,甚至有several sites dedicated just to that)。

尽管如此,这仍然是一个相当高级的视图,并且根据语言和实现的不同,某些步骤可能会丢失或处理方式不同 - 例如,您可以让编译器生成直接机器代码,或者链接器生成程序集/机器代码,而不仅仅是链接(当您启用链接时间代码生成时,这种情况一直发生)。所以,上面的模式就是这样 - 一个理解基本流程的有用模式,它绝不是可以完成的可能性。只要高级语言进入,某种可执行代码退出,一切都会发生。

【讨论】:

    【解决方案3】:

    实际上编译器永远不会将高级语言转换为机器级语言。这个定义是正确的,但仅适用于 C 语言。 因为例如在 java file.java 中,编译器将把它转换为字节码,该编译器既不是高级语言也不是低级语言,而是一种中间语言。 编译器是一个程序,因为它将源代码或语言转换为目标代码或语言,其中源代码可以是高级语言,但目标代码应该低于源代码,因为如果两者的级别变得相同,则称为预处理器。

    【讨论】: