可能是一个相当模糊和广泛的问题,但是所有的C++编译器在将代码编译成机器码之前是否都会先将其编译成C语言?
可能是一个相当模糊和广泛的问题,但是所有的C++编译器在将代码编译成机器码之前是否都会先将其编译成C语言?
由于C编译器几乎无处不在,可以在几乎所有平台上使用,因此许多(已编译的)语言在其开发过程中都要经历这个阶段来启动进程。
在语言开发的早期阶段,为了确定该语言是否可行,最简单的方法是构建一个编译器,将您的语言转换为C然后让本地的C编译器构建实际的二进制文件。
问题在于特定于语言的结构会丢失,从而可能错过潜在的优化机会,因此大多数语言在第二阶段都会获得自己的专用编译器“前端”,该前端理解特定于语言的结构,并因此可以基于这些结构提供优化策略。
C ++已经在20多年前经历了第一阶段和第二阶段。 因此,很容易找到专门用于C ++并生成直接传递给后端的中间格式的编译器'前端'。 但是,仍然可以找到将C ++翻译成C(作为中间格式)然后再进行编译的版本。
不是这样的。例如,GCC将从C++转换为汇编语言。您可以使用g++命令的-S
选项来查看这一点。
实际上,现代编译器都不会先转换成C再转换成汇编语言。
在C++的早期阶段,仅使用了C作为其开发和演变的语言。今天大多数C++编译器直接编译成汇编或机器码。例如,Borland C++直接编译成机器码。
这是一个谬论,基于Stroustrup早期版本的实现方式。C++编译器生成的机器码与C编译器几乎完全相同。
截至2010年,我所知道的唯一一个创建C代码的C++编译器是Comeau*。然而,这个编译器已经超过5年没有消息了(2022年)。可能还有一两个用于嵌入式目标的编译器,但这肯定不是主流事情。
* - 这个WP页面上有一个指向他们旧网站的链接。我建议不要点击,除非你的电脑已经更新了所有的补丁。
这不是标准定义的。当然,编译成C源代码是一个合理的方法。它只需要目标平台有一个具有合理程度的C编译器,因此这是一种高度可移植的方法。 缺点是速度。可能会受到编译速度和执行速度(由于大量的强制转换,例如虚函数,防止编译器完全优化)的影响。 不久前,有一家公司拥有一个非常好的C++编译器,正是这样做的。不幸的是,我不记得公司的名字,短暂的谷歌也没有找回名字。该公司的所有者是ISO C++委员会的积极参与者,您可以直接在主页上测试您的代码,该主页还提供了一些相当不错的关于C++的资源。 编辑:我的一位同行刚刚提醒我。我当然是在谈论Comeau。