这里,我希望制作应用的程序员们意识到一点,那就是你们制作的不是硬件,而是利用操作系统功能的应用。虽然对程序员来说,掌握硬件的基本知识是必需的,不过,在操作系统诞生以后,就没有必要再编写直接控制硬件的程序了。这样一来,制作应用的程序员就逐渐同硬件隔离开来了。也就是说,程序员是很少关注现实世界(硬件)的。
由于操作系统诞生后,程序员无需再考虑硬件的问题,因此程序员的数量也增加了。哪怕是自称“对硬件一窍不通”的人,也可能会制作出一个有模有样的应用。不过,要想成为一个全面的程序员,有一点需要清楚的是,掌握基本的硬件知识,并借助操作系统进行抽象化,可以大大提高编程效率。否则,遇到问题时,你就无法找到解决办法。操作系统确实为程序员提供了很多方便。不过,仅仅享受方便是不行的,还要了解为什么自己能够这么方便。了解了这一点,就可以尽情地享受方便了。
下面就来看一下操作系统是如何给开发人员带来便利的。代码清单9-1表示的是,在Windows操作系统下,用C语言制作一个具有表示当前时间功能的应用。time()是用来取得当前日期和时间的函数,printf()是用来在显示器上显示字符串的函数。程序的运行结果如图9-4所示。
图9-4 代码清单9-1的运行结果
代码清单9-1 表示当前时间的应用
voidmain() { //保存当前日期和时间信息的变量time_ttm; //取得当前的日期和时间time(&tm); //在显示器上显示日期和时间printf("%s\n", ctime(&tm)); }
运行代码清单9-1的应用时,硬件的受控过程如下所示。
(1)通过time_t tm; ,为time_t类型的变量申请分配内存空间。
(2)通过time(&tm); ,将当前的日期和时间数据保存到变量的内存空间中。
(3)通过printf("%s\n", ctime(&tm)); ,把变量内存空间的内容输出到显示器上。
应用的可执行文件指的是,计算机的CPU可以直接解释并运行的本地代码。不过这些代码是无法直接控制计算机中配置的时钟IC及显示器用的I/O等硬件的。那么,为什么代码清单9-1的应用能够控制硬件呢?
在操作系统这个运行环境下,应用并不是直接控制硬件,而是通过操作系统来间接控制硬件的。变量定义中涉及的内存的申请分配,以及time()和printf()这些函数的运行结果,都不是面向硬件而是面向操作系统的。操作系统收到应用发出的指令后,首先会对该指令进行解释,然后会对时钟IC(实时时钟)和显示器用的I/O进行控制。
图9-5 应用程序经过OS间接地控制硬件