Let's 规范编码- -| 回首页 | 2005年索引 | - -slab的“对象重用”

库设计就是语言设计,语言设计就是库设计- -

                                      

第一次知道这句话是从两位来自于Bell Lab的C++大师Andrew Koening和Barbara Moo的经典著作《Rumination On C++》(中文名《C++沉思录》)看到的。说句实在话,当时并没有什么特别的感觉和思考。倒是后来我的一位同事多次向我提起这句话,一副引经据典的样子,象一把小锤,把这个钉子不轻不重的契在我记忆里。


直到最近,我尝试进行编程语言设计的时候,我才发现这两句话是多么的真知灼见。无耻一点的说,即使两位大师没有说过这句话,我也会得出同样的结论,只不过,可能不会这么言简意赅,字字烁金。

这句话从字面上看,是自反关系的两个子句。在逻辑学中,A is B, and B is A能够推导出A=B。但这两个子句却分别包含着各自的意义。

1)库设计就是语言设计

我们使用既有的语言,比如C/C++,去实现一些库,这些库可以增强,甚至改变我们原来编程的方式,从效果上就象实现了新的语言。

在C++中,设计者可以实现一些通用类,这些类可以象C++的内建类型一样使用。按照Andrew和Barbara举的例子,如果设计者设计了一个功能强大的string类,使用这套库的用户,就好像得到了一个比C++更加强大的语言。还有,比如,我们可以通过库把等号(=)重载为将等号左边的表达式赋值给右边的表达式,使用这套库的用户就得到了一个与C++不同的语言。

对于我正在设计的语言而言(不妨暂时称其为D语言),由于我将这种语言的目标代码定为C++ code。所以我每打算在语言中增加一个特性,我都要考虑这个特性所针对的C++实现是什么,很多特性对应的都是C++库。比如,在D语言中,对所有class的访问都是通过引用,然后利用引用计数实现Garbage Collection。所以,我用C++设计了一个带有引用计数的基类Object,而所有的D语言class在编译为C++代码后,都是直接或间接的继承自Object,而D语言中所有对class的引用,编译后,这些引用都变为一个C++模板类的具化类。

也就是说,D语言的背后,其实是一套C++的库。而使用D语言编译后的代码,就是一组使用这套C++库的C++代码。

甚至,我最近一直在犹豫,究竟是直接使用C++语言,通过使用这套库来编程,还是真正实现一套全新的语法,最终编译为相同的结果。不同的是,对于后者,程序员可以使用新语法写更少的代码,通过语法与编译器对程序员进行约束以保证程序员能够不超越限定的范围,但代价是需要花时间去写一个针对这种语法的编译器。从效果和最终结果上,二者是一致的。

2)语言设计就是库设计

这点比较容易理解,这句话强调的是,在设计语言时,应该充分考虑库设计方便性的需要。库设计的需求是语言设计的主要驱动力之一。

比如C++语言提供封装机制,可以让库的设计者对库的调用者隐藏其不需要看到的细节,以防止调用者对库进行错误的访问。而构造、析构、异常、操作符重载等等机制也同样极大的方便的库的设计。

- 作者: 上帝没发笑 访问统计: 2005年01月31日, 星期一 04:17 加入博采

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=650118

回复

- 评论人:D语言   2005-07-30 01:00:45 

D语言
HTTP://www.digitalmars.com/d

评论内容: