理解Scala开发工具

15

生态系统中有很多开发工具和术语,例如:语言服务器、构建服务器、Metals、BSP、LSP、Bloop、Zinc、Coursier、增量编译器、展示编译器等。

我想知道是否有人能够演示它们如何组合使用,并简要解释它们之间的关系和差异。特别是我希望有一个类似于Making sense of Scala FP Libraries的图表和答案。例如,这是我的尝试。

(Concept)                       (Example implementation)
--------------------------------------------------------------------
IDE                             Visual Studio Code
 |                               |
Scala IDE plugin                Metals Visual Studio Extension
 |                               |
Language Server Protocol        Microsoft LSP
 |                               |
Scala language server           Metals
 |                               |
Build Server Protocol           BSP from JetBrains and Scala Center
 |                               |
Scala build server              Bloop
 |                               |
Build tool                      sbt
 |                               |
Dependency resolution           Coursier
 |                               |
Incremental compiler            Zinc
 |                               |
Presentation compiler           parser and typer phases of scalac
 |                               |
Bytecode generation             remaining compiler phases

实际目标是什么?还是只是出于好奇心?我使用Grade构建它,使用IntelliJ + scala插件进行编辑。目前还不需要太关注其他方面。 - bobah
@bobah 正在尝试理解组成元素如何相互配合。 - Mario Galic
1个回答

22
Intellij和Scala IDE都是为了进行“智能”开发而设计的,编辑器可以告诉你代码是否正确,建议修正错误,自动生成一些代码,提供代码导航、重构等功能。这些功能远远超出了简单的文本编辑,可能只有语法高亮。
Intellij有一个Scala扩展,利用了他们自己重新实现的Scala编译器,这样即使代码的一部分无效,也能实现更好的部分编译和智能感知。通过从其他构建工具(例如sbt或bloop)导入构建定义,然后Intellij不依赖于任何外部工具(除非您使用某些选项如“使用sbt进行构建”)。
Scala IDE依赖于Scala演示编译器来实现智能感知。正如您在scala-ide.org上所读到的:
“Eclipse的Scala IDE使用Scala Presentation Compiler,这是Scala编译器的更快的异步版本。 演示编译器仅运行直到并包括类型检查器阶段为止,即27个Scala编译阶段中的前4个。 IDE使用演示编译器提供语义特性,例如实时错误标记、推断类型悬停和语义高亮。 本文介绍了您需要了解的关键类,以便了解Scala IDE如何使用演示编译器,并提供IDE和演示编译器之间交互的一些示例。”

每个其他的编辑器/集成开发环境都打算使用语言服务器协议 - LSP是微软发明的一种标准化方式,用于在不同的编辑器中支持语言(尽管他们是为了VS Code而发明它),使它们能够提供集成开发环境功能。Metals (来自Scala Meta Language Server) 是Scala的LSP实现。正如您可以在此处所读到的:

  

代码完成、点上类型和参数提示是使用Scala演示编译器实现的, 由Lightbend的Scala编译器团队维护。

您可以使用Scala Metals扩展将其添加到VS Code中。

sbt、gradle、mill、fury、cbt等都是构建工具,它们使用像ivy2或coursier这样的工具来解决和下载依赖项,并使用Zinc增量编译器来提供与普通编译器相同的增量(重新)构建能力。构建工具可以运行测试、生成构件并将其部署到存储库。

bloop是一个解决编译速度取决于JVM状态的问题的方案。每次关闭构建工具/IDE时,JVM都会变得“冷却”。因此,您可以使用nailgun来保持某些JVM处于“热启动”状态,并在后台运行构建任务。bloop本身无法生成配置文件,通常应由其他构建工具生成以加速开发中的编译。与在后台运行的bloop服务器通信的协议是构建服务器协议(BSP)。

Coursier主要用于依赖项解析,还可用于安装Scala程序。其中一些值得注意的程序包括:

  • scalafmt-Scala格式化程序
  • ammonite-替代REPL,提供许多不错的功能
  • scalafix-代码重写工具,用于提供自动代码迁移

我放弃了使用表格来描述内容,因为它更适合在图形上展示,但由于SO不支持视觉效果,所以我只能采用纯文本。


非常好的回答:我只是找不到IntelliJ演示编译器的源代码,无论在他们的OSS存储库中还是其他地方。我怀疑它现在已经相当过时了。 - tribbloid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接