C到C++语言进化史
C++语言的顺利推广显然要很感谢C语言已有的庞大用户群,但是在C++的语言风格中也深深的烙上了C语言的印记,这就是许多人为什么喜欢使用C++语言的理由吧。
程序代码也有风格,这算不得什么新鲜事。早在20世纪80年代, C语言程序员就必须在K&R风格和ANSI风格之间择善而从。但平心而论。我确实没有见过哪一种语言能像C++这样,在代码风格方面表现得如此诡谲和难以捉摸:谁也说不清C++代码究竟能衍生出多少种迥异的风格。
但我知道,有许多C++初学者在面对不同风格的C++代码时,经常会误以为自己看到的是好几种完全不同的编程语言――仅此一点就足以提醒我们,研究和廓清C++语言风格的演化和发展规律已是当务之急了。
和文体学家们研究历朝历代文体变迁的工作相仿,研究C++语言风格的流变史也没有什么捷径可走。我们只能依据刘勰在《文心雕龙》中提倡的“原始以表末”[1]的研究方法,循着历史的脉络,推求代码风格的来源,探寻风格演化的内因,并借以阐明技术发展的趋势和规律。
1. 带类的C――对C语言风格的因袭
在1983年12月Bjarne Stroustrup采纳Rick Mascitti的建议,将其发明的新语言命名为“C++”之前,人们一直用“带类的C(C with Classes)”来称呼这种脱胎于C语言的,带有数据抽象机制的“方言”。虽然带类的C在本质上仅仅是一种可以被预处理程序Cpre转换为传统C语言代码(这类似于我们在Oracle中见到的Pro*C语言的预处理过程)的扩展性语言,但它的确在风格上奠定了后来所有C++代码的基础。
class stack { char s[SIZE]; char* min; char* top; char* max; void new(); public: void push(char); char pop(); };
这段“带类的C”代码录自Stroustrup所著的《C++语言的设计和演化》。代码中的new()其实是类stack的构造函数,这与后来的C++语言有很大的不同。显而易见,带类的C在风格上几乎完整地承袭了C语言的衣钵。代码中的声明语句看上去与C语言一模一样,class的结构也与C语言中struct的结构大致相仿。
这些迹象反映出C++语言来源于C又尽量与C保持兼容的设计思想――这种设计思想既为C++的迅速普及提供了便利(C++语言的顺利推广显然得益于C语言已有的庞大用户群)。