Протокол языкового сервера
этой статьи Начальный раздел может быть слишком коротким, чтобы адекватно суммировать ключевые моменты . ( февраль 2023 г. ) |
Протокол языкового сервера ( 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 посредством вызовов методов. Это также могут быть разные процессы на одной или разных машинах, взаимодействующие через сетевые сокеты .
Реестр [ править ]
Существуют списки LSP-совместимых реализаций, поддерживаемые сообществом Langserver.org. [10] или Майкрософт. [11]
Ссылки [ править ]
- ↑ Перейти обратно: Перейти обратно: а б Гунасингхе и Маркус 2021 , с. XXI.
- ^ Эффтинге, Свен; Спенеманн, Миро (11 декабря 2016 г.). «Объяснение протокола языкового сервера» . Фонд Эклипс . Проверено 25 апреля 2017 г.
- ^ Криль, Пол (27 июня 2016 г.). «Протокол языкового сервера, поддерживаемый Microsoft, стремится к совместимости языка и инструментов» . Инфомир . Проверено 26 апреля 2017 г.
- ^ Хэнди, Алекс (27 июня 2016 г.). «Codenvy, Microsoft и Red Hat сотрудничают в разработке протокола языкового сервера» . СД Таймс . Проверено 26 апреля 2017 г.
- ^ «Microsoft/язык-серверный протокол» . Гитхаб . Проверено 29 марта 2021 г.
- ↑ Перейти обратно: Перейти обратно: а б Хуарес, Сет (12 мая 2016 г.). «Андерс Хейлсберг о современной конструкции компилятора» . Майкрософт . Проверено 22 февраля 2017 г.
- ^ Эффтинге, Свен (декабрь 2016 г.). «Eclipse изучает новые протоколы» . Проверено 26 апреля 2017 г.
- ^ Томассетти, Габриэле (16 февраля 2017 г.). «Почему вам следует знать протокол языкового сервера» . Федерико Томассетти . Проверено 8 мая 2017 г.
- ^ Нойманн, Александр (1 июня 2016 г.). «Протокол языкового сервера Xtext 2.11 unterstützt» [Xtext 2.11 поддерживает протокол языкового сервера]. Heise Developer (на немецком языке). Хайзе Медиен . Проверено 8 мая 2017 г.
- ^ «Langserver.org» . Langserver.org . Проверено 8 мая 2017 г. - через Sourcegraph.
- ^ Гамма, Эрих (21 января 2019 г.). «Языковые серверы» . Майкрософт . Получено 25 января 2019 г. - через GitHub.
Дальнейшее чтение [ править ]
- Гунасингхе, Н.; Маркус, Н. (2021). Протокол языкового сервера и его реализация: поддержка инструментов языкового редактирования и программирования . Апресс . ISBN 978-1-4842-7791-1 .