Robocikowo>ROBOCIKOWO
Narzędzia deweloperskie

LSP

2016AktywnyOpublikowano: 4 czerwca 2026Aktualizacja: 4 czerwca 2026Opublikowany
Otwarty protokół (Microsoft, 2016) komunikacji JSON-RPC między edytorem a zewnętrznym serwerem językowym, dostarczającym semantyczne funkcje IDE: autouzupełnianie, definicje, diagnostyka, refaktoryzacja.
Kluczowa innowacja
Standaryzowany protokół JSON-RPC oddzielający edytory od serwerów językowych — sprowadza problem N edytorów × M języków do N + M integracji.
Kategoria
Narzędzia deweloperskie
Poziom abstrakcji
Wzorzec
Poziom operacji
ToolingŚrodowisko agentowe
Zastosowania
Autouzupełnianie kodu w edytorachGo-to-definition i find referencesDiagnostyka błędów i ostrzeżeńRefaktoryzacja (rename, code actions)Hover z dokumentacją i typamiSemantyczny kontekst dla agentów AI piszących kodWsparcie wielu języków w jednym IDE

Jak działa

Klient (edytor) uruchamia serwer językowy jako osobny proces i komunikuje się z nim przez stdin/stdout (lub socket / pipe) używając JSON-RPC 2.0 z nagłówkiem Content-Length. Po inicjalizacji (initialize / initialized) klient wysyła powiadomienia o zmianach buforów (textDocument/didOpen, didChange, didClose) i żądania o funkcje semantyczne (textDocument/completion, hover, definition, references, codeAction, rename, formatting). Serwer zwraca odpowiedzi lub powiadomienia push (np. textDocument/publishDiagnostics z błędami i ostrzeżeniami). Cykle życia, capability negotiation i wersjonowanie dokumentów są częścią specyfikacji.

Rozwiązany problem

Przed LSP każdy edytor musiał implementować integrację z każdym językiem osobno, co dawało kombinatoryczną eksplozję N×M wtyczek o nierównej jakości. LSP redukuje to do N + M: jeden serwer językowy obsługuje wszystkie edytory, jeden klient obsługuje wszystkie języki.

Komponenty

Language clientEdytor lub IDE wysyłający żądania i renderujący wyniki

Strona kliencka protokołu — uruchamia serwer językowy jako podproces, śledzi otwarte bufory i tłumaczy interakcje użytkownika na żądania LSP.

Oficjalna

Language serverProces analizujący kod i odpowiadający na żądania semantyczne

Implementacja specyficzna dla języka (np. rust-analyzer, gopls, pyright). Buduje i utrzymuje semantyczny model projektu — drzewa składniowe, typy, indeksy symboli — i odpowiada na żądania klienta.

Oficjalna

JSON-RPC transportWarstwa komunikacji między klientem a serwerem

Standardowy JSON-RPC 2.0 z ramkowaniem przez nagłówek Content-Length. Najczęściej używa stdio; specyfikacja dopuszcza także sockety i named pipes.

Capability negotiationInicjalizacyjne uzgodnienie wspieranych funkcji

Podczas wymiany initialize / initialized klient i serwer ogłaszają jakie funkcje wspierają (np. snippetSupport, hierarchicalDocumentSymbolSupport). Pozwala protokołowi ewoluować bez łamania starszych klientów lub serwerów.

Implementacja

Pułapki implementacyjne
Synchronizacja wersji dokumentuWysoka

Klient i serwer muszą zgadzać się co do wersji bufora — pomieszanie kolejności textDocument/didChange skutkuje przestarzałymi diagnostykami i błędnymi pozycjami zmian.

Rozwiązanie:Trzymać monotonicznie rosnący numer wersji dokumentu i odrzucać odpowiedzi serwera dotyczące starszych wersji.
Capability negotiationŚrednia

Klient musi sprawdzać capabilities ogłoszone przez serwer w odpowiedzi initialize — zakładanie funkcji, których serwer nie wspiera, kończy się błędami JSON-RPC.

Rozwiązanie:Renderować UI warunkowo na podstawie ServerCapabilities zwróconych przy starcie.
Wydajność dużych projektówWysoka

Naiwne serwery skanują cały workspace przy każdej zmianie, co przy dużych monorepo prowadzi do wielosekundowych pauz w autouzupełnianiu.

Rozwiązanie:Inkrementalna analiza, indeksy symboli, lazy loading modułów (rust-analyzer, gopls jako wzorce).

Ewolucja

2015
Geneza w VS Code i OmniSharp

Microsoft, Red Hat i Codenvy projektują wspólny protokół na bazie wcześniejszych prac OmniSharp.

2016
Publikacja LSP 1.0
Punkt przełomowy

Microsoft publikuje otwartą specyfikację Language Server Protocol w czerwcu 2016, wraz z implementacjami referencyjnymi w VS Code, Eclipse Che i Visual Studio.

2017
LSP 3.0 i szeroka adopcja

Wersja 3.0 ustabilizowana; Vim (coc.nvim, vim-lsp), Emacs (lsp-mode), Sublime, Atom, JetBrains uzyskują wsparcie LSP.

2020
Semantic tokens i call hierarchy

LSP 3.16 dodaje semantic tokens, call hierarchy i moniker support — wzbogacając informację semantyczną dostępną dla klientów.

2024
LSP jako fundament agentów AI piszących kod
Punkt przełomowy

Cursor, Aider, Continue i Claude Code wykorzystują LSP do dostarczenia LLM semantycznego kontekstu o kodzie (definicje, referencje, diagnostyka), znacząco poprawiając jakość zmian generowanych przez modele.