Ruby 王垠:程序语言的常见设计错误 (2) - 试图容纳世界

chenge · 2013年04月25日 · 最后由 zputee 回复于 2013年05月07日 · 5560 次阅读

“今天我要说的错误倾向叫做“试图容纳世界”。这个错误导致了 Python,Ruby 和 JavaScript 等“动态语言”里面的一系列问题。”

http://www.yinwang.org/blog-cn/2013/04/18/language-design-mistake2/

他说的有道理么?

一些人眼中的问题,在另一些人看来是特性,反之亦然。

#2 楼 @Saito 哈哈,有内涵。

很多设计都是妥协性质的 设计者根据长期的软件开发经验而无奈做出的设计 是不应该被否决的

#2 楼 @Saito 你没说出他的观点问题何在,很遗憾。

6 楼 已删除

#6 楼 @Saito 不太适应这种风格。没什么意义。

#2 楼 @Saito 最后那个木头方块写的太逗了;)

角度不同,所以观点不同嘛。

List<有一个头和两只手的正常人> normalPeople;

如果能够兼容这种方式不是更好么?

程序语言的设计优点 - 完美体现了世界的无常本质

文章说了一堆,其实就在抱怨一个事情,因为程序语言设计的试图容纳世界,所以程序出错很难查找, 就我目前的经验来看,导致一个程序出错很难查找的原因不是程序语言,而是整个程序架构设计问题。

这就像生活在一个没有规则,没有制度,没有法律的世界,经常发生无法预料的事情

生活在有规则,有制度,有法律的世界,依然经常发生无法预料的事情,具体就不用我举例了吧。牵扯的东西越多,复杂度就越大,这也应该是为啥很多前辈说程序设计 (编写?) 就是控制/管理复杂度。

#11 楼 @raven 架构不都是用语言来表达么?万能的架构在哪里呢?

我觉得这就是科学家与工程师的区别。

科学家研究主义,工程师解决问题。

我自认是属于工程师阵营的,我觉得世界上没有完美的工具,每个工具都会随着时间发展而落伍。 工程师的职责就是用好现有的工具,解决现在的问题。

#12 楼 @chenge 架构是用语言来实现的,有何问题?

btw: 万能的架构要么是宇宙要么是语言。

我觉得他举的例子不对,如果要定义一个人“类”,那就应该定义好该有的基本属性,如头,手等,头可以有大小差异,但不能没有头。但他其实要处理的应该是一个“生物”类,因为长得像人“类”而他自己以为是人”类“了,他现在想给每个遇到的生物”类“都意图加上一个“带帽子”的行为,那肯定会有异常。

不敢苟同

#13 楼 @hisea 同意,不过保持开放,在闲暇时候听听不同意见是有必要的。

这个人写的中文博客太水... 还是他用英文写的东西比较有内容...

他不喜欢复杂的语法,也不喜欢动态类型系统。取向而已,自己不喜欢,就说甜的或者咸的是设计错误,挺无聊的。举的那个 putOnHat 的例子,更是不知所谓,用动态语言的各位真的遇到过类似情景?真的是动态语言无法解决的问题?不做静态类型检查,不保证类型安全的语言,有自己的做法,比如手工检查类型和属性。放着这些不用,非要试图给动态类型系统加上静态类型标注,你有锤子但它不是钉子啊敲什么敲

#17 楼 @chenge

我其实看到他拿 Java 跟动态语言对比的时候,就已经很无语了。

我不熟悉 Python, 拿 Ruby 来举例。

不知道我理解的对不对,他在抱怨类似 Ruby 的 元编程 功能。 觉得能在运行时添加与删除方法,这样会导致很难做到静态分析,从而来分析证明程序的正误。

动态的语言有动态的自省 (introspective) ,就是在运行时,自己看看自己有几个头几个手。这就是为什么 Ruby 有 respond_to? 也就是 duck typing 的概念。

据我所知,Java 废了好大劲才搞出类似功能,就是 Java 的 Reflection API.

另一方面,正是 Ruby 元编程与动态加载方法的特性,造就了 Rails.

Rails 的 ActiveRecord 在动态加载时会给 Model 添加大概 600 个方法,这个数据也不确定,因为其实添加的多少取决于 attributes 的多少。但是 Rails 并不是一个一运行就要垮掉的框架。

为什么?

这就是科学家理解不了的地方了。

用静态分析的方法分析动态语言,本身就是一个得不偿失的事情。

有时间造一个万全的静态纠错系统,不如维护一套自动测试框架。这就是动态的测试,来保证动态的代码。

换句话说,与其在纸上证明梨是甜的,为什么不尝一口是不是甜的。

java 的反射其实也是很好用的,并且像getMethods之类的方法很早就已经提供了(JDK1.1)

而且从 JDK6 开始支持动态编译

以前对王前辈充满了崇敬,现在时不时地会无法理解他。 还是做好自己吧。

#21 楼 @ywjno 我的意思就是这个,Java 都在动态化,而他在嫌弃动态语言不如 Java 静态。并称之为错误。

#23 楼 @hisea 但你不能否认类型检查的优点吧。

#24 楼 @chenge 我认为,没有缺点与优点,只有特点。

#23 楼 @hisea java 提供动态编译表示它能做到这一点但不代表它要往这个方向发展

从更高的角度说,世间万物就是这样, 美女有燕瘦环肥,恐龙也难免人家内在美。

编程语言犹如世间生物,多样性来源于进化的过程中适应不同的环境。 同一片茫茫草原,长颈鹿脖子长河马脖子短,到底脖子长是优点还是缺点。

所以

关键点

不是 - 语言试图包容世界。

而是 - 这个 世界包容了多种多样的语言。

实做一个 python 的静态语法分析器,不要求太复杂的,就知道王垠所要表达的是什么了。

#28 楼 @hooluupog 静态分析是质量工具吧。估计动态语言不太适合吧,很难分析。

@ hisea 20 楼说的很好,其实就是静态语法分析和自动测试框架的相关争论。自动测试是否万能?它带来的方便大于麻烦还是反之?像 python,ruby 这些到底需不需要静态分析工具?如果需要本身的语法设计存不存在一些问题?需不需要或能不能够得到一些类似于静态编译语言的 ide 中强大的特性?等等等等。

#30 楼 @hooluupog 如果能够静态分析当然好。只是是否可行的问题。

静态分析没接触过,不知道效果如何,能查出哪些类型的错误。

我曾经是多么的崇拜王垠,特别是他写他到 google 做实习写 python 分析器的那段,太传奇了。但不知道,为什么,看他近来的文章,我发现他有点分裂了,他应该是非常适合做研究的哪类人物,Phd 也念了那么多年,貌似还没毕业?现在的文章,观点也不尖锐了,有时候都不知道在说什么,这篇也是,貌似在吐槽其他动态语言没有类型系统,无法判别问题所在,但这个世界上本来就没有完美的东西,为什么不说点 python,javascript,ruby 这类语言的优势在那里呢?

王垠到底是谁,最近貌似很多人很迷似的,让我实在忍不住来回一帖。

在他眼里,最完美的语言应该是:一根无限长的纸条,一辆在纸条上前后滑动的小车,以及坐在小车里面写‘0’,‘1’的小人。

#33 楼 @hhuai 好像是一个从清华退学的计算机博士,然后跑美国继续读博士。现在应该毕业了

。。。。。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号