32

我是一位经验丰富的 C++ 程序员,具有平均 Python 技能。我最初学习 Python 的原因是:

  • 对编程有不同的看法(静态与动态、解释与编译等)
  • 增加我可以从事的项目的广度(Python 允许我进行 Web 开发、为 Symbian 手机开发或敲开快速的系统管理脚本)
  • 来补充我的 C++ 技能。

我认为 Python 很棒,我相信我已经实现了上述目标。我将继续将它用于小型项目、脚本和 Web 开发。

我怀疑我是否可以将它用于大中型项目。虽然动态类型很方便,但它允许某些我觉得令人不安的错误。单元测试和 linting 可以缓解这个问题,但是静态类型完全消除了它。

在查看了一些编程语言之后,我认为 Scala 看起来是一个不错的候选者:我喜欢类型推断,它在 JVM 上运行,因此它应该在 JVM 可用的任何地方都可用。在使用它时,我还可以了解更多关于函数式编程的知识。

但是......我也有一些疑问,这就是我希望 Stack Overflow 社区可以提供帮助的地方:

  • 可移植性:至少我希望 Linux 和 Windows。手机呢,有没有可能让它在那里运行?
  • C++ 兼容性:我可以将 C++ 代码与 Scala 混合使用吗?(JNI?)
  • 编程范式:此时我对切换到函数式编程 (FP) 感到不舒服。我可以先用一些 FP 使用面向对象和程序化,然后在学习时改变比例吗?
  • 工具链成熟度:您对 IDE 和调试器的体验如何?我现在正在使用 Eclipse,看起来还可以。
  • 学习速度:考虑到我的经验,您认为我能以多快的速度使用 Scala 达到可行的水平?
  • 部署:您究竟是如何部署 Scala 程序的?它是一个jar,它是一个可执行文件吗?

最后,您认为 Scalas 的一些缺点是什么?

4

8 回答 8

29
  • 可移植性:至少我希望 Linux 和 Windows。手机呢,有没有人成功让它在那里运行?

是的。Android 上的 Scala 有相当多的变化。至于 J2ME,我在这方面看到了一些东西,但不多。源代码存储库中有一些与 J2ME 相关的代码。我不确定它的可行性,但在我看来,对此的需求并不多。

我还要提到,Scala-Lang 上有一个关于所需目标平台的池,J2ME 就是其中之一,在图腾柱上非常低。

  • C++ 兼容性:我可以将 C++ 代码与 Scala 混合使用吗?(JNI?)

您也可以将 C++ 与 Java 混合使用,无论其价值如何。如果您对此没有任何经验,您可以阅读 Java 资源,因为其中的任何内容都将适用于 Scala,无需更改(Scala 语法除外)。

  • 编程范式:此时切换到 FP 让我感到不舒服。我可以先使用一些 FP 的 OO 和程序,然后在我学习的过程中改变比例吗?

肯定的,是的。Scala 竭尽全力确保您不需要以函数式风格进行编程。事实上,这是函数式人对 Scala 的主要批评:有些人不认为语言是函数式的,除非它迫使程序员以函数式风格编写。

无论如何,您可以按照自己的方式做事。不过,我敢打赌,你会养成功能性习惯,甚至没有意识到它们是功能性的。

也许您可以在我自己的博客中查看有关编写 Matrix 类的矩阵系列。尽管它看起来像标准的 OO 代码,但实际上它非常实用。

  • 工具链成熟度:您对 IDE 和调试器的体验如何?我现在正在使用 Eclipse,看起来还可以。

IDEA (IntelliJ)、NetBeans 和 Eclipse 都对 Scala 有很好的支持。似乎 IDEA 是最好的,而且 NetBeans/Eclipse 一直在相互竞争,尽管最近 NetBeans 肯定比 Eclipse 更稳定。另一方面,对 Eclipse 的支持走的是一条非常有希望的路线,应该会在接下来的 6 个月左右产生结果——只是它是一条颠簸的路线。:-)

Scala 工具在这些环境中的一些有趣迹象是,开发中的 Eclipse 插件使用 AOP 与整个 IDE 更无缝地合并,NetBeans 插件正在用 Scala 完全重写,并且在 IDEA 上有一个 Scala Power Pack除其他外,还支持将 Java 代码转换为 Scala 代码。

EMACS 人员也为 Scala 提供了广泛的工具,并且许多较小的编辑器也支持它。例如,我对 jEdit 对小程序和脚本的支持非常满意。

还有很好的 Maven 支持——事实上,安装Lift的标准方法是安装 maven,然后构建一个 Lift 原型。这将引入适当的 Scala 版本。还有一个scala:cc目标也会触发重新编译。

说到重新编译,Maven,尤其是 Ant 都不能很好地识别需要重新编译的内容。从这个问题中出现了SBT(简单构建工具),它是用 Scala 编写的,它通过使用 Scala 编译器插件解决了这个问题。SBT 使用与 Maven 相同的项目布局以及 Maven/Ivy 存储库,但项目配置是在 Scala 代码而不是 XML 中完成的——同时还支持 Maven/Ivy 配置文件。

  • 学习速度:考虑到我的经验,您认为我能以多快的速度使用 Scala 达到可行的水平?

