Протокол языкового сервера

редактировать

Протокол языкового сервера (LSP ) - это открытый протокол на основе JSON-RPC для использования между или интегрированными средами разработки (IDE) и серверами, которые предоставляют специфичные для языка программирования функции. Цель протокола - обеспечить реализацию и распространение поддержки языков программирования независимо от какого-либо конкретного редактора или IDE.

Содержание
  • 1 История
  • 2 Предпосылки
  • 3 Технический обзор
  • 4 Реестр
  • 5 Ссылки
  • 6 Внешние ссылки
История

LSP изначально был разработан для Microsoft Visual Studio Code и теперь является открытым стандартом. 27 июня 2016 года Microsoft объявила о сотрудничестве с Red Hat и Codenvy для стандартизации спецификации протокола. Протокол поддерживается и принят тремя компаниями. Его спецификация размещена и разработана на GitHub.

Background

Современные IDE предоставляют разработчикам сложные функции, такие как завершение кода, рефакторинг, переход к символу определение, подсветка синтаксиса, а также маркеры ошибок и предупреждений.

Например, в текстовом языке программирования программист может захотеть переименовать метод в. Программист мог либо вручную отредактировать соответствующие файлы исходного кода и заменить соответствующие вхождения старого имени метода на новое имя, либо вместо этого использовать возможности рефакторинга IDE для автоматического внесения всех необходимых изменений. Чтобы иметь возможность поддерживать этот стиль рефакторинга, IDE необходимо глубокое понимание языка программирования, на котором написан исходный код программы. Инструмент программирования без такого понимания - например, тот, который вместо этого выполняет наивный поиск и замену, может привести к ошибкам. Например, при переименовании метода readинструмент не должен заменять частичное совпадение в переменной, которая может называться readyState, а также не должна заменять часть кода комментарий, содержащий слово «уже». Например, переименование локальной переменной readне должно приводить к изменению одноименных переменных в других областях действия.

Обычные компиляторы или Интерпретаторы для конкретного языка программирования обычно не могут предоставить эти языковые службы, поскольку они написаны с целью либо преобразования исходного кода в объектный код, либо немедленного выполнения кода. Кроме того, языковые службы должны иметь возможность обрабатывать исходный код, который не правильно сформирован, например потому что программист находится в процессе редактирования и еще не закончил ввод оператора, процедуры или другой конструкции. Кроме того, небольшие изменения в файле исходного кода, которые вносятся во время набора текста, обычно изменяют семантику программы. Чтобы обеспечить мгновенную обратную связь с пользователем, инструмент редактирования должен уметь очень быстро оценивать синтаксические и семантические последствия конкретной модификации. Таким образом, компиляторы и интерпретаторы не подходят для создания информации, необходимой для использования инструментом редактирования.

До разработки и реализации протокола языкового сервера для разработки кода Visual Studio большинство языковых служб обычно использовались. привязан к данной IDE или другому редактору. В отсутствие протокола языкового сервера языковые службы обычно реализуются с использованием API расширения для конкретного инструмента. Предоставление той же языковой службы другому инструменту редактирования требует усилий по адаптации существующего кода, чтобы служба могла быть нацелена на интерфейсы расширения второго редактора.

Протокол языкового сервера позволяет отделить языковые службы от редактора, чтобы службы может содержаться на сервере общего назначения. Любой редактор может унаследовать развитую поддержку множества разных языков, используя существующие языковые серверы. Точно так же программист, участвующий в разработке нового языка программирования, может сделать службы для этого языка доступными для существующих инструментов редактирования. Таким образом, использование языковых серверов через протокол языкового сервера также снижает нагрузку на поставщиков средств редактирования, поскольку поставщикам не нужно разрабатывать собственные языковые службы для языков, которые поставщик намеревается поддерживать, если языковые серверы уже имеют реализовано. Протокол языкового сервера также позволяет распространять и разрабатывать серверы, предоставленные заинтересованной третьей стороной, такой как конечные пользователи, без дополнительного участия ни поставщика компилятора для используемого языка программирования, ни поставщика редактора, которому добавляется языковая поддержка.

LSP не ограничивается языками программирования. Его можно использовать для любого типа текстового языка, например для спецификаций или предметно-ориентированных языков (DSL).

Технический обзор

Когда пользователь редактирует один или несколько файлов исходного кода, используя язык инструмент, поддерживающий протокол сервера, инструмент действует как клиент, который использует языковые службы, предоставляемые языковым сервером. Инструмент может быть или IDE, а языковые службы могут быть рефакторингом, завершением кода и т. Д.

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

Протокол языкового сервера определяет сообщения, которыми должен обмениваться клиент и языковой сервер. Это JSON-RPC, которому предшествуют заголовки, подобные HTTP. Сообщения могут исходить от сервера или клиента.

Протокол не содержит никаких положений о том, как запросы, ответы и уведомления передаются между клиентом и сервером. Например, клиент и сервер могут быть компонентами в одном процессе, обмениваясь строками JSON через вызовы методов. Это также могут быть разные процессы на одном и том же или на разных машинах, обменивающихся данными через сетевые сокеты.

Реестр

Глобальный сервер, размещенный на Eclipse Foundation, должен сделать языковые серверы общедоступными. Кроме того, существуют списки LSP-совместимых реализаций, поддерживаемые сообществом Langserver.org или Microsoft.

Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-26 13:08:57
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте