Осмысление инструментов разработки Scala

В экосистеме существует множество инструментов и терминов разработки, например, языковой сервер, сервер сборки, Metals, BSP, LSP, Bloop, Zinc, Coursier, инкрементный компилятор, компилятор презентаций и т. Д.

Мне было интересно, может ли кто-нибудь продемонстрировать, как они подходят друг другу, и кратко объяснить отношения и различия. В частности, я надеюсь получить диаграмму и ответ в духе " Осмысление библиотек Scala FP". Например, вот моя попытка

(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

1 ответ

Решение

IDE, такие как Intellij или (однажды) Scala IDE, предназначены для "умной" разработки, когда редактор сообщает вам, правильный ли ваш код, предлагает исправления, автоматически генерирует некоторый код, обеспечивает навигацию по коду, рефакторинг - другими словами, многие функции, которые расширяются. помимо простого текстового издания, возможно, только с подсветкой синтаксиса

У Intellij есть расширение Scala, которое использует их собственную реализацию компилятора Scala - им это нужно для лучшей частичной компиляции и работы intellisense, даже если часть кода сломана. Определение сборки импорта из другого инструмента сборки (например, sbt или bloop), и с этого момента Intellij не отвечает ни на что внешнее (если вы не используете какую-либо опцию, например "build with sbt").

В Scala IDE используется компилятор представлений Scala для intellisense. Как вы можете прочитать на scala-ide.org:

Scala IDE для Eclipse использует компилятор представления Scala, более быструю асинхронную версию компилятора Scala. Компилятор представления выполняет только фазы вплоть до фазы typer, то есть первых 4 из 27 фаз компиляции scala. Среда IDE использует компилятор представления для предоставления семантических функций, таких как маркеры ошибок в реальном времени, наведение предполагаемого типа и семантическое выделение. В этом документе описаны ключевые классы, которые необходимо знать, чтобы понять, как Scala IDE использует компилятор представления, и приведены некоторые примеры взаимодействия между IDE и компилятором представления.

Любой другой редактор /IDE предназначен для использования протокола языкового сервера - LSP - это изобретение Microsoft, чтобы стандартизировать способ поддержки языков в разных редакторах (хотя они изобрели его ради VS Code), который позволил бы им предоставлять функции IDE. Металлы (от ScalaMeta L anguage S ERVER) является реализация ЛСП для Scala. Как вы можете прочитать здесь:

Завершение кода, тип в точке и подсказки параметров реализованы с помощью компилятора представления Scala, который поддерживается командой компилятора Scala в Lightbend.

Вы можете добавить его в VS Code с помощью расширения Scala Metals.

sbt, gradle, mill, fury, cbt и т. д. - это инструменты сборки, которые используют что-то вроде ivy2 или Coursier для разрешения и загрузки зависимостей, а затем используют инкрементный компилятор Zinc, чтобы предоставить возможность (пере) строить вещи постепенно до обычного компилятора. Инструменты сборки могут запускать тесты, создавать артефакты и развертывать их в репозитории.

bloop - это решение проблемы, заключающейся в том, что компиляция выполняется быстро, если JVM горячая, а JVM становится холодной каждый раз, когда вы убиваете свой инструмент сборки /IDE. По этой причине вы используете nailgun, чтобы поддерживать некоторую JVM в тепле, выполняя задачи сборки в фоновом режиме. Сам по себе bloop не может генерировать конфигурацию, и, как правило, это то, что должно генерироваться другим инструментом сборки, чтобы ускорить компиляцию во время разработки. Протокол, используемый для связи с сервером bloop, работающим в фоновом режиме, - это протокол сервера сборки (bsp).

Хотя Coursier используется в основном для разрешения зависимостей, его также можно использовать для установки программ Scala. Некоторые из примечательных программ, которые вы можете установить:

  • scalafmt - программа форматирования Scala
  • аммонит - альтернатива REPL scala который предоставляет множество приятных функций
  • scalafix - инструмент для переписывания кода, который используется для обеспечения автоматической миграции кода

Я отказался от описания вещей в таблице, так как это было бы намного лучше показать на графике, но поскольку SO не поддерживает эти визуальные эффекты, я просто прибег к простому тексту.

Другие вопросы по тегам