18

所以直到大约 6 个月前,我的大部分工作(大图处理)都由 Python 和 C++ 组成。到那时,甚至现在,我还没有写过任何 Java。我看过这种语言并且熟悉语法(来自 C/C++ 背景),并且喜欢 JVM 的想法,但从来没有实际上写了大量的Java。

当我拿起 Scala 时,我很喜欢它,OOP 和函数式编程功能合二为一,而且它在 JVM 上很棒。我一直在努力改进我的 Scala 并且一直在使用 Akka,并且仍然喜欢它。然而,有时,也许只是我想多了,但我觉得我应该多学习一些关于 Java 和/或 JVM 的知识。

我从很多人那里听说 Scala 应该被视为与 Java 不同的语言,就像 C++ 到 C 一样。也许你可能有同样的感觉,也许学习 Java 与学习 Scala 或多或少是脱节的,但我感觉在学习更多关于 JVM(例如 JIT 编译、类型擦除)的信息会有所帮助吗?

想法?

4

6 回答 6

10
  1. JVM 执行字节码,知道它是如何工作的肯定会很有帮助,就像有时知道 C/C++ 方法调用如何工作或类如何初始化一样;因为有时它很重要,无法抽象掉。

  2. Java 是 JVM 的主要语言,如果您需要直接使用 Java 类,在一定程度上能够阅读 Java 会很有帮助。这可能经常发生;仅举几个例子:

    • 你需要使用一些第三方 Java 库(而且有很多)
    • 使用属性
    • 您需要在 Swing 中做一些 Scala-Swing 包装器不支持的特殊操作
    • 还有解释 1) 的资料的来源很可能会使用 Java 示例

但我的建议是不要提前研究它——你会在需要的时候拿起它。

于 2012-07-06T08:59:55.703 回答
9

立即购买这本书:Java 性能。它是去年 10 月才发布的,对于任何想要了解 JVM 的人来说,它都是一个信息宝库。如果您要成为一名 Scala 开发人员,您至少必须了解垃圾收集和 JVM 运行时参数。

于 2012-07-06T12:59:21.437 回答
9

在我头顶

  • 原语、自动装箱以及 java 数组的特殊之处;

  • 擦除和显现

  • scala 源代码中的逻辑尾递归调用是如何编译的

  • 在您的平台上安装 -client、-server 以及当您想尝试 32 位时:例如 JAVA_HOME 和 OS X 中的“Java 首选项”。我认为openJDK 应该可以在您使用相同版本的 Oracle JDK 的任何地方工作,但 IntelliJ 警告您只使用官方 Oracle JDK。我看到非常孤立的报告说 3d 图形库在 openJDK 上存在问题,并且 openJDK 的某些部分(如字体)也存在许可问题。

  • 在 REPL、编译器选项和 SBT 中设置类路径

  • 热点开关、XMX、XMS(堆设置)、最常见的垃圾收集器、内联方法调用

  • java.util.concurrent

  • 在 JDK 6 和 7 中编译的 java 和 scala 代码可能存在二进制兼容性问题。

于 2012-07-06T15:53:37.237 回答
8

我不确切知道您需要什么,但是关于 SO 有几个类似的问题,请看。

另外,这里有关于 Java 内存模型的好文章

我认为最好用 Java 语言进行挖掘,编写一些代码,阅读 Java 特定的书籍,以便更好地了解所有事物的工作原理。

于 2012-07-06T09:04:50.427 回答
5

围绕 JVM 有很多工具。如果您想了解您的程序是如何运行的(出于性能或其他原因),那么这些都是值得的。两个有用的工具是:

  1. 堆栈
  2. 视觉虚拟机

两者对于监控和询问长时间运行的进程都特别有用。

于 2012-07-06T16:32:16.027 回答
1

我想你在编写 Scala 时会更多地了解 JVM。我的意思是你会有更多的问题,比如“为什么这个解决方案很慢而那个很快?” - 回答这个问题的一种方法是检查字节码

于 2012-07-06T09:39:08.103 回答