我最近一直在从事JavaScript中小型游戏的开发,以使自己熟悉并来自C和Java的背景。在我的游戏中,我使用一些常数来渲染所有对象,并且我想知道这些对象对性能的影响。 C和Java都是带有编译器的语言,它们会在代码实际运行之前自动将2 + 3之类的简单语句简化为5。这很棒,因为这意味着我可以通过在代码中添加诸如WINDOW_MAX_Y-SHIP_Y之类的代码来使代码更具可读性,并稍后理解它的作用。但是,最近查看我的代码时,发现用这种样式编写的几行代码变得很长,而且由于JavaScript没有编译器,所以我想知道如果将所有内容简化为“幻数”或JavaScript是否具有某些函数(例如C编译器)可以在执行之前自动简化行。但是,如果JavaScript无法简化那些我希望知道的语句,因为它们每秒运行数千次,我想保持代码的可读性。
答案 0 :(得分:0)
不一定在执行之前,而是在解释器检测到大量使用该代码时。
您提到Java,这很好,因为我认为您可能熟悉该概念,因为Java是最早实现它的语言之一。这称为即时编译(简称JIT)。
没有标准涵盖如何在Javascript中实现JIT。而且没有标准要求JavaScript解释器必须实现JIT(顺便说一句,这对于Java来说是完全相同的,实现不实现JIT编译器的JVM是完全合法的)。但是,市场力量已确保当前所有主要的javascript解释器都实施了JIT(这似乎有些奇怪,因为所有主要的javascript解释器都是免费的,但它们都在争夺市场份额,而不是利润)。
类似地,您提到了C,这很不错,因为它还意味着您应该熟悉另一个概念。在C语言中,没有标准定义a = 1 + 2
的编译方式。 C标准中有一个概念指定了这种优化的行为:假设规则。它基本上指出,如果编译器要执行优化,则最终结果必须与没有优化的情况完全相同。
目前,所有主要的javascript解释器都具有编译器通常具有的大多数常见优化。它们都稍有不同(就像所有C编译器都略有不同一样),但是它们都可以即时编译代码。此外,大多数解释器还在编译为字节码的过程中执行优化。
是的,就像Java一样,有字节码。尽管程序员没有执行任何编译步骤,但是所有当前的javascript解释器都像Java一样在执行之前编译为字节码。对于所有现代的“脚本”语言(例如Python和Ruby)都是如此。
我的建议基本上是,如果您不担心C或Java中的此类问题,那么就不必担心使用javascript。对于您需要用C担心的事情(例如微优化),有一个名为asm.js的javascript子集,可以保证将其编译成机器代码而不是字节码(如果设置正确)。