← Glossário
Desenvolvimento

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.
Analogia: O LSP é um intérprete simultâneo entre especialistas locais que falam todas as línguas do mundo com as regras de seus próprios países e uma assembleia diplomática internacional que ouve esses especialistas; não importa quem seja o editor na assembleia, a mensagem é transmitida perfeitamente.

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)
  1. 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).
  2. 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.
  3. 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.
  4. 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 →