O que é LSP?
Language Server Protocol
LSP (Language Server Protocol) é um protocolo aberto baseado em JSON-RPC que fornece comunicação padrão entre editores de código modernos e motores de análise de linguagens de programação.
1. Definição e o problema matemático que resolve: complexidade M × N
O Language Server Protocol (LSP) é um protocolo universal desenvolvido em 2016 sob a liderança da Microsoft (equipe do VS Code), Red Hat e Codenvy, que se tornou a pedra angular das ferramentas de desenvolvimento atuais.
A maior revolução trazida pelo LSP é a redução da complexidade M × N, que aflige o mundo do software há anos, para o nível M + N:
- Pré-LSP (M × N): Se existissem 5 editores de código populares no mercado (VS Code, Neovim, Sublime Text, Emacs, Eclipse) e 10 linguagens de programação populares (Python, Rust, Go, TypeScript, C++, etc.), seria necessário escrever e atualizar separadamente 5 × 10 = 50 extensões diferentes para fornecer preenchimento automático e verificação de sintaxe em cada linguagem.
- Pós-LSP (M + N): Cada comunidade de linguagem escreve apenas um "Language Server" (Servidor de Linguagem); cada desenvolvedor de editor integra apenas um "LSP Client" (Cliente). Resultado: 5 + 10 = 15 componentes. Uma nova linguagem de programação, ao escrever um único servidor LSP, torna-se perfeitamente funcional em todos os dezenas de editores do mercado desde o primeiro dia.
2. Como o LSP funciona? Arquitetura de protocolo e JSON-RPC 2.0
LSP, editör (Client) ile dil analiz motoru (Server) arasında genellikle yerel standart girdi/çıktı (stdin/stdout) veya yerel soketler (IPC) üzerinden çalışan bir JSON-RPC 2.0 mesajlaşma protokolüdür.
Processos pesados de análise semântica e resolução de tipos são executados em um processo do sistema operacional separado da thread principal do editor (thread de UI); dessa forma, mesmo em projetos de 100 mil linhas, seu editor nunca trava ou apresenta lentidão.
Ciclo Básico do Protocolo e Tipos de Requisição
Editör (LSP Client) Dil Sunucusu (Language Server)
│ │
│─────── textDocument/didOpen ──────────────>│ (Dosya açıldı, AST kurulur)
│─────── textDocument/didChange ───────────>│ (Kullanıcı harf yazdı, artımlı senk.)
│<────── textDocument/publishDiagnostics ────│ (Kırmızı dalgalı alt çizgi / Hatalar)
│ │
│─────── textDocument/completion ───────────>│ (Ctrl+Space: Öneriler istendi)
│<────── CompletionItem[] ───────────────────│ (Metot ve değişken listesi döner)
│ │
│─────── textDocument/definition ───────────>│ (F12: Tanıma git / Go to definition)
│<────── Location (Dosya, Satır, Sütun) ────│ (İlgili kaynak kod konumu açılır)- Inicialização (initialize): Quando o editor é iniciado, ele notifica o servidor sobre suas capacidades (client capabilities); o servidor, por sua vez, confirma quais recursos ele suporta (server capabilities).
- Sincronização de Documentos (didChange): À medida que o usuário escreve o código, apenas as linhas e intervalos de caracteres alterados (sincronização incremental de documentos) são transmitidos ao servidor, em vez do arquivo completo.
- Diagnóstico (publishDiagnostics): O servidor de linguagem atualiza a Árvore de Sintaxe Abstrata (AST) e a tabela de tipos em segundo plano, sem compilar o código. Se houver erros, ele envia as linhas de erro vermelhas para o editor como uma notificação assíncrona.
- Solicitações ricas (hover, preenchimento, renomear): Quando o usuário passa o mouse sobre uma função ou realiza uma renomeação, o servidor calcula todas as referências no projeto e retorna uma resposta.
3. Language Servers mais utilizados no ecossistema
- Rust: rust-analyzer (Inferência de tipos, expansões de macro e avisos do borrow checker extraordinariamente rápidos)
- Python: pyright / basedpyright / ruff (Verificação de tipos estática e linting em microssegundos com Ruff)
- Go: gopls (servidor com reconhecimento de módulos e pacotes, desenvolvido pela equipe oficial do Go)
- TypeScript / JS: vtsls / typescript-language-server (IntelliSense e refatoração)
- C / C++: clangd (baseado em LLVM, precisão superior em grandes projetos com compile_commands.json)
- Lua: lua-language-server (anotações de tipo personalizadas para desenvolvedores de plugins do Neovim)
4. LSP vs DAP vs LSIF / SCIP
- LSP (Language Server Protocol): Gerencia recursos inteligentes dinâmicos durante a escrita de código (autocompletar, detecção de erros, formatação).
- DAP (Debug Adapter Protocol): Gerencia operações de depuração em tempo de execução. Pontos de interrupção (breakpoints), monitoramento de variáveis e execução passo a passo comunicam-se através do DAP.
- SCIP / LSIF: São formatos de indexação estática que permitem que bases de código extensas sejam pré-indexadas em tempo de compilação, possibilitando a navegação no código em interfaces web sem a necessidade de executar um servidor.
Perguntas e respostas
O que significa LSP, qual é a sua definição?
Significa Language Server Protocol (Protocolo de Servidor de Linguagem). É um protocolo aberto que padroniza a comunicação entre editores de código e os motores de sintaxe, verificação de tipos e preenchimento automático das linguagens de programação.
Por que o LSP resolve o problema M × N?
No modelo antigo, para M linguagens e N editores, era necessário escrever M × N plugins específicos para cada editor. Com o LSP, cada linguagem escreve um único servidor e cada editor escreve um único cliente, alcançando a fórmula de integração M + N.
Como o LSP evita que o editor fique lento?
A análise pesada da árvore de sintaxe abstrata (AST) da linguagem e as resoluções de tipos são executadas em processos de segundo plano isolados do processo principal do editor (via JSON-RPC); assim, a interface nunca trava.
Qual é a diferença entre DAP e LSP?
Enquanto o LSP analisa a escrita de código, o preenchimento de código e os erros de sintaxe, o DAP (Debug Adapter Protocol) permite que o código seja depurado passo a passo em tempo de execução, definindo pontos de interrupção (breakpoints).
Termos relacionados
Ferramentas relacionadas
Esta explicação foi escrita em linguagem simples para a TreScout com IA e traduzida automaticamente do original em turco · a versão turca é a que vale. Se algo parecer errado ou faltando, escreva para hello@trescout.com. Ler em turco →