Scala的缩放比其他JVM语言好吗?

这是我现在知道的唯一方法。 理解它,Scala使用Java虚拟机。 我以为Jruby也是。 Twitter将其中间件转换为Scala。 他们可以做同样的事情,并使用Jruby?

他们是否可以开始与Jruby开始,而不是他们的缩放问题,导致他们从Ruby转移到Scala呢? 我不明白Jruby是什么? 我假设,因为Jruby可以使用Java它将缩放在Ruby不会。

这一切都归结为静态与dynamictypes,在这种情况下?

Scala是“可扩展的”,因为图书馆可以改进语言 ,使扩展看起来像是语言的一部分。 这就是为什么演员看起来像语言的一部分,或为什么BigInt看起来像语言的一部分。

这也适用于大多数其他JVM语言。 它不适用于Java,因为它对于运算符的基本types(Int,Boolean等)有特殊的处理,繁琐的语法清楚地说明了在语言中构build什么以及什么是库等。

现在,Scala比JVM上的dynamic语言更具性能因为JVM不支持它们。 JVM上的dynamic语言不得不求助于reflection,这非常缓慢。

不,不是。 这并不是说JVM有一定的魔力,并且通过它的魔力来扩展它的规模; 就是说,Scala作为一种语言,被devise来帮助人们编写可伸缩的系统。 它在JVM之上几乎是偶然的。

我并不认为语言是这里最大的问题。 Twitter的疯狂快速增长,这总是导致代码混乱。 如果你重写,那么去一个不同的语言是一个不错的主意 – 这会阻止你重新构build自己的错误和/或“重用某些部分”。 另外,Ruby并不是真正意义上的Twitter后端那样繁重的数据处理。 前端仍然是Ruby,所以他们仍然使用它。

你必须分清缩放的不同含义:

  1. 按照每秒可以处理的请求数量的增长,按比例增加硬件进行扩展
  2. 扩大代码库的规模,而不是成为一个混乱的混乱

因为它编译为与Java非常相似的Java字节码,所以它通常与Java具有相同的性能。 我说“通常”,因为斯卡拉有一些情况下,惯用的斯卡拉导致大量的拳击发生的地方Java不会(在斯卡拉2.8这将被改变)的地方。

性能当然不同于缩放比例。 用JRuby编写的等效代码也可以缩放,但是行的斜率会更陡峭 – 您需要更多的硬件来处理相同数量的请求,但是行的形状将是相同的。 但是从更实际的angular度来看性能会有所帮助,因为在添加内核或特别是服务器方面,您很less能够以完美的线性方式进行扩展,并且性能更好会降低您必须增加容量的速度。

Scala帮助第二点,因为它有一个expression式,编译时强制types系统,它提供了很多其他的方法来pipe理代码的复杂性,如mixin。 您可以用任何语言编写意大利面条代码,但Scala编译器会告诉您什么时候某些面条在JRuby上被破坏,而您只能依靠testing。 我个人发现,对我来说,Python在大约1000个密切相关的LOC中发生故障,而且我必须重构要么大大减lessLOC,要么使结构更加模块化。 当然,无论你的语言如何,这个重构都是一个好主意,但是偶尔的复杂性是固有的。 处理大量紧密耦合的LOC在任何语言中都是不容易的,但是在Scala中比在Python中容易得多,我想这个类比也延伸到了Ruby / JRuby。

Scala是一个静态types的语言。 JRuby是dynamicinput的。 这就是为什么Scala比JRuby更快,即使它们都在JVM上运行。 JRuby必须在运行时(方法parsing等)做很多Scala在编译时所做的工作。 但是,值得一提的是,JRuby是一个非常快速的Ruby实现。

可伸缩性不是一种inheritance语言能力。 你正在谈论速度。

一个更好的问题是“为什么Scala比其他JVM语言(或者是它)快?”。 正如其他人指出的那样,这是一种静态与dynamic的语言。

在这篇文章的评论中,Twitter开发者自己有一个有趣的讨论。 他们已经评估了不同的选项,并决定在Scala中实现后端,因为:它的运行速度比Ruby / JRuby替代scheme快,他们觉得可以从静态types中受益。