网络寻租

Programmer, Gamer, Hacker

Ruby需要一个静态类型验证系统

| Comments

越用Ruby,越觉得Ruby简陋。很多其它现代语言有的特性,Ruby都没有。其中一个就是静态类型验证系统。

Ruby语言里面,是不需要定义函数的参数,以及变量的类型的,这样带来的好处就是写程序更简便了,这个被大家称为是优点。 但是实际上,这是一个缺陷。为什么呢?

程序在执行的过程中,如果不知道一个变量的类型,只能动态去判断变量是什么,动态地查找处理变量的函数, 比如一个方法调用:a.run(b),就要去查找a的run方法,然后传入b参数。 这样造成每次函数调用,都会进行一次判断和查找,极大地降低程序执行速度。

另外一个问题就是,当传入的参数不正确(比如a没有run方法,或者run只接受一个参数),只有程序实际执行的时候,才会知道这点。 一方面要在函数和方法调用的时候来判断(更慢了),另外一方面本来能够静态识别出来的错误,留到了运行时。

更可怕的是,当传入的参数类型错误的时候,不能立刻就知道,而是要等到很久之后才会被发现, 这个时候你根本不知道这个参数是什么时候传进来的,Debug变得非常困难! 其它语言定义了类型,在编译的时候就可以发现这样的错误,但是动态类型语言,比如Ruby/Python就没有办法。

在实际进行Ruby编程的时候,我深刻地体会到了这几点。 尤其是项目变得很大的时候,执行速度不说,出现问题找Bug变得很困难, 程序可靠性没有办法通过编译阶段发现,而是只能留到执行时(testcase), 并且执行时也做不到其它静态语言级别的函数参数类型验证。

而在其它现代语言里面,类型定义不再向以前一样手动配置那么痛苦了。 比如在C#里面,我们可以定义函数参数的类型,以及所有变量的类型,也可以不定义(dynamic),做到和Ruby一样的效果。 但是还有更好的语法(var),程序语言自动给你做好类型定义,不用自己手写了,方便很多。

综上所述,静态类型验证系统是现代程序语言必备的一个功能,Ruby不应该缺少这样的功能。 Matz本人也说,下一阶段会进行这种系统的设计。 不过我觉得这么大的改动,只有在程序语言开始设计的时候才能做出,Ruby现在已经进入成熟阶段,再改就很难了。

如果不是Rails,我可能会考虑其它语言,但是谁让web开发框架里面,Rails生态圈最好最成熟呢。

Comments