高级语言、汇编语言、机器语言

高级语言是高度封装了的编程语言,与低级语言相对。它是以人类的日常语言为基础的一种编程语言,使用一般人易于接受的文字来表示(例如汉字、不规则英文或其他外语),从而使程序编写员编写更容易,亦有较高的可读性,以方便对电脑认知较浅的人亦可以大概明白其内容。如流行的java,c,c++,C#,pascal,python,lisp,prolog,FoxPro,易语言,中文版的C语言习语言等等,这些语言的语法、命令格式都不相同。

汇编语言(assembly language)亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。汇编语言是直接面向处理器(Processor)的程序设计语言。所操作的对象不是具体的数据,而是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道,这也是为什么汇编语言的执行速度要比其它语言快,但同时这也使编程更加复杂。再者,汇编语言指令是机器指令的一种符号表示,而不同类型的CPU 有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程序与机器有着密切的关系。所以,除了同系列、不同型号CPU 之间的汇编语言程序有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU 之间的汇编语言程序是无法移植的。

机器语言(machine language)是一种指令集的体系。这种指令集,称机器码(machine code),是电脑的CPU可直接解读的数据。机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。机器语言具有灵活、直接执行和速度快等特点。不同型号的计算机其机器语言是不相通的,按着一种计算机的机器指令编制的程序,不能在另一种计算机上执行。

预处理、编译、汇编、连接

源文件

程序猿理论系列整理:高级语言、汇编语言、机器语言

预处理

程序猿理论系列整理:高级语言、汇编语言、机器语言 

编译 

程序猿理论系列整理:高级语言、汇编语言、机器语言

汇编

程序猿理论系列整理:高级语言、汇编语言、机器语言
第一阶段预处理:预处理阶段的指令一般都是以#来开头的,所以我们编写的程序中像#include、#define等等都是在这一个阶段来完成的。这一阶段会把你所有引用的头文件打开来插入到我们本身的程序中;会把我们程序中的所有宏进行替换掉;去掉注释

第二阶段编译:编译器来检查一下你的程序是不是有问题是不是有一些语法错误。

第三阶段汇编,这一阶段就是把我们第二阶段生成的汇编代码变成我们的可执行文件,也就是把我们的汇编语言变成我们的机器可以执行的机器语言,这是每个程序必须经过的阶段,因为我们的C语言也好汇编也好各种各样的语言机器都是看不懂的。

第四阶段链接:我们当前的源文件引用了另外的头文件中的函数,这时候我们执行的时候如果不把他们链接起来的话,程序是不能够正确的执行的。

静态库和动态库

这里我们涉及到了一个新的概念就是函数库的链接,我们在刚刚的程序调用了printf函数,这个函数我们自己并没有实现但是却直接调用了,我们上边也讲到了原因是引用的头文件,但是为什么我们只是简单的写了一个#incldue<stdio.h>就直接把我们的printf函数引用过来了呢?原因是这些函数已经被写入到了一个库中,在没有进行特别指定的时候gcc会到某个默认的路径下去寻找这个库,也就是链接到这个库中去把这些文件变成一个整体然后再去执行就没有问题了。

函数库一般有两种:静态库和动态库。简单来说静态库就是当我用到这个库的时候,我会直接生硬的把库中的文件添加到你的源文件中,假如我们这个库里边有一百个函数,但是我这里只用了一个printf函数,程序也会把所有的函数都插入到你的程序中,在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。

但是动态链接就不一样,动态链接并没有说把库文件的代码插入到可执行文件中,而是在程序执行的时候由链接程序来加载库,这样可以节省大量的系统开销这种库的后缀一般是.so,使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。静态链接的话代码的装载速度快,执行速度也较快,因为编译时它只会把你需要的那部分链接进去,应用程序相对比较大。但是如果多个应用程序使用的话,会被装载多次,浪费内存。

 

 

相关文章: