Språkserverprotokoll
Language Server Protocol ( LSP ) är ett öppet, JSON-RPC -baserat protokoll för användning mellan källkodsredigerare eller integrerade utvecklingsmiljöer (IDE) och servrar som tillhandahåller programmeringsspråksspecifika funktioner som kodkomplettering , syntaxmarkering och markering av varningar och fel, samt refaktoreringsrutiner . Målet med protokollet är att tillåta stöd för programmeringsspråk att implementeras och distribueras oberoende av en given editor eller IDE.
Historia
LSP utvecklades ursprungligen för Microsoft Visual Studio Code och är nu en öppen standard. Den 27 juni 2016 Microsoft ett samarbete med Red Hat och Codenvy för att standardisera protokollets specifikation. Protokollet stöds och har antagits av de tre företagen. Dess specifikation är värd och utvecklad på GitHub .
Bakgrund
Moderna IDE:er förser utvecklare med sofistikerade funktioner som kodkomplettering , refaktorering , navigering till en symbols definition, syntaxmarkering och fel- och varningsmarkörer.
Till exempel, i ett textbaserat programmeringsspråk, kanske en programmerare vill byta namn på en metod read
. Programmeraren kan antingen manuellt redigera respektive källkodsfiler och ändra lämpliga förekomster av det gamla metodnamnet till det nya namnet, eller istället använda en IDE:s refactoring-förmåga för att göra alla nödvändiga ändringar automatiskt. För att kunna stödja denna typ av refactoring behöver en IDE en sofistikerad förståelse av det programmeringsspråk som programmets källa är skriven i. Ett programmeringsverktyg utan en sådan förståelse – till exempel ett som utför en naiv sök-och-ersätt istället — skulle kunna införa fel. När man byter namn på en läsmetod
, till exempel, bör verktyget inte ersätta den partiella matchningen i en variabel som kan kallas readyState
, och det bör inte heller ersätta den del av en kodkommentar som innehåller ordet "redan". Inte heller bör om du byter namn på en lokal variabel läs
t.ex. ändra identiskt namngivna variabler i andra omfång .
Konventionella kompilatorer eller tolkar för ett specifikt programmeringsspråk kan vanligtvis inte tillhandahålla dessa språktjänster , eftersom de är skrivna med målet att antingen omvandla källkoden till objektkod eller omedelbart exekvera koden. Dessutom måste språktjänster kunna hantera källkod som inte är välformaterad , t.ex. för att programmeraren är mitt uppe i redigeringen och ännu inte har skrivit klart ett uttalande, procedur eller annan konstruktion. Dessutom ändrar små ändringar i en källkodsfil som görs under skrivning vanligtvis programmets semantik. För att ge omedelbar feedback till användaren måste redigeringsverktyget mycket snabbt kunna utvärdera de syntaktiska och semantiska konsekvenserna av en specifik modifiering. Kompilatorer och tolkar är därför en dålig kandidat för att producera den information som behövs för att ett redigeringsverktyg ska kunna konsumera.
Före designen och implementeringen av Language Server Protocol för utvecklingen av Visual Studio Code var de flesta språktjänster i allmänhet knutna till en given IDE eller annan editor. I avsaknad av Language Server Protocol implementeras språktjänster vanligtvis med hjälp av ett verktygsspecifikt tilläggs-API. Att tillhandahålla samma språktjänst till ett annat redigeringsverktyg kräver ansträngning för att anpassa den befintliga koden så att tjänsten kan rikta in sig på den andra redaktörens tilläggsgränssnitt.
Språkserverprotokollet gör det möjligt att frikoppla språktjänster från editorn så att tjänsterna kan finnas i en språkserver för allmänt bruk . Alla redaktörer kan ärva sofistikerat stöd för många olika språk genom att använda befintliga språkservrar. På liknande sätt kan en programmerare som är involverad i utvecklingen av ett nytt programmeringsspråk göra tjänster för det språket tillgängliga för befintliga redigeringsverktyg. Att använda språkservrar via Language Server Protocol minskar därmed också bördan för leverantörer av redigeringsverktyg, eftersom leverantörer inte behöver utveckla egna språktjänster för de språk leverantören avser att stödja, så länge som språkservrarna redan har genomförts. Språkserverprotokollet möjliggör också distribution och utveckling av servrar som bidrags från en intresserad tredje part, såsom slutanvändare, utan ytterligare inblandning av vare sig leverantören av kompilatorn för det programmeringsspråk som används eller leverantören av redaktören till vilket språket stöd läggs till. [ citat behövs ]
LSP är inte begränsad till programmeringsspråk. Det kan användas för alla typer av textbaserat språk, som specifikationer eller domänspecifika språk (DSL) .
Teknisk översikt
När en användare redigerar en eller flera källkodsfiler med hjälp av ett språkserverprotokollaktiverat verktyg, fungerar verktyget som en klient som använder språktjänsterna som tillhandahålls av en språkserver . Verktyget kan vara en textredigerare eller IDE och språktjänsterna kan vara refactoring , kodkomplettering , etc.
Klienten informerar servern om vad användaren gör, t.ex. öppnar en fil eller infogar ett tecken på en specifik textposition. Klienten kan också begära att servern utför en språktjänst, t.ex. formatera ett specificerat område i textdokumentet. Servern svarar på en klients begäran med ett lämpligt svar. Till exempel besvaras formateringsbegäran antingen av ett svar som överför den formaterade texten till klienten eller av ett felsvar som innehåller detaljer om felet.
Språkserverprotokollet definierar de meddelanden som ska utbytas mellan klient och språkserver. De är JSON-RPC föregås av headers liknande HTTP. Meddelanden kan komma från servern eller klienten.
Protokollet innehåller inga bestämmelser om hur förfrågningar, svar och meddelanden överförs mellan klient och server. Till exempel kan klient och server vara komponenter inom samma process som utbyter JSON- strängar via metodanrop. De kan också vara olika processer på samma eller på olika maskiner som kommunicerar via nätverksuttag .
Register
Ett globalt språktjänstregister, som är värd för Eclipse Foundation, bör göra språkservrar allmänt tillgängliga. Dessutom finns det listor över LSP-kompatibla implementeringar, underhållna av det community-drivna Langserver.org eller Microsoft.