《黑客与画家》读后感之二: 百年后的编程语言

接前一篇 《黑客与画家》读后感之一

3.  百年后的编程语言

Paul是一个LISP的启蒙家,他认为100年后编程语言进化的主线,应该以少量公理为基础的”最小最简洁核心的语言“。 现有的编程语言中,最具这一特征的莫过于他最喜欢的Lisp了,所以他的主张实际上就是说,Lisp才是100年后编程语言的进化方向。

任何一种编程语言都可以分成两大组成部分:基本运算符的集合(扮演公理的角色)以及除运算符以外的其他部分(原则上,这个部分可以用基本运算符表达出来)。

 我认为,基本运算符是一种语言能否长期存在的最重要因素。其他因素都不是决定性的。这有点像买房子的时候你应该先考虑地理位置。别的地方将来出问题都有办法弥补,但是地理位置是没法变的。
 慎重选择公理还不够,还必须控制它的规模。数学家总是觉得公理越少越好,我觉得他们说到了点子上。
你仔细审视一种语言的内核,考虑哪些部分可以被摒弃,这至少也是一种很有用的训练。在长期的职业生涯中,我发现冗余的代码会导致更多冗余的代码,不仅软件如此,而且像我这样性格懒散的人,我发现在床底下和房间的角落里这个命题也成立,一件垃圾会产生更多的垃圾。
我的判断是,那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。“

回顾一下我们中学学习的欧式几何, 就是先定义一些点,线,面这些基本概念,然后再定义5条公理, 就构成整个欧式几何的内核,这个内核确实够小的, 但是其他的定理和几何命题都可以由此推导出来, 反应出这个内核非常强大而生命力旺盛。

 

LISP是一种特殊的编程语言,因为它原本不是作为编程语言,而是作为一种数学计算模型来设计的,麦卡锡设计了一种以Lambda 演算为基础的“图灵完全”的计算模型,并没有当做计算机语言来使用,知道他的一个研究生在IBM 的机器上实现了描述计算模型的万能函数eval(求值函数), LISP才作为一种编程语言正式诞生。

 

Paul 推崇LISP有一个非常重要的原因,就是LISP强大的元编程能力, LISP自身扮演了公理的角色, 程序员可以在其上定义,推导出其他定理和命题。 这就意味着当你用LISP编程的时候,可以先针对一个问题域用LISP定义一个Domain Specific Language (DSL)  , 然后用这个DSL 进行编程, 效率当然就非常非常的高了。 了解Ruby on Rail 的同学就明白这一点, RoR 在Web编程领域非常成功, 一个重要的原因就是它其实是面向Web 编程的DSL 。 

再举个例子来说明LISP在元编程领域的强大, Common Lisp 第一版中没有包含面向对象的功能, 但是在第二版中默认包含了一个叫做Common Lisp Object system 的东东, 这个面向对象的功能实现,是通过LISP的宏等手段,仅有LISP自身完成的,在语言自身和编译器没有进行增强的情况下,就可以定义出面向对象的功能, LISP元编程能力强大的令人发指。 

这也从侧面反映了Paul 所说的最小,最简洁语言的强大能力。

联想到《Unix编程艺术》中反复提到的K.I.S.S 原则,和最小,最简洁语言有异曲同工之妙。

 

Ruby 的作者松本宏行也对百年后的编程语言做了预测, 他的观点是未来的编程语言会具备更高的抽象度,程序员编程时主要描述What , 而不关心How 这种具体的实现, 这点我非常赞同, 人类的大脑能同时容纳概念数是有限的,就是7加减2 , 超过这个范围, 必须像电脑那样做内存,硬盘置换, 所以程序员很难同时处理太多的细节,否则非常容易出错。

程序语言的抽象度确实非常重要, 它能把程序员从思维的细节谜团中解放出来, 专注到问题的本身。 要不然, 程序员只好充当抽象的角色,用各种各样的设计模式,封装,分层等武器来战斗,非常辛苦。

《黑客与画家》读后感之二: 百年后的编程语言

上一篇:C++常见用法规范整理


下一篇:C++变成规范之41:将数据成员设为私有的,无行为的聚类(C语言形式的struct除外)