通过基本的计算机指令/程序功能,我了解到我们用高级语言编写源代码。编译器将其转换为低级语言(机器代码/目标代码)。我还了解到汇编程序将汇编语言转换为机器代码/目标代码 然后我有疑虑:
如果编译器直接将高级别转换为低级别,则生成此汇编语言。
如果转换过程必须通过汇编语言,即
高级语言====>汇编语言====>目标代码/机器代码,
那么谁将这种高级语言转换为汇编语言以及它的用途是什么?
答案 0 :(得分:2)
这是一个非常普遍的问题(说实话也有点难以理解)。
高级语言的编译器可以将高级代码转换为汇编程序,辅助实用程序可以将汇编程序转换为您所谓的机器代码。编译器也可以直接生成机器代码。这两个选项都是有效的,由编译器的设计者决定哪个是最合适的。
也就是说,汇编距离“机器代码”只有一步之遥,因此能够读取它以确定编译器的功能通常很有用。有时这会产生洞察力,允许人们优化高级代码;其他时候,1337程序员可能会选择手动编辑程序集。因此,即使编译器直接生成机器代码,通常情况下也可以生成汇编代码。
有关详细信息,请参阅this SO answer。
答案 1 :(得分:2)
这只是一个不精确的术语和具体实施的问题。
在" classic"模型,编译器将高级代码转换为汇编,汇编器将其汇编为存储到目标文件中的机器代码,然后链接到目标文件以生成可执行文件。
通常所有这些步骤都是隐藏的(尤其是程序集部分),因为通常你通过编译器驱动程序"来调用编译器,它会自动调用这个工具链的所有部分,尽管通常有选项可以在某个级别停止流程以检查正在进行的操作(在程序集级别停止以检查编译器的工作是否足够有趣,甚至有several sites dedicated just to that)。
尽管如此,这仍然是一个非常高级别的视图,并且取决于语言和实现,某些步骤可能会丢失或处理不同 - 例如,您可以让编译器生成直接的机器代码,或者链接器生成程序集/机器代码而不仅仅是链接(当您启用链接时间代码生成时,这种情况一直发生)。因此,上面的模式就是这样 - 一个理解基本流程的有用模式,它并不是穷尽可能完成的可能性。只要高级语言进入,某种可执行代码就会退出,任何事情都会发生。