C++是否编译成汇编语言?

28

C++代码是否会编译成汇编代码? 如果我们有C++代码,能否得到汇编代码?


关于查看汇编的部分:请参考如何从GCC/clang汇编输出中去除“噪音”?以获取使其更易于人类阅读的技巧。此外,还可以观看Matt Godbolt在CppCon2017上的演讲:“What Has My Compiler Done for Me Lately? Unbolting the Compiler's Lid” - Peter Cordes
关于编译器构建方面的问题:编译器是否总是生成汇编代码? - Peter Cordes
3个回答

37

绝大多数C++编译器将把C++源代码转换为目标文件(具有足够控制信息的机器代码,可以链接到可执行程序中)。它们可能实际上生成汇编语言作为中间步骤,甚至使用单独的汇编器来处理汇编源代码,但通常你看不到这一过程。例如,要让gcc生成汇编代码(.s文件),你必须通过使用-S标志来特别指定。通常情况下,你看不到汇编语言。

但C++标准并没有规定编译器输出的最终形式,只是要求代码在运行时能以某种方式表现出来。

事实上,早期的C++“编译器”实际上生成了C源代码,然后再编译。

你可以让C++编译器生成目标代码、Java字节码,甚至是GWBASIC,如果你愿意的话。


2
非常有信息量,只是一个问题,如何将C++代码编译成Java字节码? - Y.H.
4
抱歉,我并不是用来完成这个任务的最佳工具。但是如果你想进行这样的操作,你需要编写一个编译器。我没有意思表明已经有编译器可以完成这项任务,只是想说编写这样的编译器既可行又符合标准。 - paxdiablo
@MSalters,MSIL在概念上与JVM并不相似 - 它允许不安全的指针算术运算,并且存在混合模式程序集。但是,将C++编译为JVM是完全可能的,当然会有显著的性能损失。 - SK-logic
2
仅因为默认情况下你没有看到gcc输出汇编源文件,并不意味着它没有被创建。只需运行gcc -v ...并仔细查看即可(是的,这意味着gcc使用/创建临时文件,其中一个是汇编源)。要精确地说:至少gcc将始终创建汇编源文件(并调用汇编器对其进行编译),但默认行为是清理和删除这些“中间文件”。 - FrankH.
1
@emery,这些东西已经存在很长时间了,例如Pascal的p2c,Fortran的f2c,甚至原始的CFRONT C++编译器输出C代码。 - paxdiablo
显示剩余5条评论

24

你的代码必须被计算机理解,因为它不是被解释器或虚拟机执行,所以首先会被转换成汇编代码。你可以使用-S标志在g++的编译选项中获取这个汇编代码(当然只要你正在使用g++)。

g++ -S -o file.s file.cpp

应该就能解决问题了。


6
这取决于编译器。关于C++编译成什么样的代码,没有真正的规定,只要最终能在计算机上运行即可。大多数编译器都有一个开关可以将代码编译成汇编语言。
使用gcc,您可以添加-S选项将代码编译成.asm文件。
对于Visual Studio,请参见:http://codegem.org/2008/10/generate-assembly-from-c-code-in-visual-studio

3
您提供的链接已失效。 - Xantium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接