这是我目前知道的唯一方法。理解它 Scala 使用 Java 虚拟机。我认为Jruby也是。Twitter 将其中间件切换到了 Scala。他们能做同样的事情并使用 Jruby 吗?
他们是否可以从 Jruby 开始,并且没有遇到导致他们从 Ruby 迁移到 Scala 的缩放问题?我不明白 Jruby 是什么吗?我假设因为 Jruby 可以使用 Java,它会在 Ruby 无法使用的地方进行扩展。
在这种情况下,这一切都归结为静态类型与动态类型吗?
这是我目前知道的唯一方法。理解它 Scala 使用 Java 虚拟机。我认为Jruby也是。Twitter 将其中间件切换到了 Scala。他们能做同样的事情并使用 Jruby 吗?
他们是否可以从 Jruby 开始,并且没有遇到导致他们从 Ruby 迁移到 Scala 的缩放问题?我不明白 Jruby 是什么吗?我假设因为 Jruby 可以使用 Java,它会在 Ruby 无法使用的地方进行扩展。
在这种情况下,这一切都归结为静态类型与动态类型吗?
Scala 是“可扩展的”,因为库可以改进语言,使扩展看起来像是语言的一部分。这就是为什么演员看起来像语言的一部分,或者为什么 BigInt 看起来像语言的一部分。
这也适用于大多数其他 JVM 语言。它不适用于 Java,因为它对基本类型(Int、Boolean 等)、运算符、繁琐的语法进行了特殊处理,明确了语言中构建的内容以及库的内容等。
现在,Scala 比JVM 上的动态语言更具性能,因为 JVM 不支持它们。JVM 上的动态语言必须求助于反射,这非常慢。
不,不是。这并不是说 JVM 具有某种魔力,并通过它的魔力使事情规模化。Scala 作为一种语言,旨在帮助人们编写可扩展的系统。它位于 JVM 之上几乎是偶然的。
我真的不认为语言是这里最大的问题。Twitter 发展得非常快,这总是导致代码混乱。而且,如果您进行重写,那么使用不同的语言是一个好主意 - 这会阻止您再次构建自己的错误和/或“重用某些部分”。此外,Ruby 并不真正适用于 twitter 后端所做的那种繁重的数据处理。前端仍然是 Ruby,所以他们仍然使用它。
您必须区分缩放的不同含义:
Scala 在第一点上有所帮助,因为它编译为与 Java 非常相似的 Java 字节码,因此通常具有与 Java 相同的性能。我说“通常”,因为 Scala 在某些情况下,惯用的 Scala 会导致发生大量的装箱,而惯用的 Java 不会(这将在 Scala 2.8 中改变)。
性能当然不同于缩放。用 JRuby 编写的等效代码也可以扩展,但线的斜率会更陡 - 您需要更多硬件来处理相同数量的请求,但线的形状会相同。但从更实际的角度来看,性能会有所帮助,因为在添加核心或特别是服务器方面,您很少能以完美的线性方式进行扩展,并且具有更好的性能会减慢您必须添加容量的速度。
Scala 在第二点上有帮助,因为它有一个富有表现力的、编译时强制类型系统,并且它提供了许多其他方法来管理代码的复杂性,例如 mixin。您可以用任何语言编写意大利面条式代码,但 Scala 编译器会告诉您何时出现问题,而使用 JRuby,您将不得不完全依赖测试。我个人发现,对我而言,Python 在大约 1000 个密切相关的 LOC 处发生故障,我必须重构以大幅减少 LOC 或使结构更加模块化。当然,无论您的语言是什么,这种重构都是一个好主意,但有时复杂性是固有的。处理大量紧密耦合的 LOC 在任何语言中都不容易,但在 Scala 中比在 Python 中要容易得多,
Scala 是一种静态类型语言。JRuby 是动态类型的。这就是为什么 Scala 比 JRuby 快的原因,尽管两者都运行在 JVM 上。JRuby 必须在运行时完成大量工作(方法解析等),而 Scala 在编译时完成。不过,就其价值而言,JRuby 是一个非常快速的 Ruby 实现。
可扩展性不是继承语言能力。你在谈论速度。
一个更好的问题是“为什么 Scala 比其他 JVM 语言(或者是)更快?”。正如其他人指出的那样,这是静态与动态语言的事情。
在这篇文章的评论中,Twitter 开发人员自己进行了一次有趣的讨论。他们评估了不同的选项并决定在 Scala 中实现后端,因为:它比 Ruby/JRuby 替代方案运行得更快,并且他们认为他们可以从静态类型中受益。