Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

История [ править ]

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

Фон [ править ]

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

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

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

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

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

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

Технический обзор [ править ]

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

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

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

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

Реестр [ править ]

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

Ссылки [ править ]

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

Внешние ссылки [ править ]

  • Официальный веб-сайт