Protokół serwera językowego

Language Server Protocol ( LSP ) to otwarty protokół oparty na JSON-RPC do użytku między edytorami kodu źródłowego lub zintegrowanymi środowiskami programistycznymi (IDE) a serwerami , które zapewniają funkcje specyficzne dla języka programowania , takie jak uzupełnianie kodu , podświetlanie składni i oznaczanie ostrzeżeń oraz błędy, a także refaktoryzację rutyny. Celem protokołu jest umożliwienie implementacji i dystrybucji obsługi języków programowania niezależnie od dowolnego edytora lub IDE.

Historia

LSP został pierwotnie opracowany dla Microsoft Visual Studio Code i jest obecnie otwartym standardem. 27 czerwca 2016 r. Microsoft ogłosił współpracę z firmami Red Hat i Codenvy w celu ujednolicenia specyfikacji protokołu. Protokół jest obsługiwany i został przyjęty przez trzy firmy. Jego specyfikacja jest hostowana i rozwijana w serwisie GitHub .

Tło

Nowoczesne IDE zapewniają programistom zaawansowane funkcje, takie jak uzupełnianie kodu , refaktoryzacja , przechodzenie do definicji symbolu , podświetlanie składni oraz znaczniki błędów i ostrzeżeń.

Na przykład w tekstowym języku programowania programista może chcieć zmienić nazwę metody read . Programista może albo ręcznie edytować odpowiednie pliki kodu źródłowego i zmienić odpowiednie wystąpienia starej nazwy metody na nową, albo zamiast tego użyć możliwości refaktoryzacji IDE, aby automatycznie wprowadzić wszystkie niezbędne zmiany. Aby móc obsługiwać ten styl refaktoryzacji, IDE potrzebuje wyrafinowanego zrozumienia języka programowania , w którym napisane jest źródło programu . Narzędzie programistyczne bez takiego zrozumienia — na przykład takie, które wykonuje naiwną wyszukaj i zamień — może wprowadzić błędy. Na przykład podczas zmiany nazwy odczytu narzędzie nie powinno zastępować częściowego dopasowania w zmiennej, która może mieć nazwę readyState , ani zastępować części komentarza kodu zawierającego słowo „już”. Na przykład zmiana nazwy zmiennej lokalnej read , nie powinna kończyć się zmianą identycznie nazwanych zmiennych w innych zakresach .

Konwencjonalne kompilatory lub interpretery dla określonego języka programowania zwykle nie są w stanie zapewnić tych usług językowych , ponieważ zostały napisane w celu przekształcenia kodu źródłowego w kod obiektowy lub natychmiastowego wykonania kodu. Ponadto usługi językowe muszą być w stanie obsłużyć kod źródłowy, który nie jest dobrze sformułowany , np. ponieważ programista jest w trakcie edycji i nie skończył jeszcze pisać instrukcji, procedury lub innej konstrukcji. Ponadto niewielkie zmiany w pliku kodu źródłowego, które są dokonywane podczas pisania, zwykle zmieniają semantykę programu. Aby zapewnić użytkownikowi natychmiastową informację zwrotną, narzędzie do edycji musi być w stanie bardzo szybko ocenić składniowe i semantyczne konsekwencje określonej modyfikacji. Kompilatory i interpretery są zatem kiepskim kandydatem do generowania informacji potrzebnych narzędziu do edycji.

Przed zaprojektowaniem i wdrożeniem protokołu serwera językowego do tworzenia kodu programu Visual Studio większość usług językowych była na ogół powiązana z danym IDE lub innym edytorem. W przypadku braku protokołu serwera językowego usługi językowe są zwykle implementowane przy użyciu interfejsu API rozszerzenia specyficznego dla narzędzia. Udostępnienie tej samej usługi językowej innemu narzędziu do edycji wymaga wysiłku w celu dostosowania istniejącego kodu, tak aby usługa mogła być ukierunkowana na interfejsy rozszerzeń drugiego edytora.

Protokół serwera językowego umożliwia oddzielenie usług językowych od edytora, dzięki czemu usługi te mogą być zawarte w serwerze językowym ogólnego przeznaczenia . Każdy edytor może odziedziczyć zaawansowaną obsługę wielu różnych języków, korzystając z istniejących serwerów językowych. Podobnie programista zaangażowany w rozwój nowego języka programowania może udostępnić usługi dla tego języka istniejącym narzędziom edycyjnym. Korzystanie z serwerów językowych za pośrednictwem protokołu Language Server Protocol zmniejsza zatem również obciążenie sprzedawców narzędzi do edycji, ponieważ sprzedawcy nie muszą opracowywać własnych usług językowych dla języków, które sprzedawca zamierza obsługiwać, o ile serwery językowe zostały już zostało wdrożone. Language Server Protocol umożliwia również dystrybucję i rozwój serwerów dostarczonych przez zainteresowaną stronę trzecią, taką jak użytkownicy końcowi, bez dodatkowego zaangażowania ani dostawcy kompilatora używanego języka programowania, ani dostawcy edytora, do którego język dodawane jest wsparcie. [ potrzebne źródło ]

LSP nie ogranicza się do języków programowania. Może być używany do dowolnego języka tekstowego, takiego jak specyfikacje lub języki specyficzne dla domeny (DSL) .

Przegląd techniczny

Gdy użytkownik edytuje jeden lub więcej plików kodu źródłowego za pomocą narzędzia obsługującego protokół serwera językowego, narzędzie działa jak klient korzystający z usług językowych dostarczanych przez serwer językowy . Narzędziem może być edytor tekstu lub IDE , a usługami językowymi mogą być refaktoryzacja , uzupełnianie kodu itp.

Klient informuje serwer o tym, co robi użytkownik, np. otwiera plik lub wstawia znak w określonym miejscu tekstu. Klient może również zlecić serwerowi wykonanie usługi językowej, np. sformatowanie określonego zakresu w dokumencie tekstowym. Serwer odpowiada na żądanie klienta odpowiednią odpowiedzią. Na przykład odpowiedź na żądanie formatowania jest albo odpowiedzią, która przesyła sformatowany tekst do klienta, albo odpowiedzią na błąd zawierającą szczegółowe informacje o błędzie.

Protokół serwera językowego definiuje komunikaty, które mają być wymieniane między klientem a serwerem językowym. Są to JSON-RPC poprzedzone nagłówkami podobnymi do HTTP. Wiadomości mogą pochodzić z serwera lub klienta.

Protokół nie zawiera żadnych postanowień dotyczących sposobu przesyłania żądań, odpowiedzi i powiadomień między klientem a serwerem. Na przykład klient i serwer mogą być komponentami tego samego procesu wymieniającymi JSON za pośrednictwem wywołań metod. Mogą to być również różne procesy na tej samej lub różnych maszynach komunikujących się przez gniazda sieciowe .

Rejestr

Globalny rejestr usług językowych hostowany przez Fundację Eclipse powinien udostępniać publicznie serwery językowe. Ponadto istnieją listy implementacji zgodnych z LSP, utrzymywane przez społeczność Langserver.org lub Microsoft.

Linki zewnętrzne