我的理解是编译器将高级语言转换为机器代码。我有一个问题,编译器(比如VC ++)是否也使用汇编程序?我记得看到汇编代码,无论何时发生崩溃或类似事件。
答案 0 :(得分:5)
这取决于编译器;许多编译器可以编译成汇编。例如,如果您将'-S'标志传递给gcc,例如:
gcc -S -o test.S test.c
这会将test.c文件的程序集输出到文件test.S中,您可以查看。 (如果您要尝试阅读程序集,我建议使用-O0,因为那里的编译器优化可能会让您感到困惑。)
由于您在问题中提到了Visual C ++,Paul Dixon在下面指出Visual C ++使用the /FA flag来完成同样的事情。
答案 1 :(得分:3)
通常,编译器会将一种语言翻译成另一种语言。大多数编译器都针对机器代码;以下是从最低级别到最高级别的最常见方式:
如果您想尝试编写编译器,我建议您从像C这样的后端开始。如果您想稍后更详细,请尝试LLVM。如果您尝试直接生成汇编语言或机器代码,它可能不如C编译器或LLVM产生的效率低。我在这个问题上发表令人尴尬的个人经历。
答案 2 :(得分:1)
编译器直接转到机器代码。
调试器将机器代码指令显示为汇编程序,但调试器也可以显示编译器未编译的其他代码。
编译器还可能包含汇编程序,因此您可以使用更高级语言包含内联汇编程序代码或生成汇编程序输出。
答案 3 :(得分:1)
大多数编译器都可以选择查看汇编列表
答案 4 :(得分:0)
编译器将某些高级编程语言翻译成某种低级语言(例如机器代码,汇编语言或其他高级语言,例如从Vala到C,或从uC ++到C ++)。
我不了解VC ++,但大多数编译器,因为GNU GCC不包括汇编程序,但调用外部汇编程序(作为NASM或GNU AS)。
干杯