Пратакол моўнага сервера

**Пратакол моўнага сервера** (, **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` не павінна прывесці да змены аднолькава названых пераменных у іншых абласцях ().

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

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

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

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

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

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

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

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

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

## Крыніцы 
## Літаратура 
* 

## Спасылкі 
* Афіцыйны сайт

Катэгорыя:Прылады для распрацоўкі ПЗ
Катэгорыя:Перадача даных
Катэгорыя:Камп’ютарныя і тэлекамунікацыйныя стандарты