【问题标题】:Javascript optional type hintingJavascript 可选类型提示
【发布时间】:2012-09-04 22:38:02
【问题描述】:

当编程语言是静态类型时,编译器可以更精确地分配内存,因此通常性能更高(在所有其他条件相同的情况下)。

我相信 ES4 引入了可选的类型提示(据我了解,由于 actionscript,Adobe 在其规范中发挥了重要作用)。因此,javascript 是否正式支持类型提示? ES6 是否支持原生变量的可选类型提示?

如果 Javascript 确实支持类型提示,是否有任何基准可以显示它在性能方面的回报?我还没有看到一个开源项目使用它。

【问题讨论】:

  • “我相信 ES4 引入了可选类型提示” => 你对此有引用吗?
  • 我不确定这是否重要,但这里是规范:ecmascript.org/es4/spec/overview.pdf 您可以通过在 pdf 中搜索“可选”来找到类型下的信息
  • 哦... ES4 - 又名“不是的标准”。不涉及它的政治,考虑 ES4 “一厢情愿”。

标签: javascript performance variables ecmascript-harmony ecmascript-4


【解决方案1】:

从听过各种网站上的许多 Javascript 演讲后,我的理解是,类型提示不会像人们想象的那样有帮助。

简而言之,如果您愿意,大多数 Javascript 对象往往具有相同的“形状”。也就是说,它们将具有以相同顺序创建的相同属性。这个“形状”可以被认为是对象的“类型”。 一个例子:

function Point(x, y) {
  this.x = x;
  this.y = y;
}

由“Point”制成的所有对象都将具有相同的“形状”,并且较新的内部 Javascript 引擎可以执行一些花哨的游戏以加快查找速度。

在 Chrome(也许还有其他)中,它们使用高位标志来指示数字的其余部分是整数还是指针。

随着所有这些花哨的事情的发生,剩下的就是人类编码人员的打字工作。一方面,我真的喜欢不必担心类型,也不会使用该功能。

不过,您是半正确的。类型提示是ActionScript 3 的一部分,它是ECMAScript 的派生词——但提示从未成为标准。 AFAIK,除了一厢情愿之外,还没有讨论过。

此视频更详细地描述了一些事情: http://www.youtube.com/watch?v=FrufJFBSoQY

【讨论】:

  • 你所说的花哨的东西是 TraceMonkey、V8 之类的吗?
  • @JaredFarrish -- 我连续看了五个小时的 JS 相关视频,有些细节变得模糊。我知道我给出的具体示例来自 V8,但也有一些 cmets 类似于“而且 Firefox 团队做了类似的事情。”
  • 在纪录片中链接到我的回答。
  • 嗯,现在看来TraceMonkey is no moreJägerMonkey 是至高无上的。有趣的文章。另外,在 Chrome 中运行 C++ 或其他什么发生了什么?这还有可能吗?
【解决方案2】:

我迟到了,但由于没有人真正回答你有关标准的问题,我会加入。

是的,类型提示作为 ECMAScript 4 的一部分进行了讨论,看起来它将成为 JavaScript 的未来……直到 ES4 尘埃落定。 ECMAScript 4 被放弃并且从未最终确定。 ECMAScript 5(当前标准)没有包含许多为 ECMAScript 4 计划的东西(包括类型提示),实际上只是 ECMAScript 3.1 草案的快速增强版本——以提供一些有用的功能在 ES4 过早消亡之后。

正如您所提到的,现在他们正在努力推出 ECMAScript 6(它具有一些非常棒的功能!),但不要期望看到类型提示。 Adobe 人员在一定程度上与 ECMAScript 委员会分道扬镳,而 ES 委员会似乎对恢复它不感兴趣(我认为有充分的理由)。

如果这是您想要的,您可能需要查看TypeScript。这是一个全新的微软项目,基本上是对 ES6+类型的尝试。它是 JavaScript 的超集(除了包含类型之外几乎相同),并且可以编译为可运行的 JavaScript。

【讨论】:

  • 微软是否在不引入类型提示以延长 Typescript 寿命方面发挥了重要作用?
  • @DUKE 你能澄清一下你的问题吗?
【解决方案3】:

JavaScript JIT 编译器必须做一些非常花哨的事情来确定表达式和变量的类型,因为类型对于许多优化至关重要。但是 JavaScript 编译器的编写者在过去的五年里一直在做所有这些工作。编译器现在真的很聪明。因此,可选的静态类型不会提高典型程序的速度。

令人惊讶的是,ActionScript 中的类型注释有时会在将值从无类型代码传递到有类型代码时要求进行类型检查(或隐式转换),从而使编译的代码变慢

您可能需要在编程语言中使用静态类型还有其他原因,但 ECMAScript 标准委员会没有兴趣将它们添加到 JS。

【讨论】:

  • 有像 asm.js 这样的项目,通过使用类型强制的奇怪技巧,设法使用 JavaScript 获得接近原生的性能(或者他们无论如何都是这么说的)。至少在理论上,类型提示对此有很大帮助。
【解决方案4】:

ES7(不会很快推出)有一个名为guard 的新功能可能就是您要问的那个。 现在的语法有点类似于 ES4 和 TypeScript。 全部使用: 并将类型附加到变量中。 但它不确认语法。

【讨论】:

【解决方案5】:

Javascript 是基于原型的,因此对象的“类型”是完全动态的,并且能够在其生命周期内发生变化。

看看 Ben Firshman 关于对象类型的 Javascript 性能的调查结果 - http://jsconf.eu/2010/speaker/lessons_learnt_pushing_browser.html

【讨论】:

  • 链接已失效
猜你喜欢
  • 2019-08-09
  • 2020-08-20
  • 2011-12-18
  • 2016-11-01
  • 2013-03-11
  • 2017-02-03
  • 2017-11-30
  • 1970-01-01
  • 2016-09-07
相关资源
最近更新 更多