我应该学习Scala吗?

时间:2009-07-10 10:34:10

标签: java scala jvm-languages

我是一名经验丰富的C ++程序员,具有普通的Python技能。我首先研究Python的原因是:

  • 获得不同的编程视角(静态与动态,解释与编译等)
  • 增加我可以处理的项目的广度(Python允许我进行Web开发,为Symbian手机开发或敲击快速系统管理脚本)
  • 补充我的C ++技能。

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

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

在查看一些编程语言之后,我认为Scala看起来像个好人: 我喜欢类型推断,它在JVM上运行,因此它应该在JVM可用的任何地方都可用。我还可以在使用它时了解有关函数式编程的更多信息。

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

  • 便携性:Linux和Windows至少我希望如此。那么手机怎么样才能让它在那里运行?
  • C ++兼容性:我可以将C ++代码与Scala混合使用吗? (JNI?)
  • 编程范例:我觉得此时切换到函数式编程(FP)并不舒服。我可以先使用面向对象的程序和程序,然后在我学习时改变比例吗?
  • 工具链成熟度:您对IDE和调试器的体验如何?我现在正在使用Eclipse,似乎没问题。
  • 学习速度:考虑到我的经验,您认为我能用Scala达到可行水平的速度有多快?
  • 部署:您如何部署Scala计划?它是一个罐子,是可执行文件吗?

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

8 个答案:

答案 0 :(得分:28)

  • 便携性:Linux和Windows至少我希望如此。手机怎么样,有没有人成功让它在那里运行?

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

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

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

除了可以将C ++与Java混合使用之外。如果您对此没有任何经验,则可以只读取Java资源,因为其中的任何内容都适用于Scala而不进行任何更改(除了Scala语法)。

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

当然,是的。 Scala不用这样就确保你不需要以函数式编程。这是功能人员对Scala的主要批评,事实上:有些人认为语言不起作用,除非它迫使程序员以函数式写作。

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

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

  • 工具链成熟度:您对IDE和调试器的体验如何?我现在正在使用Eclipse,似乎没问题。

IDEA(IntelliJ),NetBeans和Eclipse都对Scala有很好的支持。似乎IDEA是最好的,NetBeans / Eclipse相互之间保持着相互跳跃,尽管NetBeans最近比Eclipse更稳定。另一方面,对Eclipse的支持正走在一条非常有前景的路线上,该路线将在未来6个月左右产生结果 - 这只是一条磕磕绊绊的路线。 : - )

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

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

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

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

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

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

  • 部署:您如何部署Scala计划?它是一个罐子,是可执行文件吗?

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

但是有一个脚本文件的替代方案。您可以调用“scala”直接运行Scala源代码,类似于Perl of Shell脚本。它也可以在Windows上完成。但是,即使使用编译守护程序来加快执行速度,启动时间也足够慢,​​以至于在繁重的脚本环境中有效使用Scala需要Nailgun之类的内容。

至于Scala的缺点,请查看this Stack Overflow问题中的答案(和其他答案)。

答案 1 :(得分:16)

Scala是一种非常值得投资的不断发展的语言,特别是如果您来自Java世界。 Scala在Artima被广泛报道。请参阅Bill Venners的article,并阅读Twitter and Scal a。

关于你的问题:

  • 只要有JVM,Java就可以运行。然而,手机没有运气。您需要一个完整的JRE,而不是那里可用的子集。
  • JNI可以做到这一点。如果Java可以实现某些功能,那么Scala就可以实现。 Scala可以调用Java类。
  • 功能编程是Scala的一个重点 - 你需要学习它。但是你也可以在不充分利用它的情况下开始使用它并按照自己的方式使用它。
  • 有一个Eclipse的插件。这不是最好的,但它会完成这项工作。更多详情here
  • 如果你有经验,我会说真的很快。我建议您先找一本书。
  • 请参阅此faq条目以进行部署。

答案 2 :(得分:6)

  

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

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

  

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

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

答案 3 :(得分:5)

  

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

我也来自C ++背景,有一点我注意到,因为与C ++相比,你可以编写更少的代码用于同类任务,你的学习将会加快,因为你会在同一时间内完成更多工作。这与我在Ruby中遇到的现象相同。

答案 4 :(得分:3)

实际上 - 如果我是你 - 我会学习编程范式而不是语言。当然,您必须学习一种示例语言来研究范式。了解其缺点&不同范例的好处使您能够从不同的角度查看问题并使您成为更好的程序员(即使是您已经掌握的语言)。

如果需要的话,挑选一种已知范式的语言是一项相对简单的任务。由于Scala是FP(至少你提到它)而C ++ / Python是OOP,所以它是一种很好的语言,我会说。

答案 5 :(得分:3)

你应该由Scala的创造者自己注册这门课程。

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

答案 6 :(得分:2)

James Strachan(高效的Java开源开发人员,对于那些不在循环中的人)对Scala here进行了有趣的讨论,以及为什么他认为这是Java(langauge,而不是平台)的进展。 / p> 斯卡拉看起来正在获得很大的吸引力。我不认为这是一个闪光灯,目前在我的语言列表中学习(部分用于功能方面)

答案 7 :(得分:0)

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

在我们公司,我们有几位来自U.Waterloo的实习生。他们被告知要用Scala写作;从来没有见过它。

他们非常快地拿起Scala和Lift;现在他们正在制作Scala代码;它可能并不完美,但没有人是完美的。

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