“我们希望对其进行编译,以免烧毁CPU做错事情。”这句话的含义是什么。


10

我在读这篇文章。它具有以下段落。

Scala真的很快吗?那么,您对fast的定义是什么?大约和Java一样快。它不必与C或Assembly一样快。Python没有比Ruby快很多。我们想用更少的机器做更多的事情,以更好地利用并发性。我们希望对其进行编译,以免烧毁CPU做错了事情。

我正在寻找最后一句话的含义。解释语言将如何使CPU做“错误”的事情?


3
调用编译为已解释的JVM字节码的任何内容在用法上都比较宽松。
钻机2012年

Answers:


47

如果代码说

A = A + 1

编译的代码可以做到这一点

add A, 1

解释代码可以做到这一点(或某些变化)

look up the location of A in the symbol table
find the value of A
see that 1 is a constant
get its value
add the value of A and the value of 1
look up the location of A in the symbol table
store the new value of A

有想法吗?


3
有时过度简化的确可以使画面更清晰;-)(只是为了完整:许多著名的解释器优化了一些步骤,因此它们位于两个示例“实现”之间)。
Joachim Sauer 2012年

3
@JoachimSauer:您当然是对的。与编译后的代码相比,使解释器运行时的速度损失少于10倍仍然很困难。如果该语言确实花费了所有时间在无论如何都必须调用的从属编译函数中,例如数学库或I / O,则解释的成本就不成问题。
Mike Dunlavey 2012年

1
这是一个了不起的描述
Jamie Taylor

13

我们希望对其进行编译,以免烧毁CPU做错了事情。

听起来像是指编译还是解释。在最初使用Ruby On Rails开发(解释)之后,很可能是Twitter将后台处理任务移至Scala(已编译)的整个故事。

这里解释编译代码与解释代码。

使用编译语言,您输入的代码在保存为可执行文件之前,将简化为一组机器特定的指令。使用解释性语言,代码将以您输入的相同格式保存。编译程序通常比解释程序运行得快,因为在运行时必须将解释程序简化为机器指令。


很高兴为您提供第一个+1。欢迎来到P.SE!
haylem 2012年

4
(可能值得一提的是,Scala(在JVM上)在技术上仅是字节编译的)。
haylem 2012年

不知道Scala是基于JVM的。意味着它可能是JIT编译的。在那种情况下,为什么Twitter不只是从Ruby on Rails迁移到JRuby?您可能会认为,借助已编译的好处,迁移会更容易。
KrisG 2012年

3
他们也在寻找更好的并发模型,并且在Ruby的垃圾回收方面遇到了问题。本文详细介绍了它。
scrwtp 2012年

9

这里的“错误内容”是指解释器解析和处理代码所需的开销。它与解释语言和编译语言的概念有关。有几种正在使用的代码转换模型,大致可分为以下类别之一:

  • 本机编译-源代码直接编译为机器代码。最佳性能以可移植性为代价。通常与C和C ++相关联,
  • 中间编译-将源代码编译成简化的中间语言(字节码),然后在执行过程中将其解释或编译(即时编译)成机器代码。比本地代码更好的可移植性,比纯解释更好的性能,同时保留了解释的一些优点(例如后期绑定)。示例包括C#,Java和其他针对JVM和.NET CLR的语言,
  • 解释-源代码不直接翻译成机器代码,而是由专用的解释器程序解释和执行。解释器的复杂程度各不相同,但在幼稚的实现中却归结为逐行解析,分析和执行源代码。解释比编译提供更大的灵活性,因此,例如,解释型语言更广泛地使用动态类型或反射。解释性语言通常被认为可以提高开发人员的生产力,因为它们需要更少的样板代码,并且非常适合快速原型制作。缺点是性能降低。通常与JavaScript,Ruby或Python相关联。

因此,在解释型语言和编译型语言之间进行选择可以归结为以下问题:我们更看重什么,开发人员的生产力或性能?本文中描述的迁移似乎遵循相同的思路,出于性能考虑,强大的原型语言Ruby被基于JVM的Scala取代。


-1答案的措辞方式,看起来过于简单。它完全忽略了诸如JIT(即时编译)之类的东西-这就是Scala如何在JVM / CLR之上运行的方式
gnat

真正。重写了答案,实际上没有增加任何话题。
scrwtp 2012年

-3

在这种情况下,我认为the wrong stuff在未编译的代码中缺乏类型安全性。

因此,不仅解释的代码变慢了,而且还有更多的错误……


8
您假设编译语言是类型安全的,而解释语言则不是。有很多相反的例子。例如LISP可以编译和不是强类型的,而哈斯克尔可以解释,是非常类型安全
扎卡里ķ

1
将“不安全的类型”与“更多的越野车”等同起来是有产品销售人员推动的FUD。
user16764 2012年

1
@ user16764:如果是真的,那不是FUD。IME试图胡说八道以销售产品的人就是那些试图淡化动态类型与错误之间联系的人。(“这只是错误的一种,等等。”)
Mason Wheeler 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.