1. 一些术语
机器码:machine code == 机器指令:machine instruction == 指令instruction
汇编语言:assembly
汇编器:assembler
高级语言:high-level language
编译器:compiler
2. 编译器和汇编器的区别
机器码
机器码即一条条的指令,可以被CPU处理器所识别的语言,CPU可以执行对应的指令,实现相应的功能。
不论是编译器还是汇编器,最终生成的都是机器码。
汇编语言
汇编器产生机器码,指的是将汇编语言已编译成机器码。
汇编语言中的每一个命令,一般情况下,都对应着一个,可以被CPU所识别的,机器码中的,机器指令。
高级语言
编译器,将高级语言编译成机器码。
绝大多数的高级语言,比如C,C++,Java等,的命令,即高级语言写出来的语句,和机器语言都没有一一对应的关系,一般来说,一条高级语言的语句或几条语句所组成的代码段,都对应着(更多)多条机器码。
硬件抽象层
硬件抽象层是一种技术,将底层硬件细节抽象隐藏出来,以方便上层软件编程。
汇编语言中,一般不存在硬件抽象层的概念,因为其本身语句,就接近于硬件指令,是用来直接操作硬件的。
而被编译器所编译后的高级语言,会很大程度地涉及到硬件抽象层。
汇编器的优势和劣势
由于汇编语言本身和指令就基本是一一对应的关系,所以用汇编器将汇编代码编译所生成的可执行代码(指令)的效率,比高级语言被编译器最终编译生成的可执行代码的效率,要高很多。
所以,当程序的性能作为最重要的考量的时候,比如在图像处理方面,或者是硬件资源有限的情况下,倾向于用汇编语言,以实现代码运行更高效,占用资源更少的效果。
汇编语言的劣势是,不容易使用,难学,难用。
编译器的优势和劣势
在绝大多说情况下,在这点很小的性能的提升方面的优势,不足够补偿其在难学难用方面的劣势,此时,
往往使用高级语言,比如C,C++,Java等。高级语言,更容易使用,更容易用来描述更加复杂的上层逻辑等。
3. 总结
汇编器 vs 编译器
汇编器 | 编译器 | |
输入文件 | 汇编(源)代码 | 高级语言(C/C++/Java/…的源)代码 |
输出文件 | 机器码(指令) | 机器码(指令) |
是否有代码优化功能 | 一般没有(一般也不需要,因为只是涉及到将汇编代码直接转换/翻译为机器码) | 一般都包含代码优化(优化代码,以提高运行效率) |
汇编语言 vs 高级语言
汇编语言(不同CPU对应不同的自己的汇编语言和机器语言) | 高级语言(C/C++/Java/…) | |
学习和使用的难易度 | 难 | 相对容易 |
和机器指令的一一对应程度 | 基本一一对应 | 一条高级语言往往对应着多条机器指令 |
代码执行效率 | 极高 | 相对汇编来说较低 |
【参考资料】
1. Difference Between Assemblers and Compilers
2.Difference between assembler and compiler?
转载请注明:在路上 » 【整理】编译器和汇编器的区别 + 汇编语言和高级语言的区别