八、一些杂散但值得讨论的问题
8.1.1 像人类社会一样的计算机软件系统(有些人只埋头干活,有些人只做管理)
(1)人类社会最开始时人人都干活,这时候没有专业分工,所有人都直接做产生价值的工作。当时是合适的,因为当时生产力低下,人口稀少。这就像裸机程序一样(裸机程序的特点是:代码量小,功能简单、所有代码都和直接目的有关,没有服务性代码)。
(2)后来人口增加生产力提高,有一部分人脱离了直接产生价值的体力劳动专职指挥(诞生了阶级)。本质上来说是合理的,因为资源得到了更大限度的使用,优化了配置,提升了整体效率。程序也是一样,当计算机技术发展,计算机性能和资源大量增加,这时候写代码也要产生阶级也要进行分工,不然如果所有代码都去参加直接性的工作,则整体系统效率不高。(因为代码很难进行资源的优化配置)。
(3)解决方案就是操作系统。操作系统就是分出来的管理阶级,操作系统的代码本身并不直接产生价值,它的主要任务是管理所有资源,它主要为直接产生价值、直接劳动的那行程序(各种应用程序)提供服务。所有操作系统既是管理者也是服务者。
(4)裸机程序就好像小公司,操作系统下的程序就好像大型跨国公司:裸机程序就好像小国家,操作系统下程序就好像大国家;如果我们要做一个产品,软件系统到底应该是裸机还是基于操作系统呢?本质上取决于产品本身的复杂度。只有极简单的功能、使用极简单的CPU(譬如单片机)的产品才会选择用裸机开发;一般的复杂性产品都会基于操作系统来开发。
8.1.2 操作系统的调用通道:API函数
(1)操作系统负责管理和资源调配,应用程序负责具体的直接劳动,它们之间的接口就是API函数。当应用程序需要使用系统资源(譬如内存、譬如CPU、譬如硬件操作)时就通过API向操作系统发出申请,然后操作系统响应申请帮助应用程序执行功能。
8.1.3 C库函数和API的关系
(1)单纯的API只是提供了极简单没有任何封装的服务函数,这些函数应用程序是可用的,但是不太好用。应用程序为了好用,就对这个API进行了二次封装,把它变得好用一些,于是就成了C库函数。
(2)有时完成一个功能,有相应的库函数可以完成,也有API可以完成,用哪个都行。譬如读写文件,API的接口是open write read close;库函数的接口是fopen fwrite fread fclose.fopen本质上是使用open实现的,只是进行了封装。封装肯定有目的(添加缓冲机制)。
8.1.4 不同平台(windows、Linux、裸机)下库函数的差异
(1)不同操作系统API是不同的,但是都能完成所有的任务,只是完成一个任务所调用的API不同。
(2)库函数在不同操作系统下也不同,但是相似性要更高一些,这是人为的,因为人下意识想要屏蔽不同操作系统的差异,因此在封装API成库函数的时候,尽量使用了同一套接口,所以封装出来的库函数挺像的。但是还是有差异,所以在一个操作系统上写的应用程序不可能直接在另一个操作系统上面编译运行。于是乎就有个可移植性出来了。
(3)跨操作系统可移植平台,譬如QT,譬如JAVA语言。
8.1.5 操作系统的重大意义:软件体系分工
(1)有了操作系统后,我们做一个产品可以首先分成2部分:一部分人负责做操作系统(开发驱动的);一部分人负责用操作系统实现具体功能(开发应用)。实际上上层应用层的功能进一步复杂化后又分了好多层。