2.2 抽象
自从25年前开始编程(www.cppentry.com)以来,我一直痴迷于那些能扩展程序员能力的工具。这些工具可以是编程(www.cppentry.com)语言、操作系统,甚至可以是关于某个问题的独特思维方式。我知道有一天我将能够轻松解决问题,这些问题是我在刚开始编程(www.cppentry.com)时想都不敢想的——我也知道,我不是独自前行。
我最钟情的工具有一个共性,那就是抽象的概念。当我在处理大问题的时候,这样的工具总是能帮助我将问题分解成独立的子问题,并能确保它们相互独立。也就是说,当我处理问题的某个部分的时候,完全不必担心其他部分。
例如,假设我正在用汇编语言写一个程序,我必须时常考虑机器的状态。我可以支配的工具是寄存器、内存,以及运行于这些寄存器、内存上的指令。要用汇编语言做成任何一件有用的事情,就必须把我的问题用这些特定概念表达出来。
即使是汇编语言也包含了一些有用的抽象。首先是编写的程序在机器执行之前先被解释了。这就是用汇编语言写程序和直接在机器上写程序的区别。更难以察觉的是,对于机器设计者来说,“内存”和“寄存器”的概念本身就是一种抽象。如果抛开抽象不用,则程序的运行就要表示成处理器内无数个门电路的状态变换。如果你的想象力够丰富的话,就可以看到除此之外还有更多层次的抽象。
高级语言提供了更复杂的抽象。甚至用表达式替代一连串单独的算术指令的想法,也是非常重大的。这种想法在20世纪50年代首次被提出时显得很不同凡响,以至于后来成了FORTRAN命名的基础:Formula Translation。抽象如此有用,因此程序员们不断发明新的抽象,并且运用到他们的程序中。结果几乎所有重要的程序都给用户提供了一套抽象。
2.2.1 有些抽象不是语言的一部分
考虑一下文件的概念。事实上每种操作系统都以某种方式使文件能为用户所用。每个程序员都知道文件是什么。但是,在大多数情况下,文件根本不是物理存在的!文件只是组织长期存储的数据的一种方式,并由程序和数据结构的集合提供支持来实现这个抽象。
要使用文件做任何一件有意义的事情,程序员必须知道程序是通过什么访问文件的,以及需要什么样的请求队列。对于典型的操作系统来说,必须确保提出不合理请求的程序得到相应的错误提示,而不能造成系统本身崩溃或者文件系统破坏。实际上,现代的操作系统已经就一个目的达成了共识,就是要在文件之间构筑“防火墙”,以便增加程序在无意中修改数据的难度。