【问题标题】:Learning Java so I can get at clojure [closed]学习 Java,这样我就可以使用 clojure [关闭]
【发布时间】:2011-04-19 19:18:58
【问题描述】:

我有讨厌 Java 的历史,在 90 年代后期的“慢热”时代经常使用它。因此,我从来没有真正学好它。据我了解,Java 实际上是当今使用的一种非常好的语言。由于 Jython 和 Clojure,我一直在考虑深入研究它。也就是说,我想用 Java 编程,并在适当的地方使用内联 Jython 或 Clojure。但说实话,我可能只是在 Jython/jRuby 中编程并从那里调用 clojure。

这让我想到了我的问题。我知道这两种语言都可以从 Java 中调用,但这一定是好的做法吗?如果我只想使用 Jython 作为主要语言,我是否应该费心学习 Java?看到这是我在这里的动机的很大一部分,我想知道在加入之前我并没有被严重误导。我知道如果以多种语言完成项目,成为杂牌的风险非常高像这样。

我还在学习JVM之类的东西,所以如果这个问题很明显,我很抱歉。

【问题讨论】:

标签: java clojure jython


【解决方案1】:

Jython 可以看作是从 Python 到 Java 虚拟机的交叉编译器。因此,要充分利用 Jython,您显然必须学习 Python,并且可能还需要学习 Java。

您可以跳过一些 Java 学习,但归根结底,Java 和 JVM 是一起成长的。这意味着 Java 代码往往有助于理解 JVM。没有 Java 也有可能了解 JVM,但这不是一条成功的道路。任何导入 Java 库的 Jython 代码都会立即让您搜索 Java 文档,因此,如果您避免学习 Java,无论如何您都会零碎学习它。

您必须决定是零碎的方法还是正式的方法更适合您和您的情况。决定走哪条路的关键在于知道如何学得最好。

就 90 年代的“慢热”时期而言,那是我学习 Java 的时候。就个人而言,我觉得最好将其描述为“如果你用 Java 做了非常愚蠢的事情,那么它会像球一样慢”。现在我认为人们已经建立了足够的技能来避免将 C 直接翻译成 Java。也就是说,我偶尔会遇到2000+线的方法,所以我的预测可能有点乐观。整个 JVM 的布局方式使得好的面向对象的代码运行得更快,如果你不断地试图去“其他”对象获取本地需要的所有数据,你只会堆叠 JVM。

不管意见如何,JVM 现在都是热门的 Java 项目。十多年来,一直以一种或另一种方式支持“其他语言”;然而,围绕特定领域语言的兴奋似乎引发了对编译技术和 JVM 的兴趣。其他语言受益于 JVM,因为 JVM 具有内置的跨平台支持、出色的性能、大量可用的库以及通常良好的文档,因此很容易命中目标。学习 Java 和 JVM 将帮助您处理很多 JVM supported languages,因为他们中的许多人并没有充实自己的库空间,而是倾向于挂钩到纯 Java 库。

【讨论】:

    【解决方案2】:

    我想说,即使您打算只使用其他 JVM 语言,了解 Java 也是值得的。我使用 JRuby 和 Scala,并且玩过 Clojure。如果您正在构建要在 JVM 上运行的东西,那么了解 Java 有点像在本地工作时了解 C ——您不必了解 C,但如果您了解 C,您可以用 C 编写需要速度的位并将它们包装起来在 Ruby 或 Python 库等中。

    有必要了解 Java 在接口和注释等方面的工作原理以及类路径的工作原理,因为否则您基本上是在使用泄漏的抽象。当您的互操作性不是很好时会发生什么?如果您打算使用 Clojure 和 Jython,则尤其如此!

    了解 Java 的另一个原因很简单,因为如果您在 Java 生态系统中使用代码,您必须能够读写 Java。你需要写一个库吗?是的,您可能可以用 Clojure 编写它,但如果您希望其他 JVM 语言用户能够使用它,您可能应该用好的、惯用的 Java 编写它。为此,Scala 与 Java 非常接近。 Clojure 或 Ruby 或 Python,没有那么多。能够阅读和理解 Java 程序也很重要。

    另一个很大的好处就是您可以获得更多的库并且它们经过了更好的测试。你需要一个双端队列吗?检查 Java 集合框架。好的随机数生成? java.security.SecureRandom。用户界面?好吧,Swing、AWT 和 SWT 是……好吧,不好的例子。了解这些优点和缺点的唯一方法是进行一些 Java 编程并学习各种不让 Java 陷入困境的方法。

    【讨论】:

      【解决方案3】:

      从几年使用 Clojure 的经验(加上多年的 Java...)来看,这是我的观点:

      • 您不需要任何 Java 经验来编写 Clojure 代码 - Clojure 本身就是一门完整的语言,您可以在不使用任何 Java 的情况下编写功能完善的程序。 p>

      • 需要设置 JVM 环境 - Java 环境有一些关于从何处加载代码(即“类路径”)的规则,需要遵循才能获得工作环境。没什么大不了的,大多数 IDE 都会为你做这件事,但对于完全不熟悉 JVM 世界的人来说,这可能是一个障碍。我建议您仔细遵循您选择的任何 IDE/工具集的设置说明。

      • 有一些与 Java 相关的概念有助于理解 - 例如,Clojure 利用 (try ... (catch ...)) 等的 Java 异常处理功能,因此熟悉异常处理的 Java 方法。

      • 最终你可能会想要使用 Java API - 因为首先在 JVM 上的巨大价值在于能够访问大量的库和Java 生态系统中可用的工具。您无需编写任何 Java 代码即可使用 Clojure 中的 Java API,但您需要了解足够多的 Java(方法签名、数据类型等)才能阅读 API 的 JavaDoc 文档并将其转换为适当的 Clojure 函数调用。通常,这就像 (.someJavaMethod someJavaObject param1 param2) 一样简单,但有时可能更复杂(例如,当您需要实例化某个 Java 类的子类以作为参数传递时)

      • Java 无论如何都不是一门不好学的语言 - 虽然我承认 Java 有一些弱点(就像所有语言一样!),但它仍然是一门很棒、简单、具有很大价值的高性能、跨平台、面向对象的语言。即使你只写了few short tutorials 并且从未用 Java 写过任何实质性的东西,我仍然会推荐它来获得学习体验。

      我相信以上大部分内容也适用于 Jython。

      【讨论】:

        【解决方案4】:

        我不能代表 Jython,但如果您想真正掌握 clojure,您需要了解它与 Java 相比的权衡取舍,尤其是 wrt memory/gc 和 Clojure/Java 互操作的基础知识。除非您真的不关心性能,否则您至少还需要对 clojure 集合的实现方式有一个抽象的理解——这并不是说 clojure 效率特别低,而是恰恰相反:其不可变集合的实现是相当独特的,并且根据 clojure 在持久性和性能方面的立场量身定制,当您尝试改进性能问题时,它有助于理解底层细节。

        尽管如此,我认为您实际上并不需要很多 Java 知识。能够很好地阅读 Java,对概念有基本的了解,并且知道在哪里可以找到文档可能就足够了。

        我认为如果你想做一个混合 Clojure/Jython 项目,互操作细节是最关键的。这可能意味着您必须详细了解类、接口、一些标准库和(在最小程度上)泛型在 Java 中是如何工作的,以及如何用您选择的语言处理所有这些,因为互操作必然会减少到更基本的 Java 结构。其中一些是棘手的并且可能会令人困惑,至少在 clojure 的情况下,文档出于显而易见的原因经常引用 Java 概念和文档,因此您必须确保仔细阅读两者。

        【讨论】:

        • 我想说的大致相同。我完全同意 Joost 的看法。这就像在学习 C 时了解汇编程序。不是必需的,但一切都会变得更加清晰和不那么神奇,并且与另一种语言的互操作将从“疯狂的黑艺术”变为“在某些约定下显而易见”。
        【解决方案5】:

        我肯定会学习 Java 并且学得很好,不仅因为 Clojure 构建在 JVM 之上,而且为了完成任何事情,你将一直调用 Java 库,你甚至可能需要偶尔使用 Java .

        另一方面,了解 Java 的 OO 概念和痛点也将扩展您的思维,这也将增强您对 Clojure 的理解。

        【讨论】:

          【解决方案6】:

          首先,学习 Java 库。使用 JVM 的部分乐趣在于可以访问“已经完成”的库,以及可以在 JVM 上以最佳性能完成某些任务的部分核心语言。此外,一些语言(例如 Clojure)有目的地直接使用 Java,并且不会在您自己的代码中完全阻止它,所以如果您想能够阅读其他人的代码,Java 基础知识是必须的。

          至于“学习 Java”的其余部分(设计模式、Java 中的并发性等),除非/直到特定项目要求需要,否则我不会浪费您的时间。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-01-02
            • 2012-01-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多