我已经研究过许多文章,以了解编译器是否生成对象代码或汇编代码,并且即使在堆栈溢出中也存在冲突。有人说编译器生成对象代码,而其他人说编译器会生成汇编代码,然后转换为对象汇编程序的代码。这两个答案都有投票权。是否有任何澄清或理由。
答案 0 :(得分:3)
最终,编译器必须以某种方式生成具有将在应用程序中结束的代码的目标文件,并且链接器组合来自目标文件和库(它们只是目标文件的集合)的代码以生成应用程序。因此,说编译器生成目标文件并且链接器将它们组合起来是正确的。
另一方面,编译器可以通过多种方式生成目标文件。一种方法是直接生成目标文件。另一种方法是生成汇编代码并运行汇编程序以生成目标文件。这引入了一些灵活性,因为编译器不必知道对象文件的布局细节;汇编程序就是这样做的。另一种方法是生成C代码并运行C编译器(可以依次生成汇编代码并运行汇编程序)来生成目标文件。这就是cfront如何在C ++的早期工作。它也是一些现代编译器前端的工作方式。例如,爱迪生设计集团(Edison Design Group)销售一个C ++前端,供应商可以连接到他们自己的后端进行代码生成。它们还提供了一个生成C代码的版本,以便在后端尚未运行时在编译器开发期间使用。通常在这些情况下,编译器会有一个开关来保存C或汇编程序文件,因此您可以检查它以查看正在进行的操作。