42

这是我目前知道的唯一方法。理解它 Scala 使用 Java 虚拟机。我认为Jruby也是。Twitter 将其中间件切换到了 Scala。他们能做同样的事情并使用 Jruby 吗?

他们是否可以从 Jruby 开始,并且没有遇到导致他们从 Ruby 迁移到 Scala 的缩放问题?我不明白 Jruby 是什么吗?我假设因为 Jruby 可以使用 Java,它会在 Ruby 无法使用的地方进行扩展。

在这种情况下,这一切都归结为静态类型与动态类型吗?

4

7 回答 7

39

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

这也适用于大多数其他 JVM 语言。它不适用于 Java,因为它对基本类型(Int、Boolean 等)、运算符、繁琐的语法进行了特殊处理,明确了语言中构建的内容以及库的内容等。

现在,Scala 比JVM 上的动态语言更具性能,因为 JVM 不支持它们。JVM 上的动态语言必须求助于反射,这非常慢。

于 2009-06-03T20:13:36.010 回答
11

不,不是。这并不是说 JVM 具有某种魔力,并通过它的魔力使事情规模化。Scala 作为一种语言,旨在帮助人们编写可扩展的系统。它位于 JVM 之上几乎是偶然的。

于 2009-06-03T16:16:27.540 回答
5

我真的不认为语言是这里最大的问题。Twitter 发展得非常快,这总是导致代码混乱。而且,如果您进行重写,那么使用不同的语言是一个好主意 - 这会阻止您再次构建自己的错误和/或“重用某些部分”。此外,Ruby 并不真正适用于 twitter 后端所做的那种繁重的数据处理。前端仍然是 Ruby,所以他们仍然使用它。

于 2009-06-04T06:26:18.037 回答
5

您必须区分缩放的不同含义:

  1. 随着硬件的成比例增加,每秒可以处理的请求数量增加
  2. 扩展代码库而不使其变得混乱

Scala 在第一点上有所帮助,因为它编译为与 Java 非常相似的 Java 字节码,因此通常具有与 Java 相同的性能。我说“通常”,因为 Scala 在某些情况下,惯用的 Scala 会导致发生大量的装箱,而惯用的 Java 不会(这将在 Scala 2.8 中改变)。

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

Scala 在第二点上有帮助,因为它有一个富有表现力的、编译时强制类型系统,并且它提供了许多其他方法来管理代码的复杂性,例如 mixin。您可以用任何语言编写意大利面条式代码,但 Scala 编译器会告诉您何时出现问题,而使用 JRuby,您将不得不完全依赖测试。我个人发现,对我而言,Python 在大约 1000 个密切相关的 LOC 处发生故障,我必须重构以大幅减少 LOC 或使结构更加模块化。当然,无论您的语言是什么,这种重构都是一个好主意,但有时复杂性是固有的。处理大量紧密耦合的 LOC 在任何语言中都不容易,但在 Scala 中比在 Python 中要容易得多,

于 2009-07-31T11:43:38.597 回答
4

Scala 是一种静态类型语言。JRuby 是动态类型的。这就是为什么 Scala 比 JRuby 快的原因,尽管两者都运行在 JVM 上。JRuby 必须在运行时完成大量工作(方法解析等),而 Scala 在编译时完成。不过,就其价值而言,JRuby 是一个非常快速的 Ruby 实现。

于 2009-06-03T17:02:03.313 回答
4

可扩展性不是继承语言能力。你在谈论速度。

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

于 2009-06-09T19:00:05.873 回答
3

在这篇文章的评论中,Twitter 开发人员自己进行了一次有趣的讨论。他们评估了不同的选项并决定在 Scala 中实现后端,因为:它比 Ruby/JRuby 替代方案运行得更快,并且他们认为他们可以从静态类型中受益。

于 2009-06-03T22:16:16.417 回答