我是一名经验丰富的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的一些缺点是什么?
可移植性: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中被完全重写,并且IDEA上有一个Scala Power Pack除其他外,支持将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的缺点,来看看我的回答(和其他的)这个堆栈溢出问题.
Scala是一种非常值得投资的不断发展的语言,特别是如果您来自Java世界.Scala被Artima广泛报道.请参阅Bill Venners的这篇文章,并阅读有关Twitter和Scal的文章.
关于你的问题:
Java可以在有JVM的任何地方运行.然而,手机没有运气.您需要一个完整的JRE,而不是那里可用的子集.
这可以通过JNI实现.如果Java可以实现某些功能,那么Scala就可以实现.Scala可以调用Java类.
函数式编程是Scala的一个重点 - 你需要学习它.但是,您也可以在不充分利用它的情况下开始使用它并按照它自己的方式工作.
有一个Eclipse的插件.这不是最好的,但它会完成这项工作.更多细节在这里.
如果你有经验,我会说真的很快.我建议您先找一本书.
请参阅此faq条目以进行部署.
编程范例:此时切换到FP我感觉不舒服.我可以先使用OO和一些FP程序,然后根据我的学习改变比例吗?
Scala完全支持命令式编程,编写没有FP元素的程序是一件轻而易举的事情(然而,FP很有用,无论如何都值得学习).
学习速度:考虑到我的经验,您认为我能用Scala达到可行水平的速度有多快?
很快.Scala中有许多有趣的功能,对于来自C++,Java环境的人来说可能并不熟悉,比如打字系统的某些功能.有些人认为,在您了解Scala之前需要学习很多内容的事实是语言问题 ; 我不同意.这些功能的存在是该语言的优势.越多越有特色了.毕竟,您不必一次性使用它们,就像您不必购买商店中出售的所有商品一样.
学习速度:考虑到我的经验,您认为我能用Scala达到可行水平的速度有多快?
我也来自C++背景,有一件事我注意到,因为与C++相比,你可以编写更少的代码用于类似的任务,你的学习将加快,因为你将在同一时期完成更多工作.这与我在Ruby中遇到的现象相同.