所有程序是否最终转换为汇编指令?

看起来我所学的每一堂课都是对一个新课题的介绍,这个课题未能提供全面的知识,使我能够制作一个可以在IDE之外执行的实际程序。 认识到我不知道的东西既令人沮丧又令人恐惧,令我感到困惑的是,认可的计算机科学计划可能会提供一种课程,从一开始就不会对此过程有所了解。

实际问题:原谅引言,但它提供了我的(经验)的好迹象。 目前,我正在学习计算机体系结构课程中的MIPS,并且已经为组装提供了一个快速介绍。 如果可能的话,一个程序如何执行的细节往往被描述为魔术,并在另一位老师的地毯下刷过。

我的理解是,处理器电路因芯片而异,因此可能需要不同的低电平指令来执行相同的高级代码。 所有程序在成为原始机器代码之前是否最终转换为汇编语言,或者这一步不再必要?

如果是这样,那么处理器在什么时候开始执行自己独特的一组指令? 这是最低级别的代码,所以在这一点上,程序指令是由处理器逐位执行的?

最后,所有架构都需要汇编语言吗?


可以这么说,汇编语言是一种表达处理器执行的指令的可读形式(它是二进制数据,并且非常难以由人来管理)。 因此,如果机器指令不是由人类生成的,则使用组装步骤不是必需的,尽管它有时确实是为了方便而发生的。 如果一个程序是用诸如C ++之类的语言编译的,编译器可以直接生成机器码,而不需要经过汇编代码的中间阶段。 尽管如此,许多编译器提供了生成汇编代码的选项,以便人们更容易检查生成的代码。

许多现代语言,例如Java和C#被编译成所谓的字节码。 这是CPU不直接执行的代码,而是一种中间格式,当程序执行时它可能会被编译为机器代码(JIT-ted)。 在这种情况下,依赖于CPU的机器代码会生成,但通常不需要通过人类可读的汇编代码。


汇编语言只是一个人类可读的原始机器代码的文本表示。 它的存在是为了(人类)程序员的利益。 作为产生机器码的中间步骤并不是必要的。 一些编译器会生成汇编,然后调用汇编器将其转换为机器码。 但是由于省略这一步会导致编译速度更快(并且难以实现),编译器(广义而言)将趋向于直接生成机器代码。 尽管可以选择编译为汇编,但检查结果是有用的。

对于你的最后一个问题,汇编语言是一种人类的便利,所以没有任何架构真的需要它。 如果你真的想要,你可以创建一个没有人的架构。 但实际上,所有架构都有汇编语言。 首先,创建一种新的汇编语言非常简单:为所有机器操作码和寄存器提供文本名称,添加一些语法来表示不同的寻址模式,并且您已经完成了大部分工作。 即使所有代码直接从高级语言直接转换为机器语言,您仍然需要汇编语言,只是为了在查找编译器错误时作为拆分和可视化机器代码的方式。


每个通用CPU都有自己的指令集。 也就是说,某些字节序列在执行时会对寄存器和内存产生众所周知的记载效果。 汇编语言是写下这些指令的一种便捷方式,这样人们就可以读写它们并理解它们所做的事情,而无需一直查找命令。 对于每个现代CPU而言,存在汇编语言是相当安全的。

现在,关于程序是否转换为程序集。 我们首先说CPU不执行汇编代码。 它执行机器代码,但机器代码命令和装配线之间存在一一对应的关系。 只要你牢记这一点,你可以说“像现在的CPU执行一个MOV,然后是一个ADD”等等。 当然,CPU执行对应于MOV命令的机器码。

也就是说,如果你的语言编译为本地代码,你的程序确实在执行之前转换为机器码。 有些编译器(不是全部)通过发布汇编源并让汇编器完成最后一步来完成这些工作。 这个步骤如果存在的话,通常隐藏得很好。 程序集表示只在编译过程中存在一段时间,除非您告诉编译器保持原样。

其他编译器不使用汇编步骤,但如果要求则发出汇编。 例如,Microsoft C ++采用了一个选项/ FA - 将对象文件与程序集列表一起发布。

如果它是一种解释型语言,那么没有明确的转换到机器。 源代码行由语言解释器执行。 面向字节码的语言(Java,Visual Basic)居住在两者之间; 它们被编译成与机器代码不同的代码,但比高级代码更易于解释。 对于这些人来说,说他们没有转换为机器码也是公平的。

链接地址: http://www.djcxy.com/p/72411.html

上一篇: Are all programs eventually converted to assembly instructions?

下一篇: x86 assembly instructions optimisation