如何设计编程语言

原文发布于 2014-11-29,我的lofter:http://kimleo.lofter.com/post/46977_3fadb3a

受vczh去年的那一系列文章影响,开始慢慢思考这个问题,如今vczh的连载已经完结了一年多了,而自己也在这段时间产生过一些想法。但是,对于这个主题该说的都让vczh给说个差不多了,我也就没必要再多做拙劣的抄袭,只是简单谈谈我的观点吧。

两周前参加了公司组织的第一次培训,其中一个buddy写了下面一段内容:

Proc -> OO -> FP -> DSL

他的解释是,目前编程语言发展的大趋势就是如此,从Procedure-Based到Object-Oriented,到Functional,到Domain-Specific,甚至是以后可能出现的更直观简介的范式,直至编程语言的终结;而同样的,人们接触和学习的过程也是如此,从最开始的过程式思考,到OO的抽象封装,到FP对于(程序/数据)结构的变换和bottom-up,再到领域建模和领域语言设计,这个过程也是循序渐进的。同时他所专门强调的一点就是编程语言会有一个终点,也即,总会有一天,编程语言不会再是进行编程活动的门槛,甚至是直接消失,而普通的人也能日常中通过非常自由的方式进行如同现今专业人员一样进行的编程活动。

其实想想这样子发展下去多么美好,虽然其可能的结果是编程人员会被迫失业转行,但当这么一项复杂的创造性活动可以足够的简化,这样子带来的生产力是足以弥补失业这个缺憾的。也许到了那个时候我们大都去研究社会科学了吧,来重新思考阿西莫夫和斯皮尔伯格所探讨过的问题。

在知乎上也很多人在构想其认为的现代的或者下一代的编程语言所应该具有的特性,有科幻的,有正经的,总是让人觉得有那么一些似曾相识。对于vczh这种喜欢实干和造轮子的人来说,给他一个好的抽象手段比给他一个AI助理要更好一些。

结合我的一些经验,我先说下面几个观点吧:

首先,一切编程语言都是面向特定领域(Domain-Specific)的(参考这条答案)。

就像C语言是Machine/Hardware-Oriented,PHP是WebPage-Oriented一样;任何标榜General-Purpose的编程语言,只是能够做到,而并非适合去做其所擅长范围之外的事情。比如很多人尝试使用动态语言编写一个OS,其实不过只是在做一个简单的OS建模,距离真正的能够稳定运行且有效的管理软硬件资源的OS来说差了不止一点;而同样的如果试图用C语言去做一个业务密集型的管理系统,还真的不是最好的选择。

这个可以算是之前我总结的编程语言第一定律的延展。同时,这解释为什么编程语言圣战总会存在。对此,我觉得一个比较理性的观点就是需求驱动,而不是妄论“好”与“坏”。而同样也根据这一点可以得到一个设计原则:不要尝试包含一切,而要做好所专的领域。

我想说的第二点就是

编程语言也要区分专家用户和普通用户。

当然这个观点并不是说对于用户要分三六九等来对待,而是作为语言设计者的角度来说,如何做好加减法,在抽象手段的多样性和表达方式的一致性之间做一个均衡,通过这种方式来让初级用户更轻松地上手和入门,或者是让经验丰富的用户能够更好地设计、构建和扩展现有的设施。

少数几个编程语言能够做到这一点,比如你可以在Ruby中看到Sinatra这种直观的DSL设计,抽象能力不用多说,另一方面直观易懂,也能方便新用户上手;一个反面的例子是坚持TIMTOWTDI的Perl,提供了更多的抽象方式和表达方式,于是对于不同的编程人员来说,实现同一个功能逻辑所写出的Perl代码可能在设计风格、实现原理上迥然不同,甚至编程人员彼此之间都无法对双方的实现进行交流,因此Perl虽然足够的方便,但是不够易用,更不用谈一致性问题了。

(待续?