“今天我要说的错误倾向叫做“试图容纳世界”。这个错误导致了 Python,Ruby 和 JavaScript 等“动态语言”里面的一系列问题。”
http://www.yinwang.org/blog-cn/2013/04/18/language-design-mistake2/
他说的有道理么?
王二麻子村里举办了一个木工大赛,时间截止后,王二麻子一一点评了大家的木工活。
李四:你这个桌子是圆角的,不够现代. 赵三:你这个凳子不是人体工学,坐久了会伤身. 钱五:你这把茶几不够宽,摆不了几个杯具。
一轮评毕,大家恍然发现没有 麻子 自己的木工。这时麻子不紧不慢的从兜里掏出一个木头方块。
说:大家来看这个木头方块,每个面都是一样大的,每个角都是直角。多个在一起还能组合。多么完美的结构。
众人点头称是。于是麻子就夺了冠...
程序语言的设计优点 - 完美体现了世界的无常本质
文章说了一堆,其实就在抱怨一个事情,因为程序语言设计的试图容纳世界,所以程序出错很难查找
, 就我目前的经验来看,导致一个程序出错很难查找的原因不是程序语言,而是整个程序架构设计问题。
这就像生活在一个没有规则,没有制度,没有法律的世界,经常发生无法预料的事情
生活在有规则,有制度,有法律的世界,依然经常发生无法预料的事情,具体就不用我举例了吧。牵扯的东西越多,复杂度就越大,这也应该是为啥很多前辈说程序设计 (编写?) 就是控制/管理复杂度。
我觉得这就是科学家与工程师的区别。
科学家研究主义,工程师解决问题。
我自认是属于工程师阵营的,我觉得世界上没有完美的工具,每个工具都会随着时间发展而落伍。 工程师的职责就是用好现有的工具,解决现在的问题。
我觉得他举的例子不对,如果要定义一个人“类”,那就应该定义好该有的基本属性,如头,手等,头可以有大小差异,但不能没有头。但他其实要处理的应该是一个“生物”类,因为长得像人“类”而他自己以为是人”类“了,他现在想给每个遇到的生物”类“都意图加上一个“带帽子”的行为,那肯定会有异常。
他不喜欢复杂的语法,也不喜欢动态类型系统。取向而已,自己不喜欢,就说甜的或者咸的是设计错误,挺无聊的。举的那个 putOnHat 的例子,更是不知所谓,用动态语言的各位真的遇到过类似情景?真的是动态语言无法解决的问题?不做静态类型检查,不保证类型安全的语言,有自己的做法,比如手工检查类型和属性。放着这些不用,非要试图给动态类型系统加上静态类型标注,你有锤子但它不是钉子啊敲什么敲
我其实看到他拿 Java 跟动态语言对比的时候,就已经很无语了。
我不熟悉 Python, 拿 Ruby 来举例。
不知道我理解的对不对,他在抱怨类似 Ruby 的 元编程 功能。 觉得能在运行时添加与删除方法,这样会导致很难做到静态分析,从而来分析证明程序的正误。
动态的语言有动态的自省 (introspective) ,就是在运行时,自己看看自己有几个头几个手。这就是为什么 Ruby 有 respond_to? 也就是 duck typing 的概念。
据我所知,Java 废了好大劲才搞出类似功能,就是 Java 的 Reflection API.
另一方面,正是 Ruby 元编程与动态加载方法的特性,造就了 Rails.
Rails 的 ActiveRecord 在动态加载时会给 Model 添加大概 600 个方法,这个数据也不确定,因为其实添加的多少取决于 attributes 的多少。但是 Rails 并不是一个一运行就要垮掉的框架。
为什么?
这就是科学家理解不了的地方了。
用静态分析的方法分析动态语言,本身就是一个得不偿失的事情。
有时间造一个万全的静态纠错系统,不如维护一套自动测试框架。这就是动态的测试,来保证动态的代码。
换句话说,与其在纸上证明梨是甜的,为什么不尝一口是不是甜的。
从更高的角度说,世间万物就是这样, 美女有燕瘦环肥,恐龙也难免人家内在美。
编程语言犹如世间生物,多样性来源于进化的过程中适应不同的环境。 同一片茫茫草原,长颈鹿脖子长河马脖子短,到底脖子长是优点还是缺点。
所以
关键点
不是 - 语言试图包容世界。
而是 - 这个 世界包容了多种多样的语言。
@ hisea 20 楼说的很好,其实就是静态语法分析和自动测试框架的相关争论。自动测试是否万能?它带来的方便大于麻烦还是反之?像 python,ruby 这些到底需不需要静态分析工具?如果需要本身的语法设计存不存在一些问题?需不需要或能不能够得到一些类似于静态编译语言的 ide 中强大的特性?等等等等。
我曾经是多么的崇拜王垠,特别是他写他到 google 做实习写 python 分析器的那段,太传奇了。但不知道,为什么,看他近来的文章,我发现他有点分裂了,他应该是非常适合做研究的哪类人物,Phd 也念了那么多年,貌似还没毕业?现在的文章,观点也不尖锐了,有时候都不知道在说什么,这篇也是,貌似在吐槽其他动态语言没有类型系统,无法判别问题所在,但这个世界上本来就没有完美的东西,为什么不说点 python,javascript,ruby 这类语言的优势在那里呢?