网络寻租

Programmer, Gamer, Hacker

Ruby没有做到编程语言应该有的优化

| Comments

Ruby语言很慢。是的,这是一个设计缺陷。

我们知道Ruby语言的执行方式是,首先编译成虚拟机字节码,然后丢给Ruby虚拟机执行。 其它类似这样做的语言也很多,比如C#,java,python,但是为什么Ruby比他们慢很多?

首先,我们看合理的这种编译到字节码的语言应该如何优化。比如java。 首先是语法解析(parse),把文本转换成抽象语法树(AST),然后经过编译和适当的优化,变成字节码。 然后丢给语言虚拟机,用JIT机制转换成机器代码。

这样一套做下来,代码最后会变成机器语言的代码,执行速度从理论上,比传统的编译到机器代码的语言更优(因为机器代码是动态生成的,可以根据运行状况改动)。

但是Ruby语言很多都没有做到。JIT这么难就不说了,语言的编译和优化,因为动态类型,很多优化也没有办法完成。最基本的AST缓存或者字节码缓存(python语言有做), Ruby也没有进行,可能是因为发现Ruby太动态了这方面优化不了吧。

同样的,内存上面的优化,Ruby也很难进行。这个算是所有动态语言的缺点。 静态语言的对象基本只要带属性,动态语言的对象还要带上方法表,函数和方法调用也要存名字,而不是直接引用地址,没有简单的办法优化。

虽然现在机器的性能很高,应用的瓶颈也往往不在CPU端和内存端,但是慢就是慢,本来应该有办法做好的地方做差了。

怎么弥补?首先要语言本身可以定义类型。但是这样Ruby就不是Ruby了。

Comments