高级语言(C语言)、汇编语言、机器语言区别?编译器如何将高级语言编译成机器语言?
⾼级语⾔:
是相对于汇编语⾔⽽⾔的,是⾼度封装了的编程语⾔,与低级语⾔相对。它是以⼈类的⽇常语⾔为基础的⼀种编程语⾔,使⽤⼀般⼈易于接受的⽂字来表⽰(例如汉字、不规则英⽂或其他外语),从⽽使程序编写员编写更容易,亦有较⾼的可读性,以⽅便对电脑认知较浅的⼈亦可以⼤概明⽩其内容。
⾼级语⾔基本脱离了机器的硬件系统,⽤⼈们更易理解的⽅式编写程序。编写的程序称之为源程序。主要有C,C++,Python,perl 等等。
⾼级语⾔主要分为2类:
解释型:原代码由解释器⼀边解释为可执⾏的机器语⾔,⼀边执⾏,效率⽐较低,⽽且不能⽣成可独⽴执⾏的可执⾏⽂件,应⽤程序不能脱离其解释器,但这种⽅式⽐较灵活,可以动态地调整、修改应⽤程序。如python。
**编译类:**编译是指在应⽤源程序执⾏之前,就将程序源代码“翻译”成⽬标代码(机器语⾔),因此其⽬标程序可以脱离其语⾔环境独⽴执⾏,使⽤⽐较⽅便、效率较⾼。但应⽤程序⼀旦需要修改,必须先修改源代码,再重新编译⽣成新的⽬标⽂件(* .OBJ)才能执⾏,只有⽬标⽂件⽽没有源代码,修改很不⽅便。现在⼤多数的编程语⾔都是编译型的,例如C/C++。
汇编语⾔(assembly language)
是⼀种⽤于电⼦计算机、微处理器、微控制器或其他可编程器件的低级语⾔,亦称为符号语⾔。在汇编语⾔中,⽤助记符(Mnemonics)代替机器指令的操作码,⽤地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语⾔对应着不同的机器语⾔指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语⾔和特定的机器语⾔指令集是⼀⼀对应的,不同平台之间不可直接移植。
简单来说,汇编语⾔是机器语⾔(⼆进制指令)的⽂本形式,与指令是⼀⼀对应的关系。汇编语⾔由汇编编译器汇编为机器语⾔(⼆进制指令)交CPU执⾏。
机器语言
机器语言机器能直接识别的程序语言或指令代码,无需经过翻译,每一操作码在计算机内部都有相应的电路来完成它,或指不经翻译即可为机器直接理解和接受的程序语言或指令代码。机器语言使用绝对地址和绝对操作码(操作码和地址解释)。不同的计算机都有各自的机器语言,即指令系统。从使用的角度看,机器语言是最低级的语言。
- 机器语言是直接用二进制代码指令表达的计算机语言,指令是用0和1组成的一串代码,像0101010这种。
汇编语⾔和机器语⾔
汇编语言就是对机器语言的一种转义和描述,具备初步的可读性,但是编写也十分困难和效率低下。汇编语言用符号代替机器语言的二进制码(比如用助记符代替操作码),就把机器语言变成了汇编语言。因此汇编语言亦称为符号语言。
汇编语⾔(符号语⾔)是⾯向CPU的,因此CPU不同,汇编语⾔就不⼀样,有什么CPU架构就有什么汇编语⾔,⽐如x86架构的就是x86汇
编,ARM架构的CPU对应于ARM汇编,MIPS架构的CPU对应于MIPS汇编。
CPU根据总线宽度可以分8位,16位,32位,64位等,所以相应的就有8位汇编,16位汇编,32位汇编等。
汇编语⾔优点
1、因为⽤汇编语⾔设计的程序最终被转换成机器指令,故能够保持机器语⾔的⼀致性,直接、简捷,并能像机器指令⼀样访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端⼝等。使⽤汇编语⾔,可以访问所有能够被访问的软、硬件资源。
2、⽬标代码简短,占⽤内存少,执⾏速度快,是⾼效的程序设计语⾔,经常与⾼级语⾔配合使⽤,以改善程序的执⾏速度和效率,弥补⾼级语⾔在硬件控制⽅⾯的不⾜,应⽤⼗分⼴泛。
缺点
1、汇编语⾔是⾯向机器的,处于整个计算机语⾔层次结构的底层,故被视为⼀种低级语⾔,通常是为特定的计算机或系列计算机专门设计的。不同的处理器有不同的汇编语⾔语法和编译器,编译的程序⽆法在不同的处理器上执⾏,缺乏可移植性;
2、难于从汇编语⾔代码上理解程序设计意图,可维护性差,即使是完成简单的⼯作也需要⼤量的汇编语⾔代码,很容易产⽣bug,难于调试;
3、使⽤汇编语⾔必须对某种处理器⾮常了解,⽽且只能针对特定的体系结构和处理器进⾏优化,开发效率很低,周期长且单调。
汇编语⾔与⾼级语⾔
1.汇编语⾔依赖于硬件体系(CPU),且助记符量⼤难记,于是⼈们⼜发明了更加易⽤的所谓⾼级语⾔。在这种语⾔下,其语法和结构更类似普通英⽂,且由于远离对硬件的直接操作,使得⼀般⼈经过学习之后都可以编程。⾼级语⾔通常按其基本类型、代系、实现⽅式、应⽤范围等分类。
2.汇编语⾔与cpu有关,⾼级语⾔与cpu⽆关。
⾼级语⾔有选择,循环,汇编语⾔没有。
⾼级语⾔有符号整数型,⽆符号整数型,浮点型,汇编语⾔不区分,只有16位的字,32位的双字
⾼级语⾔运算时像数学⼀样±*/, 汇编语⾔⽤的是指令,add, sub, multi
汇编语⾔可直接使⽤寄存器,⾼级语⾔不可以
3.编译器的设计,有的编译器直接将⾼级语⾔编译成机器语⾔,有的编译器直接将⾼级语⾔编译成汇编语⾔。
4.高级语言就是经过抽象的编程语言,具备良好的可读性,编写完成后通过编译程序变成成机器语言来执行,或者由解释器来负责解释执行。
同一个语句,三种语言表达形式
对于同一个语句,有以下三种:高级语言、低级语言、机器语言的表示编程
C语言:windows
a=b+1;网络
汇编语言:数据结构
mov -0xc(%ebp),%eax编辑器
add $0x1,%eax学习
mov %eax,-0x8(%ebp)spa
机器语言:操作系统
8b 45 f4翻译
83 c0 01
89 45 f8
编译器
简单讲,编译器就是将“⼀种语⾔(通常为⾼级语⾔)”翻译为“另⼀种语⾔(通常为低级语⾔)”的程序。⼀个现代编译器的主要⼯作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → ⽬标代码 (object code) → 链接器 (Linker) → 可执⾏程序(executables)⾼级计算机语⾔便于⼈编写,阅读交流,维护。
机器语⾔是计算机能直接解读、运⾏的。编译器将汇编或⾼级计算机语⾔源程序(Source program)作为输⼊,翻译成⽬标语⾔(Target language)机器代码的等价程序。源代码⼀般为⾼级语⾔ (High-level language),如Pascal、C、C++、Java、汉语编程等或汇编语⾔,⽽⽬标则是机器语⾔的⽬标代码(Object code),有时也称作**机器代码(**Machine code)。
对于C#、VB等⾼级语⾔⽽⾔,此时编译器完成的功能是把源码(SourceCode)编译成通⽤中间语⾔(MSIL/CIL)的字节码(ByteCode)。最后运⾏的时候通过通⽤语⾔运⾏库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)。
咱们都知道,机器是只能作数字计算的,可以让机器去运算的、数字的语言就是机器语言,除此以外的全部计算机语言都是非机器语言。
这样的相对于机器语言的高级语言都须要一个转换,从高级、机器不可理解,转换为机器可理解的机器语言。
这样的一个转换过程就叫作编译(Compile),由编译器(Compiler)来完成。
由C转换为汇编语言这一过程是由汇编器(Assembler)来执行的。
C和汇编语言转换为机器语言都是由编译器来完成的。
编译过程