**Пратакол моўнага сервера** (англ.: Language Server Protocol, **LSP**) — гэта адкрыты пратакол на аснове JSON-RPC для выкарыстання паміж рэдактарамі зыходнага кода або інтэграванымі асяроддзямі распрацоўкі (IDE) і серверамі, якія прадстаўляюць «інструменты моўнага інтэлекту»:  спецыфічныя функцыі мовы праграмавання, такія як аўтазавяршэнне коду, падсвятленне сінтаксісу і маркіроўка папярэджанняў і памылак, а таксама працэдуры рэфактарынгу. Мэта пратаколу — дазволіць дадаваць і распаўсюджваць падтрымку мовы праграмавання незалежна ад любога тэкставага рэдактара або IDE. У пачатку 2020-х LSP хутка стаў «нормай» для пастаўшчыкоў інструментаў моўнага інтэлекту.

Гісторыя
--------

LSP першапачаткова быў распрацаваны для Microsoft Visual Studio Code і цяпер з’яўляецца адкрытым стандартам. 27 чэрвеня 2016 года Microsoft абвясціла аб супрацоўніцтве з Red Hat і Codenvy для стандартызацыі спецыфікацыі пратаколу. Пратакол быў першапачаткова падтрыманы і прыняты гэтымі трыма кампаніямі. Яго спецыфікацыя размешчана і распрацавана на платформе GitHub.

Перадгісторыя
-------------

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

Напрыклад, у тэкставай мове праграмавання праграміст можа захацець перайменаваць метад `read`. Праграміст можа альбо ўручную рэдагаваць адпаведныя файлы зыходнага кода і змяняць адпаведныя ўваходжанні старога імя метаду на новае імя, альбо замест гэтага выкарыстоўваць магчымасці рэфактарынгу IDE, каб аўтаматычна ўносіць усе неабходныя змены. Каб мець магчымасць падтрымліваць гэты стыль рэфактарынгу, IDE неабходна дасканалае разуменне мовы праграмавання, на якой напісаны зыходны код праграмы. Інструмент праграмавання без такога разумення (напрыклад, той, які замест гэтага выконвае наіўны пошук і замену) можа выклікаць памылкі. Пры перайменаванні метаду `read`, напрыклад, інструмент не павінен замяняць частковае супадзенне ў зменнай, якая можа называцца `readyState`, а таксама не павінен замяняць частку каментарыя да кода, які змяшчае слова «already». Таксама перайменаванне лакальнай пераменнай `read`, напрыклад, не павінна прывесці да змены аднолькава названых зменных у іншых абласцях (англ.: scopes).

Кампілятары або інтэрпрэтатары для пэўнай мовы праграмавання звычайна не могуць забяспечыць гэтыя *моўныя паслугі*, таму што яны напісаны з мэтай альбо пераўтварэння зыходнага кода ў аб’ектны код, альбо неадкладнага выканання кода. Акрамя таго, моўныя службы павінны быць у стане апрацоўваць зыходны код, які «зламаны», напрыклад, таму што праграміст знаходзіцца ў сярэдзіне рэдагавання і яшчэ не скончыў набіраць аператар, працэдуру ці іншую канструкцыю. Акрамя таго, невялікія змены ў файле зыходнага кода, якія ўносяцца падчас уводу, звычайна змяняюць семантыку праграмы. Каб забяспечыць імгненную зваротную сувязь з карыстальнікам, інструмент рэдагавання павінен мець магчымасць вельмі хутка ацэньваць сінтаксічныя і семантычныя наступствы канкрэтнай мадыфікацыі. Такім чынам, кампілятары і інтэрпрэтатары з’яўляюцца дрэнным кандыдатам для атрымання інфармацыі, неабходнай для выкарыстання інструментам рэдагавання.

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

