我读过the article about Google's upcoming DASH/DART language,我觉得很有意思。
我偶然发现的一件事是他们说他们会消除JavaScript固有的性能问题。但这些性能问题到底是什么?文中没有任何例子。这就是它所说的:
- 性能 - Dash的设计具有性能特征 请注意,可以创建没有性能的VM 所有EcmaScript VM必须具备的问题。
您对这些固有的性能问题有什么想法吗?
答案 0 :(得分:8)
对于那些只对时间编译器感兴趣的动态语言的人来说,这个帖子是必读的: http://lambda-the-ultimate.org/node/3851
这个帖子的参与者是luajit的创建者,pypy伙伴,Mozilla的javascript开发者等等。 特别注意Mike Pall的评论(他是luajit的创建者)以及他对javascript和python的看法。 他说语言设计会影响绩效。例如,他重视简单性和正交性,同时避免困扰javascript的疯狂角落案例。
那里讨论了许多不同的技术和方法(跟踪jits,方法jits,解释器等)。 看看吧!
路易斯
答案 1 :(得分:6)
这篇文章指的是来自极其动态的语言(如JavaScript)和原型继承的优化困难。
在Ruby或JavaScript等语言中,程序结构可以在运行时更改。类可以获得一个新方法,函数可以被eval()存在,等等。这使得运行时更难以优化其代码,因为永远不能保证设置结构。
原型继承比传统的基于类的语言更难优化。我怀疑这是因为基于类的VM有多年的研究和实施经验。
有趣的是,V8(Chrome的JavaScript引擎)使用隐藏类作为其优化策略的一部分。当然,JS没有类,因此在V8中对象布局更复杂。
V8中的对象布局要求标题中至少包含3个字。相比之下,Dart VM只需要标题中的1个字。 Dart对象的大小和结构在编译时是已知的。这对VM设计者非常有用。
另一个例子:在Dart中,有真实的列表(又名数组)。你可以拥有一个固定长度的列表,它比JavaScript的非真正数组更容易优化,并且总是可变长度。
阅读有关使用此演示文稿将Dart(和JavaScript)编译为高效代码的更多信息:http://www.dartlang.org/slides/2013/04/compiling-dart-to-efficient-machine-code.pdf
另一个性能维度是启动时间。随着Web应用程序变得越来越复杂,代码行数也会增加。 JavaScript的设计使得优化启动变得更加困难,因为解析和加载代码也会执行代码。在Dart中,语言经过精心设计,可以快速解析。 Dart在加载和解析文件时不执行代码。
这也意味着Dart VM可以缓存已解析文件的二进制表示(称为快照),以便更快地启动。
答案 2 :(得分:5)
一个例子是tail call消除(我确信有些人认为它需要高性能functional programming)。为谷歌的V8 Javascript VM添加了feature request,但这是回复:
尾部调用消除与JavaScript不兼容,因为它在真实中使用 世界。