我应该学习Scala吗?

31

我是一名有丰富C++编程经验但Python技能中等的程序员。我学习Python的原因如下:

  • 为了获得不同的编程视角(静态与动态、解释性与编译性等)
  • 为了扩展我可以处理的项目范围(Python可以进行Web开发,开发Symbian手机应用程序或快速编写系统管理员脚本)
  • 为了补充我的C++技能。

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

但我怀疑我不能用它来进行中大型项目。虽然动态类型很方便,但它允许某些我认为令人不安的错误出现。单元测试和代码检查可以减轻此问题,但静态类型完全消除了这个问题。

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

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

  • 可移植性:至少在Linux和Windows上应该可以。那么对于手机呢?能否让它在手机上运行?
  • C++兼容性:我能否将C++代码与Scala混合使用?(JNI?)
  • 编程范式:我目前不感到舒服切换到函数式编程(FP)。我可以先使用面向对象和过程式编程,然后随着学习的深入改变比例吗?
  • 工具链成熟度:你对IDE和调试器有什么经验?我现在正在使用Eclipse,感觉还不错。
  • 学习速度:考虑到我的经验,你认为我可以多快达到可以使用Scala的水平?
  • 部署:如何准确地部署Scala程序?是一个jar文件还是可执行文件?

最后,你认为Scala有哪些缺点?


2
书籍:Scala编程,马丁·奥德斯基等著,Artima出版社,2007年。 - akarnokd
感谢各位的答案和建议。我决定更深入地了解Scala。 - rpg
对我来说最好的书是Cay Horstmann所著的《Scala for the Impatient》。前9章节可以免费获取。 - Jabba
8个回答

28
  • 可移植性:至少要支持Linux和Windows。那么对于手机呢?有人成功地在手机上运行过吗?

是的。Scala在Android上有相当多的动态。至于J2ME,我看到了一些相关的内容,但并不多。源代码库中有一些与J2ME相关的代码。我不确定它有多可行,但在我看来,似乎没有太多的需求。

我还要提到,在Scala-Lang上有一个关于期望目标平台的调查,其中J2ME是其中之一,但非常低。

  • C++兼容性:我能在Scala中混合使用C++代码吗?(JNI?)

就像你可以将C++与Java混合使用一样,这也是值得注意的。如果你没有任何经验,你可以阅读Java资源,因为其中的任何内容都适用于Scala,不需要进行任何更改(除了Scala语法)。

  • 编程范式:我现在不想切换到FP。我能一开始使用面向对象和过程化编程,然后随着学习而改变比例吗?

绝对可以。Scala竭尽全力确保您无需以函数式风格编程。事实上,这是来自函数式人士的主要批评:某些人认为,除非强制程序员以函数式风格编写代码,否则一种语言不应被视为函数式。

无论如何,您可以按照自己的方式继续做事情。但我打赌,您会在不知不觉中养成函数式的习惯。

也许你可以看一下我自己博客中关于编写矩阵类的Matrices系列。尽管它看起来像标准的面向对象代码,但实际上它非常函数化。

  • 工具链成熟度:你对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都不能很好地识别需要重新编译的内容。因此,Scala编写的SBT(Simple Build Tool)应运而生,通过使用Scala编译器插件解决了这个问题。SBT使用与Maven相同的项目布局以及Maven/Ivy存储库,但项目配置是在Scala代码中完成的,而不是XML——同时支持Maven/Ivy配置文件。

  • 学习速度:根据我的经验,您认为我可以多快达到可用的Scala水平?

非常快。作为一种纯面向对象的语言,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的缺点,请参阅我在this Stack Overflow问题中的回答(以及其他人的回答)。


16

Scala是一种不断发展的语言,特别适合那些来自Java世界的人进行投资。Scala在Artima上有广泛的涵盖。请参阅Bill Venners的文章,并了解有关Twitter和Scala的信息。

关于您的问题:

  • Java可以在任何有JVM的地方运行,但手机不适用。您需要完整的JRE,而不是手机可用的子集。
  • 这可以通过JNI实现。如果Java可以实现某事,则Scala也可以实现。Scala可以调用Java类。
  • 函数式编程是Scala的强项 - 您确实需要学习它。但是,您也可以在不充分利用它的情况下开始使用它,并逐步掌握。
  • 有一个Eclipse插件。它不是最好的,但可以胜任工作。更多细节请参见此处
  • 如果您有经验,我会说非常快。我建议您找一本书开始阅读。
  • 有关部署,请参见此FAQ条目。

5
额外补充一点:似乎可以在Android上运行Scala:http://www.scala-lang.org/node/160 - Fabian Steeg

6
编程范式:我不想立刻转向FP,我能首先使用面向对象和过程化编程,然后再学习并逐步改变比例吗?
Scala完全支持命令式编程,没有FP元素的程序编写起来很容易(然而,学习FP仍然是很有用的,而且值得学习)。
学习速度:考虑到我的经验,你觉得我可以多快达到Scala可用的水平?
很快。Scala有许多有趣的功能,对于那些来自C++、Java环境的人来说可能不太熟悉,例如类型系统的一些特性。有人认为在了解全部Scala之前需要学习很多内容是该语言的一个问题;我不同意。这些特性的存在是该语言的一个优点。功能越多越好。毕竟,你不必一次使用它们所有,就像你不必购买商店里出售的所有物品一样。

5

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

我也有C++背景,我注意到一件事情,就是与C++相比,当你完成一个相似的任务时,你需要编写的代码会少很多,因此你的学习速度会加快,因为你可以在同样的时间内完成更多的工作。这也是我在学习Ruby时经历过的现象。


3

实际上,如果是我,我会学习编程范式而不是单纯的语言。当然,为了学习一个范式,你必须学习一个示例语言。了解不同范式的优点和缺点可以让你从另一个角度看待问题,并使你成为更好的程序员(即使在你已经知道的语言中)。

如果需要学习一个已知范式的语言,那么选择一门语言相对容易。既然Scala是FP(至少你提到过),而C++/Python是OOP,那么我认为这是个不错的选择。


3

2
詹姆斯·斯特拉彻(对于那些不在行业内的人来说,他是一个高产的Java开源开发者)在这里有一个有趣的关于Scala的讨论,以及为什么他认为它是从Java(语言,而不是平台)进化而来。
Scala看起来正在获得很多关注。我认为它不是昙花一现,目前已经在我的学习语言列表中(部分原因是因为它具有函数式方面)。

0

以下是有关Scala可学性的轶事证据。

在我们公司,我们招聘了几名来自滑铁卢大学的实习生。他们被告知要用Scala编写代码,但以前从未接触过。

他们非常快地掌握了Scala和Lift;现在他们正在编写Scala代码;可能不完美,但没有人是完美的。

因此,当您决定采用Scala时,经理不知道Scala可能不是最好的论据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接