第二章 计算机编程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二章 计算机编程相关的知识,希望对你有一定的参考价值。
2.1 编程语言
从本质上来说,CPU只能运行二进制格式的指令,也就是CPU内指令集限定的二进制指令。
如果让程序员通过二进制进行编程,那就太困难了,很少有人能够通过二进制进行编程。但是人类又需要很多人能够进行编程,所以必须让编程代码能够接近人类所能理解的思维方式才行。所以编程语言有所谓高级语言和低级语言之分。
一种编程语言离机器越近我们就说它越低级,离人越近我们就说它越高级。高级并不是说功能强,也不是指性能强大,而是指它越接近于人类的自然语言。
高级语言人类容易看懂了,但是计算机看不懂,所以要想使用高级语言写的程序能够在CPU中执行,必须先将其转换成CPU所能够理解的二进制指令。
如图所示,从机器到人之间通常有三层,分别为机器语言-->汇编语言(微码语言)-->高级语言。
2.1.1 高级语言编写的程序的执行过程
用高级语言编写的程序要想执行通常有2个过程:
a) 把高级语言转换成汇编语言(转换成对应的CPU芯片所支持的汇编语言)
b) 把汇编语言转换成对机器指令的调用
如果是C语言,第一步我们称之为编译的过程。
从高级语言转换成汇编语言的过程取决于底层的CPU芯片是什么格式的。不同厂商所生产的不同型号的CPU是不一样的。
2.2 通用软件
2.2.1 通过软件的背景
上面已经说过,不同厂商生产的CPU,其内含的指令集是不一样的。同样,一个程序在512M内存中运行和在4G内存中运行,其所能够使用的内存资源也是不一样的。因此写程序时必须要告诉程序有多少内存资源可以用,任何一个程序员写任何一个程序都要考虑底层的机器是谁,是什么厂商的芯片,运行的速度如何,拥有多少资源等等。写一个程序是512M内存的,就只能在512M内存的机器上运行,稍微换一个就不行了。这是非常麻烦的,因此,我们要达到灵活使用的目的,就必须将这些底层的差异给消除。那么如何消除这些底层的差异呢?
比如我们要去很多个国家旅游,每个国家的语言都不一样,若想独自旅行就要学多种语言,若我们不会这些国家的语言就可以找个懂这些国家语言的翻译随行。
同理,为了避免程序员写程序时要应付各种机器的不同情况,就找了一个翻译,它本身能够应付各种底层的不同情况,但是向上输出的接口是统一的。这就是通用软件。
通用软件是一种将底层计算机所提供的各种计算能力给抽象为一种统一接口的程序。无论底层是AMD的CPU还是Intel的CPU,都可以统一成一种提供计算能力的接口。无论内存是多少G的,统一规定32位系统最多支持4G内存,64位系统最多支持4G个4G的内存。
有了通用软件(操作系统)以后,程序员写程序就不用考虑底层的实现了,只需要针对操作系统的接口进行编程。如此一来就大大的简化了编程的过程,效率自然提高了。
2.2.2 OS(Operation System)
OS是一种通用软件程序。
在上一章我们说过,任何情况下,一个普通程序要想完成一个特权操作,是没办法直接进行的,它必须向内核申请。
当系统运行起来以后,操作系统随时监控在特权指令上,一旦发现有要执行特权指令的程序,只能向操作系统发请求,由操作系统代理完成特权操作。所以操作系统必须能够随时接收程序发来的请求。那么操作系统允许接收哪些请求呢?以下这些就是操作系统完成的工作:
a) 硬件驱动
b) 进程管理
c) 内存管理
d) 网络管理
e) 安全管理
每一个被操作系统所允许接收的请求,都称之为系统调用(System Call)。
2.3 编程层次
硬件规格(hardware specifiacation):面向硬件编程
系统调用(system call):面向操作系统编程
库调用(library call):把非常多的底层功能整合出来,提供成离最终目标更近的功能
程序员写程序要么面向硬件规格,要么面向操作系统。而操作系统又过于底层,于是就有人把操作系统向上又抽象出来一层,也就是上面所说的库调用。此时程序员编程的过程就简化多了。
下图是编程层次的一个架构图:
2.3.1 ABI与API
众所周知,windows下的应用程序拿到Linux下是无法运行的。
一个应用程序一旦制作成了二进制格式,其适用的操作系统平台也就定下来了。编译成了exe格式的就只能在windows下运行,编译成了tar.gz格式的就只能在类Unix的系统下运行。这是由应用二进制接口规定的,也就是ABI(Application Binary Interface)
ABI是一种操作系统接口格式,是一种规范,定义了系统平台所属。
面向不同操作系统的应用程序,编译成二进制格式以后在不同平台是无法兼容的。但是在没有编译的情况下,如果应用程序的源代码是针对不同平台的相同接口进行编写的,那么该源程序就可以跨平台编译。也就是说源程序可以在windows下编译,也可以在类Unix系统下编译,编译后的二进制程序格式是不一样的。
这里说的不同平台的相同接口,这个接口是指应用编程接口API(Application Programming Interface)。
API是一种应用编程接口,程序员一般都是针对API进行编程。
windows和linux的应用程序格式不一样,但是编程接口API却可能是可以兼容的。这也就意味着,程序员在windows系统下以兼容模式写的程序源代码在linux下是兼容的。虽然源代码是兼容的,但是一旦编译成了二进制格式,若是在linux下编译的就只能在linux下运行,若是在windows下编译的就只能在windows下运行。
面向库的编程时,程序员写应用程序源代码是面向API进行的,一旦编译成二进制格式了,就是面向ABI了。
2.3.2 UI(User Interface)
GUI(Graphic User Interface):图形用户接口,如windows桌面
CLI(Command Line Interface):命令行接口,如Unix/Linux下的命令行终端
本文出自 “忘情居” 博客,请务必保留此出处http://itchentao.blog.51cto.com/5168625/1902303
以上是关于第二章 计算机编程的主要内容,如果未能解决你的问题,请参考以下文章