Пратакол моўнага сервера дазваляе аддзяліць моўныя службы ад рэдактара, каб службы маглі ўтрымлівацца ў *моўным серверы* агульнага прызначэння. Любы рэдактар можа атрымаць у спадчыну складаную падтрымку мноства розных моў, выкарыстоўваючы існуючыя моўныя серверы. Падобным чынам праграміст, які займаецца распрацоўкай новай мовы праграмавання, можа зрабіць сэрвісы для гэтай мовы даступнымі для існуючых інструментаў рэдагавання. Такім чынам, выкарыстанне моўных сервераў праз пратакол моўнага сервера таксама зніжае нагрузку на пастаўшчыкоў інструментаў рэдагавання, таму што пастаўшчыкам не трэба распрацоўваць уласныя моўныя службы для моў, якія ён мае намер падтрымліваць, пры ўмове, што моўныя серверы ўжо маюць быць рэалізаваны. Пратакол моўнага сервера таксама дазваляе распаўсюджваць і распрацоўваць серверы, якія прадстаўляюцца зацікаўленым трэцім асобам, такім як канчатковыя карыстальнікі, без дадатковага ўдзелу пастаўшчыка кампілятара для мовы праграмавання, якая выкарыстоўваецца, альбо пастаўшчыка рэдактара, для якога мова падтрымка дадаецца.

LSP не абмяжоўваецца мовамі праграмавання. Ён можа быць выкарыстаны для любога тыпу тэкставых моў, такіх як спецыфікацыі або прадметна-арыентаваныя мовы (DSL).

Тэхнічны агляд
--------------

Калі карыстальнік рэдагуе адзін або некалькі файлаў зыходнага кода з дапамогай інструмента з падтрымкай пратаколу моўнага сервера, гэты інструмент дзейнічае як *кліент*, які выкарыстоўвае *моўныя паслугі,* якія прадстаўляюцца *моўным серверам*. Інструментам можа быць тэкставы рэдактар або IDE, а моўнымі службамі могуць быць рэфактарынгі, дапаўненні кода і г.д.

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

Пратакол моўнага сервера вызначае паведамленні, якімі будуць абменьвацца паміж кліентам і моўным серверам. Гэта JSON-RPC, якім папярэднічаюць загалоўкі, падобныя на HTTP. Паведамленні могуць паходзіць з сервера або кліента.

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

Рэестр
------

Глабальны рэестр моўных службаў, арганізаваны Eclipse Foundation, павінен зрабіць моўныя серверы агульнадаступнымі. Акрамя таго, ёсць спісы LSP-сумяшчальных рэалізацый, якія падтрымліваюцца Langserver.org  або Microsoft.

Крыніцы
-------

1. 1 2  Gunasinghe & Marcus 2021.
2. ↑  *Efftinge*. Language Server Protocol Explained **(нявызн.)**.  Eclipse Foundation (11 снежня 2016). Праверана 25 April 2017.
3. ↑  *Krill*. Microsoft-backed Language Server Protocol strives for language, tools interoperability **(нявызн.)**.  InfoWorld (27 чэрвеня 2016). Праверана 26 April 2017.
4. ↑  *Handy*. Codenvy, Microsoft and Red Hat collaborate on Language Server Protocol **(нявызн.)**.  SD Times (27 чэрвеня 2016). Праверана 26 April 2017.
5. ↑  microsoft/language-server-protocol **(нявызн.)**. *GitHub*. Праверана 29 March 2021.
6. 1 2  *Juarez*. Anders Hejlsberg on Modern Compiler Construction **(нявызн.)**.  Microsoft (12 мая 2016). Праверана 22 February 2017.
7. ↑  *Efftinge*. Eclipse Is Learning New Protocols **(нявызн.)** (1 снежня 2016). Праверана 26 April 2017.
8. ↑  *Tomassetti*. Why You Should Know the Language Server Protocol **(нявызн.)**.  Federico Tomassetti (16 лютага 2017). Праверана 8 May 2017.
9. ↑  *Neumann*. Xtext 2.11 unterstützt Language Server Protocol(нявызн.).  Heise Medien (1 чэрвеня 2016). Праверана 8 May 2017.
10. ↑  *Mohilo*. Polyglott dank Language Server Protocol: Microsoft, Red Hat und Codenvy streben nach der universellen IDE(нявызн.).  Software & Support Media (28 чэрвеня 2016). Праверана 8 May 2017.
11. ↑  Langserver.org **(нявызн.)**.  Langserver.org. Праверана 8 May 2017.
12. ↑  *Gamma*. Language Servers **(нявызн.)**.  Microsoft (21 студзеня 2019). Праверана 25 January 2019.

Літаратура
----------

* Gunasinghe, N.; Marcus, N. (2021). *Language Server Protocol and Implementation: Supporting Language-Smart Editing and Programming Tools*. Apress. ISBN 978-1-4842-7791-1.

Спасылкі
--------

* Афіцыйны сайт