我应该学习Scala吗?[已关闭]

2022-09-01 10:30:13

我是一名经验丰富的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 程序?它是一个罐子,它是一个可执行文件吗?

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


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

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

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

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

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

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

当然,是的。Scala不遗余力地确保你不需要以功能风格编程。事实上,这是来自函数式人员对Scala的主要批评:有些人不认为语言是函数式的,除非它迫使程序员以函数式风格编写。

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

也许你可以在我自己的博客中查看关于编写矩阵类的矩阵系列。尽管它看起来像标准的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,特别是蚂蚁,在确定需要重新编译的内容方面都没有做得很好。从这个问题萌芽SBT(简单构建工具),用Scala编写,它通过使用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的缺点,看看我在这个Stack Overflow问题中的答案(以及其他答案)。


答案 2

Scala是一种不断发展的语言,非常值得投资,特别是如果你来自Java世界。Scala在Artima被广泛覆盖。请参阅Bill Venners的这篇文章,并阅读有关Twitter和Scala的信息。

关于您的问题:

  • Java可以在任何有JVM的地方运行。然而,手机没有运气。您需要一个完整的 JRE,而不是那里可用的子集。
  • 这可以通过JNI实现。如果Java可以实现某些事情,那么Scala也可以。Scala可以调用Java类。
  • 函数式编程是Scala的一个强项 —— 你确实需要学习它。但是,您也可以在不充分利用它的情况下开始使用它,并按照自己的方式使用它。
  • Eclipse 有一个插件。这不是最好的,但它会完成这项工作。更多详细信息请点击此处
  • 如果你经验丰富,我会说真的很快。我建议你找一本书开始。
  • 有关部署,请参阅此常见问题解答条目。

推荐