非常快。作为一种纯粹的 OO 语言,Scala 已经引入了一些不错的特性,可以与 C++ 中存在的一些东西相媲美,但 Java 中没有,尽管它们以不同的方式工作。在这方面,一旦你意识到这些特性的用途并将它们与 C++ 的东西联系起来,你就会远远领先于 Java 程序员,因为你已经知道如何处理它们了。

  • 部署:您究竟是如何部署 Scala 程序的?它是一个jar,它是一个可执行文件吗?

与 Java 相同。您可以部署 JAR、WAR 或任何其他 Java 目标,因为 scala 编译器会生成类文件。实际上,您使用 Java 的 jar 从类文件生成 Scala 的 JAR 文件,并且 Lift 的 Maven 目标支持构建 WAR 文件。

不过,脚本文件还有另一种选择。您可以调用“scala”直接运行Scala 源代码,类似于Perl 的Shell 脚本。它也可以在 Windows 上完成。然而,即使使用编译守护进程来加速执行,启动时间也足够慢,​​以至于在繁重的脚本环境中有效使用 Scala 需要像Nailgun这样的东西。

至于 Scala 的缺点,看看我在这个Stack Overflow 问题中的回答(和其他人的回答)。

于 2009-07-10T14:49:45.527 回答
16

Scala 是一种不断发展的语言,非常值得投资,尤其是如果您来自 Java 世界。Scala 在Artima得到了广泛的介绍。请参阅 Bill Venners 的这篇文章并阅读有关Twitter 和 Scala的文章。

关于你的问题:

  • Java 可以在任何有 JVM 的地方运行。然而,手机没有运气。您需要一个完整的 JRE,而不是那里可用的子集。
  • 这可以通过 JNI 实现。如果 Java 有可能,那么 Scala 也有可能。Scala 可以调用 Java 类。
  • 函数式编程是 Scala 的强项——你确实需要学习它。但是,您也可以在不充分利用它的情况下开始使用它并按照自己的方式使用它。
  • 有一个Eclipse的插件。这不是最好的,但它会完成这项工作。更多细节在这里
  • 如果您有经验,我会说非常快。我建议你找一本书开始。
  • 请参阅此常见问题解答条目以进行部署。
于 2009-07-10T10:43:00.907 回答
6

编程范式:此时切换到 FP 让我感到不舒服。我可以先使用一些 FP 的 OO 和程序,然后在我学习的过程中改变比例吗?

Scala 完全支持命令式编程,编写没有 FP 元素的程序是轻而易举的事(然而,FP 还是有用的,值得学习)。

学习速度:考虑到我的经验,您认为我能以多快的速度使用 Scala 达到可行的水平?

迅速地。Scala 中有许多有趣的特性,对于来自 C++、Java 环境的人来说可能并不熟悉,例如打字系统的一些特性。有人认为,在你了解所有内容之前,在 Scala 中有很多东西要学,这是该语言的一个问题。我不同意。这些功能的存在是该语言的优势。功能越多越好。毕竟,您不必一次全部使用它们,就像您不必购买商店中出售的所有商品一样。

于 2009-07-10T13:43:23.250 回答
5

学习速度:考虑到我的经验,您认为我能以多快的速度使用 Scala 达到可行的水平?

我也来自 C++ 背景,我注意到的一件事是,与 C++ 相比,您将编写更少的代码来完成类似的任务,因此您的学习将加快,因为您将在同一时间段内完成更多工作。这与我在使用 Ruby 时遇到的现象相同。

于 2009-07-10T20:19:22.817 回答
3

实际上——如果我是你——我会学习编程范式而不是语言。当然,您必须学习示例语言来学习范式。了解不同范式的优缺点使您能够从不同的角度看待问题,并使您成为更好的程序员(即使使用您已经知道的语言)。

如果需要,学习一种已知范式的语言是一项相对容易的任务。由于 Scala 是 FP(至少您提到过)并且 C++/Python 是 OOP,所以我想说,它对您来说是一门很好的语言。

于 2009-07-10T10:46:41.913 回答
3

您应该由 Scala 的创建者本人注册本课程。

https://www.coursera.org/course/progfun

于 2012-09-10T16:06:58.597 回答
2

James Strachan(高效的 Java 开源开发人员,针对那些不在循环中的人)在这里对 Scala 进行了有趣的讨论,以及为什么他认为这是从 Java(语言,而不是平台)发展而来的。

Scala 似乎获得了很大的吸引力。我认为这不是昙花一现,目前在我要学习的语言列表中(部分是为了功能方面)

于 2009-07-10T20:21:51.360 回答
0

这是有关 Scala 可学习性的轶事证据。

在我们公司,我们有几个来自 U.Waterloo 的实习生。他们被告知用 Scala 编写;以前从未见过。

他们很快就学会了 Scala 和 Lift。现在他们正在生成 Scala 代码;它可能并不完美,但没有人是完美的。

因此,当您决定采用时,经理不了解 Scala 的事实可能不是最好的论据。

于 2011-11-06T22:56:15.617 回答