Nyelvi kiszolgáló protokoll - Language Server Protocol
A Language Server Protocol ( LSP ) egy nyílt, JSON-RPC alapú protokoll , amely a forráskód-szerkesztők vagy az integrált fejlesztői környezetek (IDE) és a programozási nyelvre jellemző szolgáltatásokat biztosító szerverek között használható . A protokoll célja, hogy lehetővé tegye a programozási nyelv támogatásának megvalósítását és terjesztését az adott szerkesztőtől vagy IDE-től függetlenül.
Történelem
Az LSP-t eredetileg a Microsoft Visual Studio Code számára fejlesztették ki, és ma már nyílt szabvány. 2016. június 27-én a Microsoft bejelentette a Red Hat és a Codenvy együttműködését a protokoll specifikációjának egységesítése érdekében. A protokoll támogatott, és a három vállalat elfogadta. Specifikációját a GitHub tárolja és fejleszti .
Háttér
A modern IDE-k olyan kifinomult funkciókat kínálnak a fejlesztőknek, mint a kód kitöltése , a refaktorálás , a szimbólum definíciójához való navigálás, a szintaxis kiemelése , valamint a hiba- és figyelmeztető jelölők.
Például egy szöveges programozási nyelven egy programozó átnevezheti a metódust read . A programozó vagy manuálisan szerkesztheti a megfelelő forráskód fájlokat, és megváltoztathatja a régi metódus nevének megfelelő előfordulását az új névre, vagy ehelyett egy IDE refaktorolási képességeit használhatja az összes szükséges módosítás automatikus elvégzéséhez. Ahhoz, hogy támogassa ezt a stílust a újraírás, egy IDE szüksége van egy kifinomult megértését a programozási nyelv , hogy a program forrása van írva. A programozási eszköz nélkül egy ilyen megértés például az egyik, hogy végrehajt egy naiv keresés és csere helyett —Hibákat okozhat. Ha az átnevezést a read módszerrel, például, az eszköz nem helyettesíti a részleges meccset egy változó, nevezhetnénk readyState , sem pedig felváltja a részét a kódot megjegyzést szót tartalmazó „már”. Például egy helyi változó átnevezése sem eredményezheti az read azonos nevű változók megváltoztatását más hatókörökben .
Egy adott programozási nyelv hagyományos fordítói vagy tolmácsai általában nem tudják biztosítani ezeket a nyelvi szolgáltatásokat , mivel azokat azzal a céllal írják, hogy vagy a forráskódot objektumkódokká alakítsák, vagy a kódot azonnal végrehajtják. Ezenkívül a nyelvi szolgáltatásoknak képesnek kell lenniük a nem megfelelően kialakított forráskód kezelésére , például azért, mert a programozó a szerkesztés közepén van, és még nem fejezte be egy utasítás, eljárás vagy más konstrukció beírását. Ezenkívül a forráskód fájl apró módosításai, amelyeket gépelés közben hajtanak végre, általában megváltoztatják a program szemantikáját. Annak érdekében, hogy azonnali visszajelzést nyújtson a felhasználónak, a szerkesztő eszköznek képesnek kell lennie arra, hogy nagyon gyorsan értékelje egy adott módosítás szintaktikai és szemantikai következményeit. Az összeállítók és tolmácsok ezért gyenge jelöltet nyújtanak a szerkesztési eszköz fogyasztásához szükséges információk előállításához.
A Visual Studio Code fejlesztésére szolgáló Language Server Protocol megtervezése és megvalósítása előtt a legtöbb nyelvi szolgáltatás általában egy adott IDE-hez vagy más szerkesztőhöz volt kötve. A Nyelvi kiszolgáló protokoll hiányában a nyelvi szolgáltatásokat általában egy eszközspecifikus kiterjesztésű API használatával valósítják meg. Ha ugyanazt a nyelvi szolgáltatást nyújtja egy másik szerkesztő eszköznek, erőfeszítéseket kell tennie a meglévő kód adaptálásához, hogy a szolgáltatás a második szerkesztő kiterjesztési felületeit célozhassa meg.
A Nyelvkiszolgáló-protokoll lehetővé teszi a nyelvi szolgáltatások és a szerkesztő leválasztását, hogy a szolgáltatások egy általános célú nyelvi kiszolgálón belül legyenek . Bármely szerkesztő örökölheti a sokféle nyelv kifinomult támogatását a meglévő nyelvi szerverek használatával. Hasonlóképpen, egy új programozási nyelv kifejlesztésével foglalkozó programozó elérhetővé teheti az adott nyelv szolgáltatásait a meglévő szerkesztőeszközök számára. A nyelvi szerverek használata a Nyelvi szerver protokollon keresztül így csökkenti a szerkesztőeszközök forgalmazóinak terheit is, mivel a szállítóknak nem kell saját nyelvű szolgáltatásokat fejleszteniük azoknak a nyelveknek, amelyeket az eladó támogatni kíván, amennyiben a nyelvi szerverek már rendelkeznek végrehajtották. A Language Server Protocol emellett lehetővé teszi az érdekelt harmadik felek, például a végfelhasználók által közreműködő szerverek terjesztését és fejlesztését anélkül, hogy akár a használt programozási nyelv fordítójának szállítója, akár annak a szerkesztőnek a szállítója közreműködne, amelyhez a nyelvi támogatással bővül.
Az LSP nem korlátozódik a programozási nyelvekre. Bármilyen típusú szöveges nyelvhez használható, például specifikációkhoz vagy tartományspecifikus nyelvekhez (DSL) .
Műszaki áttekintés
Amikor a felhasználó egy vagy több forráskódfájlt szerkeszt a nyelvkiszolgáló protokollt támogató eszközzel, az eszköz kliensként működik, amely a nyelvi szerver által nyújtott nyelvi szolgáltatásokat fogyasztja . Az eszköz lehet egy szövegszerkesztő vagy IDE és a nyelvi szolgáltatások lehetne újraszervezi , kódkiegészítés stb
Az ügyfél tájékoztatja a szervert arról, hogy mit csinál a felhasználó, például megnyit egy fájlt, beszúr egy karaktert egy adott szövegpozícióba. Az ügyfél kérheti a kiszolgálót egy nyelvi szolgáltatás végrehajtására, például egy meghatározott tartomány formázására a szöveges dokumentumban. A szerver megfelelő választ ad meg az ügyfél kérésére. Például a formázási kérelemre válaszként válaszolunk, amely a formázott szöveget átadja az ügyfélnek, vagy hibaüzenettel, amely a hiba részleteit tartalmazza.
A Language Server Protocol meghatározza az ügyfél és a nyelvi szerver között cserélendő üzeneteket. Ezek JSON-RPC-k, amelyeket a HTTP-hez hasonló fejlécek előznek meg. Az üzenetek származhatnak a szervertől vagy az ügyféltől.
A protokoll nem rendelkezik arról, hogy a kérések, válaszok és értesítések hogyan kerülnek továbbításra az ügyfél és a szerver között. Például az ügyfél és a kiszolgáló ugyanazon folyamat összetevői lehetnek, JSON karakterláncokat cserélhetnek metódushívások útján. Különböző folyamatok is lehetnek ugyanazon vagy a hálózati aljzatokon keresztül kommunikáló különböző gépeken .
Iktató hivatal
Az Eclipse Foundation által üzemeltetett globális nyelvi szolgáltatási nyilvántartásnak nyilvánosan elérhetővé kell tennie a nyelvi szervereket. Ezen felül vannak listák az LSP-kompatibilis megvalósításokról, amelyeket a közösség által vezérelt Langserver.org vagy a Microsoft vezet.