使用和研究过这么多程序语言之后,我觉得几乎不包含多余功能的语言,只有一个:Smalltalk。所以我觉得它是学习程序设计最好的入手点和进阶工具。当然 Smalltalk也有少数的问题,而且缺少一些我想要的功能,但这些都瑕不掩瑜。在用了很多其它的语言之后,我觉得 Smalltalk真的是非常优美的语言。
要想指出 Smalltalk所有的优点,并且跟其它语言比较,恐怕要写一本书才讲的清楚。所以在这篇文章里,我只提其中一个最简单,却又几乎被所有人忽视的方面:语法。
其它的 面向对象语言也有跟 Smalltalk类似的语法(都是基于“面向对象”),所以在这篇(仅限这篇)文章里我所指出的“Smalltalk 的优点”,其实也可以作用于其它的 面向对象语言。从现在开始,“Smalltalk”和“面向对象系统”这两个词基本上含义相同。
我觉得 Smalltalk(面向对象系统) 的基于“消息”的语法,是世界上最完美的设计。其实我希望它能更简单一点,但是在现存的语言中,我没有找到第二种能与它比美。也许在读过这篇文章之后,你会发现这种语法设计的合理性,已经接近理论允许的最大值。
为什么我喜欢这样一个“全是对象,消息”的语言呢?这是出于对语言结构本质的考虑。其实,我觉得语法是完全不应该存在的东西。即使存在,也应该非常的简单。因为语法其实只是对语言的本质结构,“抽象语法树”(abstract syntax tree,AST),的一种编码。一个良好的编码,应该极度简单,不引起歧义,而且应该容易解码。在程序语言里,这个“解码”的过程叫做“语法分析”(parse)。
为什么我们却又需要语法呢?因为受到现有工具(操作系统,文本编辑器)的限制,到目前为止,几乎所有语言的程序都是用字符串的形式存放在文件里的。为了让字符串能够表示“树”这种结构,人们才给程序语言设计了“语法”这种东西。但是人们喜欢耍小聪明,在有了基本的语法之后,他们开始在这上面大做文章,使得简单的问题变得复杂。
Lisp(Smalltalk 的前身)是世界上第二老的程序语言。最老的是 Fortran。Fortran 的程序,最早的时候都是用打孔机打在卡片上的,所以它其实是几乎没有语法可言的。
显然,这样写程序很痛苦。但是它却比现代的很多语言有一个优点:它没有歧义,没有复杂的 parse 过程。
在 Lisp 诞生的时候,它的设计者们一下子没能想出一种好的语法,所以他们决定干脆先用括号把这语法树的结构全都括起来,一个不漏。等想到更好的语法再换。
仔细想一下,如果要表达一颗“树”,最简单的编码方式是什么?就是用括号把每个节点的“数据”和“子节点”都括起来放在一起。Lisp 的设计者们就是这样想的。他们把这种完全用括号括起来的表达式,叫做“S表达式”(S 代表 “symbolic”)。这貌似很“粗糙”的设计,甚至根本谈不上“设计”。奇怪的是,在用过一段时间之后,他们发现自己已经爱上了这个东西,再也不想设计更加复杂的语法。于是S表达式就沿用至今。
在使用过 Smalltalk,Scheme,Haskell,ML,和常见的 Java,C,C++,Python,Perl,…… 之后,我也惊讶的发现, Smalltalk 的语法,不但是最简单,而且是最好看的一个。这不是我情人眼里出西施,而是有一定理论依据的。
首先,把所有的结构都用对象表示起来,轻松地避免了别的语言里面可能发生的“歧义”。程序员不再需要记忆任何“运算符优先级”。
其次,把“对象”全都放在表达式的最前面,使得基本算术操作和函数调用,在语法上发生完美的统一,而且使得程序员可以使用几乎任何符号作为函数名。
谈语法
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 附录3 编程简史 1940之前 1801,Joseph Marie Jacquard用打孔卡为一台织布机编写指令,...