Scala.js 是一款将 Scala 代码编译为 JavaScript 代码的编译器,其支持全部 Scala 的语言特性。值十周年之际,官方回顾了这款编译器的从零到有,从一开始的不可能到已是一项成熟的技术。
原文链接:https://www.scala-lang.org/blog-detail/2023/02/05/ten-years-of-scala-js.html
作者 | Sébastien Doeraene
译者 | 弯月 责编 | 屠敏
出品 | CSDN(ID:CSDNnews)
以下为译文:
十年前,2013年2月5日是我们团队第一次提交 Scala.js 的日子。刚开始的时候,将 Scala 编译成 JavaScript 只是一个梦想。而如今这已成为现实。Scala.js 是一项成熟的技术,具有坚如磐石的核心、充满活力的专用库生态系统以及热情的用户及贡献者社区。
在十周年之际,我想回顾一下 Scala.js 的整个发展经历。
一切的开始
当年我们刚开始开发 Scala.js,它还是 EPFL LAMP(Martin Odersky 领导的研究实验室)的一个单人项目。
从 Scala 生成 JavaScript 并不是一个新想法。LAMP(Scala+GWT、JS Scala)和社区(s2js、JScala)已经进行了多次这样的尝试。在当时看来这几乎是一个不可能完成的任务,而这也成为了我们启动这个项目的动力。
2013 年 6 月,Scala.js 在 Scala Days 上首次亮相就收到了热烈欢迎,尽管当时只输出了一个 16 MB 的“Hello world”。一小群早期的爱好者开始注册邮件列表,就他们喜欢的项目展开了交流,为项目提供了珍贵的早期反馈。很快,一个单人小项目就成长为以两人为核心的团队,还有几十位热心粉丝。
坚实的基础
2013 年 11 月,版本 0.1 来了,并确立了Scala.js 的基本设计目标:
- 与 JavaScript 的互操作性:能够直接表示和操作 JavaScript 值,就像它们是 Scala.js 的值一样。
- 与 Scala/JVM 的可移植性:尽可能准确地将 Scala/JVM 的语义编译为 JavaScript,无需为互操作性而做出太多妥协。
- 与 IDE、构建工具以及其他工具的兼容性:每个有效的 Scala.js 程序都必须经过类型检查,就像有效的 Scala/JVM 程序一样,不需要区别使用工具。
如今,这些核心设计目标仍然支配着 Scala.js 发展的总体决策。2014 年的 0.5.x 版本多加了一个额外的目标,即良好的运行时性能。我们也尝试尽可能所见生成的代码量,但上述核心设计目标优先。
为了保证这些目标,Scala.js 项目就质量和稳定制定了严格的标准。
Scala.js 是 Scala 生态系统中首批注重向后二进制兼容性的大型项目之一(其他项目还有 Akka 和 sbt)。版本 0.6.0 是版本 1 的垫脚石,预期生命周期为 6 个月。然而,这个版本在发展的过程中保持向后二进制兼容长达 5 年之久,终于在 2020 年 2 月 Scala.js 1.0.0 发布后功成身退。
有了如此长的兼容期,Scala.js 的生命周期最终都会超过底层的 Scala 版本。最近,我们放弃了 5 年前就宣布停产的 Scala 2.11 的支持。具有讽刺意味的是,根据 Scala.js 问题跟踪器的统计,迄今为止征集停止支持 Scala 2.11 的问题收获了最多的好评,它收到了100多个赞。
由于过硬的代码质量和测试要求,Scala.js 被称为坚如磐石。自 2021 年 8 月 Scala.js 1.7.0 发布以来,每个版本的已知错误数量都为零,包括整个核心存储库:编译器后端和链接器、Scala.js 特定的语言功能、Scala.js 标准库以及 JDK 的部分实现。
这个坚实的基础由核心团队维护,但这只是 Scala.js 成功的一部分。
充满活力的社区
Scala.js 有今天的成就,离不开所有为生态系统做出过贡献的用户。社区和生态系统开展的主要活动包括编写库、开发工具、开展演讲以及通过 StackOverflow、Gitter 和现在的 Discord 为 Scala.js 的其他用户直接提供帮助。
前两年,现有 Scala 生态系统的大多数库都不支持 Scala.js。一些用户使用 Scala.js 构建了第一批库和测试框架。随着 Scala.js 的发展成熟,我们需要更好地支持交叉编译库。因此,我们在 Scala.js 0.6.0 中添加了 crossProject 的概念。
从那以后,随着 Scala.js 0.6.0 宣布试验阶段结束,Scala.js 的采用率大幅上涨。特别是,Scala 生态系统中越来越多的库开始支持 Scala.js。拉取请求主要来自 Scala.js 用户,但维护人员选择接受这些拉取请求,以及随之而来的维护负担。作为 Scala.js 的维护者,我们只能尽量减轻支持交叉构建的难度。我们万分感谢库维护者提供的支持。如今,大多数非专门针对 JVM-only 特性的库都是为 Scala/JVM 和 Scala.js 交叉发布的。
与此同时,Scala.js 用户尝试了 UI 库的最佳设计。虽然新的设计仍在探索中,但有一些库已经在社区中站稳了脚跟。在此,我们建议将 Laminar 作为 Scala-only 默认选择。对于喜欢 React 的用户来说,Slinky 和 scalajs-react 是流行的替代方案。
此外,还有许多其他类型的贡献,我们无法在此一一列举。
当前的发展状况
如今,Scala.js 已成为一门成熟的语言和生态系统。我们估计已有数十万开发人员在使用。Jetbrains 开发者生态系统 2022 调查报告以及 Scala 2022 现状调查报告统计了 Scala 开发者中使用 Scala.js 的用户,分别为 12% 和 17%。Maven Central 统计报告称,核心组件每月的下载量超过 10 万次。
Scala.js 的成功远远超出了我们十年前的想象。核心团队努力构建扎实的基础,同时用户和贡献者社区才是成功的真正源泉。再次感谢所有为我们的生态系统做出过贡献的每一个人。我们期待与您携手,共同缔造 Scala.js 的下一个十年。
4000520066 欢迎批评指正
All Rights Reserved 新浪公司 版权所有