繁体   English   中英

将高级语言编译为机器代码

[英]Compiling high-level language to machine code

在从网站上阅读了一些答案并查看了一些资源后,我认为编译器会将高级语言(例如C ++)转换为机器代码,因为计算机本身不需要将其转换为汇编,它只会转换它组装以供用户查看代码,并且可以根据需要对代码进行更多控制。

但这可以在我的一个演讲表中找到,所以如果有人能够进一步解释并纠正我,如果我错了,或者下面的截图,我会感激。

滑动

你的幻灯片大多是错的......

程序集和机器代码之间存在一对一的映射。 程序集是信息的文本表示,机器代码是二进制表示。

但是,某些机器支持附加的汇编指令,但生成的汇编代码中包含的指令仍然在编译时确定,而不是运行时。 但一般来说,这取决于系统中的处理器(intel,amd,ti,nvidia等),而不是您购买整个系统的制造商。

此幻灯片使字节码与文本汇编混淆。 汇编是字节码或机器码的人类可读版本。 机器代码是硬件可以直接运行的。 字节码进一步编译为机器码,它是低级的,但是通用的。

有些语言使用字节代码,在运行时将其转换为更低级别的机器代码。 其中一个例子是java,其中类文件有时会被编译为机器代码作为运行时优化。 另一个是cuda,其中每个nvidia gpu都有不同的指令集,但cuda编译器生成字节码,然后每个gpu的cuda驱动程序可以转换。

另一个选择是他正在讨论英特尔处理器如何在运行时将机器代码转换为内部微代码然后运行它,这对软件来说是完全不可见的,包括操作系统。

幻灯片在很多方面都是错误的。

幻灯片中给出的示例中实际发生的事情的一个大大简化的版本 - 编译C ++ - 将解释从源代码文件生成和执行的编译有四个阶段:

  1. 预处理
  2. 编译“正确”
  3. 部件
  4. 链接

预处理阶段,预处理程序指令(如#include#define被完全展开, 预处理器将删除注释,从而创建“postprocessed” C ++ 幻灯片完全忽略了这一点。

编译“正确”阶段, 编译器将前一阶段的后处理文本转换为汇编语言 不幸的是,我们对整个四步程序和这一步使用相同的术语 - 编译 - 但这就是它的方式。

与幻灯片相反,汇编语言语句不是 “OS可读”,也不是在运行时转换为机器代码。 相反, 汇编程序可以读取它们,它在编译时完成它的工作(下一段)。

汇编阶段,汇编器将前一阶段的汇编语言语句转换为目标代码 (CPU理解的二进制机器代码指令,结合操作系统和链接器理解的元数据)。

链接阶段,来自前一阶段的目标代码与其他目标代码文件和公共/系统库链接以形成可执行文件。

在运行时,操作系统 - 特别是加载程序 - 将可执行文件读入内存并执行运行时链接,其中解析对公共/系统库的引用,并将这些库加载到内存中(如果它们尚未存在),以便可执行文件可以使用它们。

另一个错误是不同品牌的机器没有 “自己的机器代码”。 决定机器理解机器代码的是CPU。 如果两台机器具有相同的CPU(例如戴尔笔记本电脑和具有相同Intel i7-3610QM CPU的Toshiba笔记本电脑),那么他们就能理解相同的机器代码。 此外,具有相同ISA(指令集架构)的两个CPU理解相同的机器代码。 此外,较新的CPU通常向后兼容同一系列中较旧的CPU。 例如,较新的Intel i7 CPU了解旧版Intel Pentium 4可以理解的所有指令,但反之亦然。

希望,我在简单性和正确性之间取得了比上面的幻灯片更好的平衡,上面的幻灯片惨遭失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM