动态语言正在兴起,其中有很多:例如 Ruby、Groovy、Jython、Scala(静态,但具有动态语言的外观和感觉)等。我的背景是 Java SE 和 EE 编程,我想要将我的知识扩展到这些动态语言之一,以便为未来做好更好的准备。
但是我应该专注于学习哪种动态语言,为什么?在不久的将来,哪种语言会成为首选语言?
动态语言正在兴起,其中有很多:例如 Ruby、Groovy、Jython、Scala(静态,但具有动态语言的外观和感觉)等。我的背景是 Java SE 和 EE 编程,我想要将我的知识扩展到这些动态语言之一,以便为未来做好更好的准备。
但是我应该专注于学习哪种动态语言,为什么?在不久的将来,哪种语言会成为首选语言?
学习 Ruby 或 Python(以及较小程度的 Scala)意味着您将拥有非常可转移的技能 - 您可以使用 Java 版本、本机版本或 .NET 版本(IronRuby/IronPython)。Groovy 很好,但特定于 JVM。
除非您设想特定的场景,否则“为未来做好更好的准备”是很棘手的。你想从事什么样的工作?你有一个可以用动态语言有用地实现的项目吗?它是否足够小,可以试穿几个,感受一下它们的不同之处?
Scala 根本不是一种动态语言。类型推断并不意味着它是无类型的。然而,它是一种非常好的语言,它很好地混合了 OOP 和函数式编程。唯一的问题是您在此过程中遇到的一些问题。
由于您已经是一位经验丰富的 Java 程序员,因此它将非常适合您的技能。现在,如果你想一直走动态,Ruby 或 Python 都是很棒的语言。两种语言都有需求。
我个人会推荐 Clojure。Clojure 是一种很棒的新语言,它的流行速度比我见过的任何语言都要快。Clojure 是一个在 JVM 上实现的强大、简单、快速的 Lisp。它当然可以访问所有 Java 库,就像 Scala 一样。它已经有一本关于它的书,它已经成熟到 1.0 版,并且它有三个正在开发的 IDE 插件,所有三个都非常有用。
我会看看Scala。为什么 ?
我的(完全主观的)观点是,Scala 似乎得到了 Groovy 在一两年前获得的大量关注。我不想在这里引起争议,或者建议让它成为一种更好的语言,但它似乎是新的 JVM 语言de jour。
顺便说一句,具有一些动态属性的语言是 Microsoft 的F#。我目前正在研究这个(并且忽略了我自己的建议,即上面的第 1 点和第 2 点!)。它是一种带有对象的函数式语言,建立在 .Net 上,目前受到了很多关注。
在游戏行业 Lua,如果你是基于 Adobe 的设计师 Lua 也不错,如果你是嵌入式程序员 Lua 实际上是唯一的轻量级解决方案,但如果你正在研究 Web 开发和通用工具脚本,Python 会更实用
我发现 Groovy 从广泛的 Java 背景中跳出来相对容易——它是一种更方便的 Java 版本。如果您需要做这种事情,它也可以很好地与现有的 Java 代码集成。
我会推荐Python。它有一个庞大的社区并且有一个成熟的实现(以及几个有前途的还不太成熟的)。就我所见,与较新的语言相比,Perl 失去了很多吸引力,大概是因为它的“不直观”(不,不要让我开始这样做)。
当你用 Python 完成一个或两个项目后,继续做其他事情以获得更广阔的视野。如果您已经用两种不同的动态语言完成了一些重要的事情,那么您在同化任何其他语言时都不会遇到任何问题。
JScript 非常有用,而且它肯定是一种动态语言...
记住你的背景,我会推荐一种语义与你所知道的相似的语言。因此,像 Scala、Fan、Groovy 这样的语言将是一个很好的起点。一旦你掌握了使用函数式语言的基本语义(并且开始喜欢它),你就可以转向像 Ruby 这样的语言。这样一来,您的周转时间就会减少,而且您可以成为一名多语言程序员。
我会为 Groovy(和 Grails)投票 +1。您仍然可以使用 Java 样式或 Groovy 进行输入(您也可以将两者混合使用,无需担心)。您也可以使用 Java 库。
作为一般规则,避免使用动态类型语言。编译时检查的损失和强大的静态类型的自文档性质非常值得将类型信息放入源代码中。如果您在编写代码时需要做的额外输入工作太费力了,那么具有类型推断功能的语言(Scala、Haskell)可能会很有趣。
拥有类型信息使代码更具可读性,而可读性应该是您在编码时的第一标准。一个人阅读代码的成本很高,任何阻碍读者清晰、准确理解的东西都是一件坏事。在 OO 语言中情况更糟,因为您总是在创建新类型。刚刚熟悉的读者会因为不知道正在传递和修改的类型而感到困惑。例如,在 Groovy 中,以下是合法的def accountHistoryReport(in, out)
阅读,我不知道什么in
和out
是。当您查看 20 种不同的报告方法时,您很快就会完全杀人。
如果你真的认为你必须有非静态类型,那么像 Clojure 这样的语言是一个很好的折衷方案。类似 Lisp 的语言建立在一小部分关键抽象和每个抽象上的大量能力之上。所以在 Clojure 中,我将创建一个具有对象属性的映射(散列)。这有点简化,但我不必查看整个代码库来实现某些未命名的类。
我的经验法则是我用动态语言编写脚本,用编译的静态类型语言编写系统。