Открыть сервис

LSP: протокол языкового сервера

LSP (от англ. Language Server Protocol) — открытый протокол на основе JSON-RPC, определяющий формат взаимодействия между текстовым редактором или интегрированной средой разработки (IDE) и сервером, предоставляющим функции анализа и обработки исходного кода конкретного языка программирования. Протокол был разработан компанией Microsoft в 2016 году для унификации механизмов поддержки языков в редакторе Visual Studio Code, после чего получил широкое распространение в других редакторах.

История

До появления LSP каждый текстовый редактор, поддерживающий автодополнение, переход к определению или проверку синтаксиса, должен был иметь собственную реализацию интеграции с каждым конкретным языком. Для поддержки N языков в M редакторах требовалось создать N×M модулей. Такая схема приводила к дублированию работы и неравномерному качеству поддержки: популярные языки имели богатые плагины, тогда как редкие оставались без инструментов.

В 2015 году команда Visual Studio Code под руководством Эриха Гаммы (одного из авторов книги «Приёмы объектно-ориентированного проектирования») начала работу над архитектурой, разделяющей редактор и языковую логику. Логика выносилась в отдельный процесс — языковой сервер, который общался с редактором по стандартизированному протоколу. В июне 2016 года спецификация LSP была представлена публично, а к концу года протокол поддержали редакторы Vim, Emacs, Atom и другие.

В 2017 году Microsoft передала спецификацию LSP в организацию JSON-RPC Working Group, а затем в сообщество Open VSX. Протокол активно развивается: по состоянию на 2024 год актуальной является версия 3.17 спецификации.

Архитектура и принцип работы

LSP построен на клиент-серверной модели. Клиент — это редактор или IDE, который отображает код и принимает пользовательские действия. Сервер — отдельный процесс, часто написанный на том же языке, который анализирует (например, TypeScript-сервер написан на TypeScript, Rust-анализатор — на Rust). Связь осуществляется по JSON-RPC через стандартный ввод-вывод, сокеты или именованные каналы.

Клиент отправляет серверу уведомления об изменениях в открытых файлах (textDocument/didOpen, textDocument/didChange), а также запросы, инициируемые действиями пользователя. Сервер в ответ возвращает результаты: список автодополнений, диагностические сообщения об ошибках, информацию о символе под курсором. Диагностика может отправляться сервером асинхронно — например, при сохранении файла или в фоновом режиме.

Основные возможности

Протокол определяет более 60 методов, объединённых в группы:

  • Навигация по коду: переход к определению (textDocument/definition), поиск всех ссылок (textDocument/references), переход к реализации (textDocument/implementation).
  • Автодополнение: предложение завершений (textDocument/completion), сигнатуры функций (textDocument/signatureHelp).
  • Рефакторинг: переименование символов (textDocument/rename), поиск кода для извлечения (textDocument/codeAction).
  • Диагностика: синтаксические и семантические ошибки, предупреждения (textDocument/publishDiagnostics).
  • Прочее: наведение для получения документации (textDocument/hover), форматирование (textDocument/formatting), подсветка вхождений символа (textDocument/documentHighlight).

Дополнительные расширения протокола (LSP extensions) реализуют специфические функции: например, поддержку Call Hierarchy (иерархия вызовов) или Semantic Tokens (семантическая подсветка на основе AST).

Преимущества и ограничения

Преимущества

  • Снижение трудозатрат: для добавления поддержки языка в новый редактор достаточно реализовать один клиент LSP, а не отдельные плагины для каждого языка.
  • Изоляция процессов: падение языкового сервера не приводит к краху редактора; тяжёлые вычисления выполняются вне интерфейсного процесса.
  • Единообразие: пользователи получают одинаковый набор функций независимо от выбранного редактора.
  • Языковая независимость: сервер может быть написан на любом языке, способном взаимодействовать по JSON-RPC.

Ограничения

  • Накладные расходы: сериализация JSON и межпроцессное взаимодействие добавляют задержку по сравнению с встроенной реализацией.
  • Сложность отладки: распределённая архитектура усложняет диагностику проблем.
  • Не все функции покрыты: специфические возможности отдельных языков (например, интеграция с отладчиком или системой сборки) требуют дополнительных расширений или остаются вне протокола.

Реализации и применение

LSP поддерживается большинством современных редакторов: Visual Studio Code, Neovim (через встроенный клиент), Vim (через плагины), Emacs (через lsp-mode), Sublime Text, Kakoune, Helix, Zed и другие. JetBrains IDE используют собственную архитектуру, но поддерживают LSP через плагины для сторонних языков.

Известные языковые серверы:

  • clangd — для C, C++ и Objective-C, на основе LLVM.
  • rust-analyzer — для Rust, разрабатывается при поддержке проекта Rust.
  • Pyright — для Python от Microsoft, написан на TypeScript.
  • tsserver — для JavaScript и TypeScript, используется в VS Code.
  • gopls — официальный сервер для Go.
  • jdtls — для Java на базе Eclipse JDT.
  • texlab — для LaTeX.

Протокол также применяется вне традиционных редакторов: например, в системах удалённой разработки (VS Code Remote Development) и в веб-интерфейсах (GitHub Codespaces, Gitpod).

Влияние на экосистему разработки

LSP стал одним из факторов, способствовавших росту популярности лёгких редакторов в конце 2010-х годов. Возможность получить полноценную языковую поддержку в Neovim или Vim без установки громоздких плагинов привела к миграции части разработчиков с традиционных IDE. Протокол также повлиял на стандартизацию инструментов: новые языки (например, Zig, Gleam) часто разрабатывают LSP-сервер как обязательную часть официального инструментария.

В 2021 году на основе идей LSP появился протокол Debug Adapter Protocol (DAP), стандартизирующий взаимодействие редакторов с отладчиками.

Связанные технологии

LSP часто рассматривают вместе с другими протоколами из экосистемы Microsoft: Language Server Index Format (LSIF) — для хранения индексов кода; Debug Adapter Protocol (DAP); TextMate-грамматиками для подсветки синтаксиса. Вместе они образуют основу современной модульной архитектуры редакторов кода.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →