程序员的自我修养这本书让我再次意识到,C语言只是一门语言课,数据结构用来语言描述了实际结构,但这两点远远不是所谓的编程。从“Hello world”说起,我们实现了输出但却常常忽略了一些重要的问题:程序是怎么组织的?编译器对程序做了什么?
最近我们尝试了结对编程和个人开发,结合此书前一部分内容谈谈自己觉得几个非常重要的要素:
- 接口(interface)。计算机系统软件体系结构采用一种层的结构,有人说过一句名言:“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”,所以各层之间的接口很重要。即使对于我们的小软件,计算核心(Core)与用户界面(UI)之间的沟通也十分关键。我们将Core编译后链接为动态或静态链接库,作为运行库提供应用程序接口(API)。
2.CPU资源昂贵。利用监控程序实现的多道程序(Multiprogramming)、利用协作模式的分时系统大大提高了CPU的利用率。我在进行大量文件字符和单词遍历时,程序长时间(几十s甚至minute)占据着CPU,但此时需要进行其他操作,就得益于如今熟悉的多任务(Multi-tasking)系统:操作系统接管了所有的硬件资源,并且本身运行在一个受硬件保护的级别。所有的应用程序都以进程(Process)的方式运行在比操作系统权限更低的级别,每个进程都有自己独立的地址空间,使得进程之间的地址空间相互隔离。
3. 内存不足的处理。地址空间不隔离、内存运行效率低、程序运行地址不确定的问题,都依靠之前所提到的“中间层”的方法解决,中间层把程序给出的“虚拟地址”(Virtual Address)映射为实际的物理地址,通过妥善管理这一层就能很好的分配内存。我在处理文件时hash表的结构过于庞大耗费了大量内存,内存不足时就会由于多任务系统导致程序终止,以免影响其他程序的运行,所以我在程序内部设计中间循环及时释放掉不用的空间来解决这个问题。