条款1:视C++为一个语言联邦
在这个特条款下,我理解了C++的全貌,它到底是一个什么样的编程语言,进而窥探到语言的编程范式。(均为自己翻阅资料后的理解,可能会有错误)
书中直接指出C++是一个多范式的编程语言,那么计算机语言有哪些编程范式呢?在维基百科中给出的定义是:基于语言特性来给语言分类的一种方式。在计算机编程语言中,根据计算模型的不同,编程范式分为两大类:命令式( imperative programming)和声明式(declarative programming)
命令式范式
命令式编程是面向计算机硬件的抽象,有变量(对应着存储单元),赋值语句(获取,存储指令),表达式(内存引用和算术运算)和控制语句(跳转指令),一句话,命令式程序就是一个冯诺依曼机的指令序列。知乎
由此看以看出,我自己接触过的语言其实都是命令式,例如:C、C++、C#、Java、JS。我们平时所说的面向过程(Procedural)和面向对象(Object Oriental),也属于这个范式,站在编译器的角度,其实面向对象是包含面向过程的(我认为,在这个角度procedural和imperative似乎是同一个层次的概念),站在程序员的角度,二者在编程抽象上是风格迥异。在书中提到的泛型编程(generic)和元编程(metaprogramming),自然也属于这范式。泛型编程就是减少代码对输入变量的依赖,这就是我们课本中提到的C++模板的作用,模板可以根据不同的类型特化生成不同的代码。元编程是根据代码生成代码,这是课本没有介绍的C++模板另一个高级用途(在我目前的编程场景中,似乎不用这种方法也都能实现想要的结果,可能一般程序员很少用到这种方法)。泛型和元编程这种范式,在C++中可以统一为模板编程,因为C++的模板可以同时实现这两种编程。
声明式范式
Declarative programming is often defined as any style of programming that is not imperative.
- A program that describes what computation should be performed and not how to compute it
- Any programming language that lacks side effects (or more specifically, is referentially transparent)
- A language with a clear correspondence to mathematical logic
以上定义来自维基百科。可以看出他是命令式编程的对立面,它的特点是只描述我需要什么,而不关心具体怎么去实现,并且他没有命令式编程中的副作用(side effects),就是一个函数或者表达式不管是什么时候调用,调用顺序如何都不影响他的执行结果,还有就是这种范式中的变量,是数学意义上的,例如i = i+1,这样的表达式错误的,所以他的变量是不可改变的(immutable),Python中也有类似的概念,这样的特性他的好处在于让并发计算的实现变得容易,多线程之间就不需要互斥变量这些手段去同步。
函数式编程(functional)和逻辑编程(logic)属于这种范式,Haskell和Prolog分别属于这两种范式的语言。函数式编程,这里函数同样是数学上的函数而不是C/C++中所说的函数。可以看出来,声明式范式相对命令式是一种面向数学的抽象,应该是一种更加高层次的抽象,更符合人类的理解。从声明式范式的理念来看,这应该是一种未来的编程方式,当智能化水平不断地提高,编程将会更加简单,亦或许人类都不需要参与编程。
书中给出C++中的编程范式有:过程、面向对象、函数式、元编程、泛型编程。对应到上面就是C++既是命令式范式也是声明式范式编程语言。所以从这里也看以看出来为什么C++相较于其他语言更加难学习,因为他实在是太“杂”了,Java和C#的设计都是偏向于面向对象特性,而C++并没有要强化某些范式而弱化其他范式,所以他是全能型选手,但是在特定的领域内又打不过其他选手,所以现在处境略微尴尬。
书中将C++的多种编程范式归类成四个子语言:C,Object-Oriental C++,Template C++、STL。