stringtranslate.com

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

Протокол языкового сервера ( LSP ) — это открытый протокол на основе JSON-RPC для использования между редакторами исходного кода или интегрированными средами разработки (IDE) и серверами , которые предоставляют «инструменты языковой аналитики»: [1] функции, специфичные для языка программирования , такие как код завершение , подсветка синтаксиса и маркировка предупреждений и ошибок, а также процедуры рефакторинга . Цель протокола — обеспечить возможность реализации и распространения поддержки языка программирования независимо от любого данного редактора или IDE. [2] В начале 2020-х годов LSP быстро стал «нормой» для поставщиков инструментов языкового анализа. [1]

История

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

Фон

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

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

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

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

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

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

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

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

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

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

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

Реестр

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

Рекомендации

  1. ^ аб Гунасингхе и Маркус 2021, с. XXI.
  2. ^ Эффтинге, Свен; Спенеманн, Миро (11 декабря 2016 г.). «Объяснение протокола языкового сервера». Фонд Эклипс . Проверено 25 апреля 2017 г.
  3. ^ Криль, Пол (27 июня 2016 г.). «Протокол языкового сервера, поддерживаемый Microsoft, стремится к совместимости языка и инструментов». Инфомир . Проверено 26 апреля 2017 г. .
  4. Хэнди, Алекс (27 июня 2016 г.). «Codenvy, Microsoft и Red Hat сотрудничают в разработке протокола языкового сервера». СД Таймс . Проверено 26 апреля 2017 г. .
  5. ^ "Microsoft/язык-серверный протокол" . Гитхаб . Проверено 29 марта 2021 г.
  6. ↑ Аб Хуарес, Сет (12 мая 2016 г.). «Андерс Хейлсберг о конструкции современного компилятора». Майкрософт . Проверено 22 февраля 2017 г.
  7. ^ Эффтинге, Свен (декабрь 2016 г.). «Eclipse изучает новые протоколы» . Проверено 26 апреля 2017 г. .
  8. Томассетти, Габриэле (16 февраля 2017 г.). «Почему вам следует знать протокол языкового сервера». Федерико Томассетти . Проверено 8 мая 2017 г.
  9. ^ Нойманн, Александр (1 июня 2016 г.). «Протокол языкового сервера Xtext 2.11 unterstützt» [Xtext 2.11 поддерживает протокол языкового сервера]. Heise Developer (на немецком языке). Хайзе Медиен . Проверено 8 мая 2017 г.
  10. Мохило, Доминик (28 июня 2016 г.). «Polyglott dank Language Server Protocol: Microsoft, Red Hat und Codenvy streben nach der Universellen IDE» [Полиглот благодаря протоколу языкового сервера: Microsoft, Red Hat и Codenvy стремятся к универсальной IDE]. Джаксентер (на немецком языке). Программное обеспечение и вспомогательные средства . Проверено 8 мая 2017 г.
  11. ^ "Langserver.org". Langserver.org . Проверено 8 мая 2017 г. - через Sourcegraph.
  12. Гамма, Эрих (21 января 2019 г.). «Языковые серверы». Майкрософт . Получено 25 января 2019 г. - через GitHub.

дальнейшее чтение

Внешние ссылки