13

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

我想知道是否有人可以展示它们如何组合在一起并简要解释关系和差异。具体来说,我希望有一个图表并按照Make 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
4

1 回答 1

20

像 Intellij 或(曾经)Scala IDE 这样的 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 和演示编译器之间交互的示例。

每个其他编辑器/IDE 都旨在使用语言服务器协议 - LSP 是 Microsoft 的发明,目的是标准化一种在不同编辑器中支持语言的方式(尽管他们发明它是为了 VS Code),这将允许它们提供 IDE 功能。Metals(来自 Scala Meta L anguage S erver)是 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,scala它提供了许多不错的功能
  • scalafix - 用于提供自动代码迁移的代码重写工具

我放弃了在表格中描述事物,因为它会更好地显示在图表上,但由于 SO 不支持这种视觉效果,我只是求助于纯文本。

于 2020-04-11T12:00:08.283 回答