因为我理解c ++代码由汇编代码组成,当我编译程序时,它被读作其程序集等效,然后由编译器运行。我也明白,汇编语法和功能会从一个模型变为一个模型。如果是这样的话,编译器如何设法编译程序而不会遇到错误?我的意思是,编译器不可能保存创建的每个汇编语言变体,是吗?
答案 0 :(得分:5)
我认为您将汇编代码与机器代码混淆了。它不一样。机器代码是CPU执行的 - 指令和数据的字节流。汇编是机器代码的可读表示。
确实,所有C ++代码最终都被编译成机器代码。是的,指令集在CPU和CPU版本之间变化。编译器的概念是"目标架构" - 编译时,您可以选择指定一个。如果你不这样做,通常会假设当前机器的架构。是的,编译器供应商必须努力支持他们打算支持的每种CPU。幸运的是,并没有那么多。此外,在C编译过程中,代码生成甚至不是最复杂的步骤,因此大多数编译器自己的代码都不是CPU特定的。
有些编译器通过汇编工作 - 而不是生成机器代码,它们生成汇编并将其提供给汇编程序以进行编译的最后阶段。使用这种设计,您的编译器通常假定系统中存在某种特定版本的汇编程序 - 通常是GNU汇编程序(as
)。
答案 1 :(得分:2)
我认为你误解了#34;汇编代码的含义"。
C ++代码不包含""汇编代码;它由C ++代码组成。
编译器将此C ++代码转换为,最终转换为可在计算机上运行的可执行机器代码(通常在操作系统的指导下)。
汇编代码是机器代码的人类可读符号表示。通常,一行辅助代码对应于机器代码的单个CPU指令。汇编语言是一种比C ++(甚至C)更更低级的语言。
一些C ++编译器生成汇编代码作为中间步骤;然后将汇编代码转换为可执行的机器代码。其他C ++编译器跳过该步骤并直接生成机器代码(尽管他们可能有选项来生成人类可读的汇编列表)。
通常,每个编译器都接受单个高级语言(C,C ++等)的输入,并为一个CPU(x86,ARM,MIPS等)生成输出。编译器通常是分阶段设计的,因此处理高级输入语言的部分可以与生成机器特定代码的部分组合。 gcc就是这样设计的。有前端处理许多不同的输入语言,代码生成器为不同的CPU生成代码。因此,如果您已经拥有Ada前端和MIPS后端,那么太难以将它们连接在一起以创建生成MIPS机器代码的Ada编译器。
关于编译器如何处理,而不是充满了错误",嗯,这只是很多工作。