2022-08-29 19:24:27 +08:00
<TeXmacs|2.1.3>
2022-06-23 15:37:47 +08:00
<style|<tuple|generic|chinese>>
<\body>
2022-08-29 19:24:27 +08:00
<doc-data|<doc-title|为什么说Scala是JVM上的C++?>|<doc-author|<author-data|<author-name|沈浪熊猫儿>>>>
2022-06-23 15:37:47 +08:00
2022-08-29 19:24:27 +08:00
<section*|问题原文>
2022-06-23 15:37:47 +08:00
<\quote-env>
2022-08-29 19:24:27 +08:00
如题。以及请大家分析下未来静态语言的主流, C++、java、scala三门语言未来的发展方向
2022-06-23 15:37:47 +08:00
</quote-env>
2022-08-29 19:24:27 +08:00
<section*|我的回答>
2022-06-23 15:37:47 +08:00
2022-08-29 19:24:27 +08:00
<subsection*|为什么说Scala是JVM上的C++?>
2022-06-23 15:37:47 +08:00
2022-08-29 19:24:27 +08:00
不知道是谁说Scala是JVM上的C++。这种没有具体展开的话,大概和网上盛传的各种马云语录,比如
2022-06-23 15:37:47 +08:00
<\quote-env>
2022-08-29 19:24:27 +08:00
刚毕业的年轻人应该在一家公司待满五年
2022-06-23 15:37:47 +08:00
</quote-env>
2022-08-29 19:24:27 +08:00
一样没有实际的意义。
2022-06-23 15:37:47 +08:00
2022-08-29 19:24:27 +08:00
把Scala和C++放在一起对比的朋友, 大概说的是特性多、杂这个特点。最初学习Scala的时候, 大致把知乎上关于Scala的问答都浏览了一遍。目前印象最深的还是这个问题中
@阅千人而惜知己 的观点。
2022-06-23 15:37:47 +08:00
2022-08-29 19:24:27 +08:00
后来翻译完《Scala实用指南》在写序的时候, 我把千人的观点浓缩成了一句话:
2022-06-23 15:37:47 +08:00
<\quote-env>
2022-08-29 19:24:27 +08:00
Scala的美在于精巧的内核, Scala的丑陋在于复杂的实现。
2022-06-23 15:37:47 +08:00
</quote-env>
2022-08-29 19:24:27 +08:00
至于C++, 我觉得它的复杂程度更甚于Scala。我目前在维护的C++项目GNU
TeXmacs, C++的代码行数在20万这个量级, 项目的作者是一个法国数学家(Joris
van der Hoeven), 从90年代至今, 至少已经有20年的历史了。这个项目对于C++的态度就是非常审慎的, 没有用C++的标准库( 或许90年代的时候C++标准库的口碑很差) , 像hashmap、list、string这些容器都是自己实现的, 内存管理也是自己实现, 大家有兴趣可以点击文末的链接, 看一下GNU
TeXmacs的豆瓣小组组长做的一些源代码分析。个人对这些自己实现的容器是不信任的, 所以最近在逐行Review, 添加单元测试, 并做性能测试。
2022-06-23 15:37:47 +08:00
2022-08-29 19:24:27 +08:00
前段时间咨询Joris, 主要是想用一些handy的C++新特性( 已经在单元测试和Benchmark代码中使用) , 比如auto, Joris和其他的维护者是反对的。其实我也是反对使用绝大部分C++的新特性, 比如函数式编程的支持, 从语法上就比Scala差了很多, 另外, 在具体的实现上, 我也是不信任C++编译器的。对于一个比较大型的代码仓库, 其实很容易就遇到一些编译器的BUG。为了避免把时间浪费在一些无关紧要的细节上, 聪明的工程师应该懂得取舍。
2022-06-23 15:37:47 +08:00
2022-08-29 19:24:27 +08:00
<subsection*|C++、Java、Scala三门语言未来的发展动向>
2022-06-23 15:37:47 +08:00
2022-08-29 19:24:27 +08:00
语言也是一个工程。一门语言的未来其实要看这门语言的工程项目的发展,和整体生态的发展。
2022-06-23 15:37:47 +08:00
2022-08-29 19:24:27 +08:00
<strong|从项目管理的角度>, Scala未来的发展不可限量。Scala项目的一切都已经在Github上了, 对于开发者来说, 在Github上给Scala标准库和编译器提交代码实际上变成了一件门槛比较低的事情。
@杨博 很早之前就开始给Scala项目做贡献。我是最近在给Spark做Scala
2.12支持的时候, 顺手给Scala项目修了一个bug。最近, 在CSUG微信群里面, 我鼓吹一个观点: 给Scala项目做贡献实际上非常简单的。然后,
@Uncle Kevin 和 @何品 也开始给Scala提PR。虽然我们目前做的贡献都是非常Trivial的, 但是不可否认, 给Scala项目做贡献, 比给C++和Java做贡献要方便简单很多。这些老派的编程语言, 在源代码管理和开发者社区建设这点上做得这么差劲, 其发展自然没有新兴的语言快。( 注: 我和Uncle
Kevin应该都是2016年之后才正式开始学习Scala的)
2022-06-23 15:37:47 +08:00
2022-08-29 19:24:27 +08:00
<strong|至于生态>, Java和Scala是绑定在一块的。C++我就呵呵哒了。在阿里云实习的时候, 看到工程师们为了追求极限的性能和极少资源消耗, 日志的收集竟然也是用C++写的( 兼容Linux和Windows) , 线上的环境比较复杂, 这个日志收集程序把所有依赖的代码都放到了同一个工程中管理, 包含Boost和Kafka的C
Binding等, 我直接导入代码, KDevelop就崩溃了。可能对于那位骨灰级的C++玩家, 这很简单, 而且非常方便, 看到Boost里面有bug就顺手修了。但是从代码复用的角度, JVM生态是完胜的。
2022-06-23 15:37:47 +08:00
2022-08-29 19:24:27 +08:00
最后, GraalVM已经横空出世很久了, polyglot不再是空中楼阁, 可以畅想, 十年之后软件开发可以多么愉悦。而ScalaJS、Scala
Native到那时候想必已经打磨得差不多了。未来, Scala程序员完全可以全栈, Scala实现的、通用的、抽象的Library完全可以跨平台使用。然而, 未来的程序员, 或许仍然无法逃离Java
API、C POSIX API和JavaScript的魔咒。
2022-06-23 15:37:47 +08:00
\;
</body>
<\initial>
<\collection>
<associate|page-medium|papyrus>
<associate|prog-scripts|python>
</collection>
</initial>
<\references>
<\collection>
<associate|auto-1|<tuple|?|?|../../../../.Xmacs/texts/scratch/no_name_21.tm>>
<associate|auto-2|<tuple|?|?|../../../../.Xmacs/texts/scratch/no_name_21.tm>>
<associate|auto-3|<tuple|?|?|../../../../.Xmacs/texts/scratch/no_name_21.tm>>
<associate|auto-4|<tuple|?|?|../../../../.Xmacs/texts/scratch/no_name_21.tm>>
<associate|auto-7|<tuple|1|?|../../../../.Xmacs/texts/scratch/no_name_21.tm>>
</collection>
</references>