Lansarea Visual Studio Code a influențat singură ecosistemul dezvoltatorului în așa fel încât să nu mai existe înapoi. Este open source, gratuit și cel mai important, un instrument super puternic.

Dar, cu VSCode, Microsoft a dat viață unui alt lucru super important în 2016, care este mai puțin cunoscut. Se numește Language Server Protocol.

Ce este Protocolul pentru server de limbă?

Language Server Protocol (LSP) este un protocol sau un mod de a vorbi cu serverele de limbă (la fel ca HTTP sau FTP).

Serverele lingvistice sunt programe speciale care rulează pe servere obișnuite. Aceștia iau starea meta a editorului în care codificați (de exemplu, unde se află cursorul în interiorul editorului, jeton pe care îl plasați acum) și returnează un set de acțiuni / instrucțiuni – ce jeton ar trebui apare în continuare, ce ar trebui să se întâmple când faceți clic pe CMD / Ctrl pe acel simbol și așa mai departe.

Această comunicare are loc utilizând un set de reguli definite de protocol. Protocolul pentru serverul de limbă ar putea fi gândit ca o versiune redusă a HTTP și comunică numai pe JSON-RPC.

De ce este necesar LSP?

Vedeți acele mesaje de autosugestie fanteziste și de eroare care apar tot timpul în VSCode? Și cum, doar prin adăugarea unei extensii simple de pe piața VSCode, obțineți toată puterea IntelliSense pentru un limbaj complet diferit, cum ar fi C, Python, Java și așa mai departe? Asta vine de la LSP.

Suportul pentru completarea automată și IntelliSense pentru HTML / CSS / JavaScript sunt furnizate în VSCode (la fel cum PyCharm este furnizat cu suport Python). Cu toate acestea, același suport pentru alte limbi poate fi implementat folosind Language Server Protocol pentru aceste limbi.

Editor LSP în Monaco

Ce este JSON-RPC?

JSON-RPC înseamnă JSON Remote Procedure Call. Este o arhitectură (similară cu modul în care REST este o arhitectură), însă unitatea fundamentală este mai degrabă un apel de procedură decât un punct final API în cazul REST.

Iată o sarcină utilă simplă pentru JSON-RPC:

// Request
curl -X POST —data '{
  "jsonrpc": "2.0",
  "method": "runThisFunction",
  "params": [ "some-param", 2 ],
  "id": 1
}'
// Response
{
  "jsonrpc": "2.0",
  "result": "codedamn",
  "id": 1
}

În acest exemplu, trimitem o sarcină utilă codificată JSON în urma specificațiilor RPC. Dacă serverul este configurat pentru a gestiona corect JSON-RPC, acesta va executa metoda runThisFunction cu parametrii trecuți și returnează rezultatul în formularul așa cum se arată.

LSP + JSON-RPC

LSP folosește JSON-RPC pentru a comunica cu serverul de la distanță. Urmează acest lucru:

Content-Length: <bytes of JSON>rnrn<json-payload>

Pentru a scrie un exemplu, va fi așa:

Content-Length: 78

{"jsonrpc":"2.0","method":"runThisFunction","params":["some-param",2],"id":1}

LSP vă cere să treceți Content-Length antet urmat de 2 CRLF jetoane rn. Când serverele de limbă care rulează ca ccls primiți acest lucru, ei vor răspunde cu un mesaj adecvat:

server ccls

Desigur, în exemplul de mai sus, puteți vedea asta ccls spune că nu există o metodă numită runThisFunction. Dar puteți vedea că serverul la distanță răspunde și cu un Content-Length antet cu o specificație JSON-RPC.

De ce contează toate acestea?

Odată cu introducerea unui protocol formal LSP, Microsoft a redus faimosul M x N problemă la o M + N problemă.

M = diferite limbi (C, C ++, PHP, Python, Node, Swift, Go etc.)
N = editori diferiți (VSCode, Eclipse, Notepad ++, Sublime Text etc.)

Screenshot 2020 04 02 at 8.30.21 PM

Anterior, pentru ca editorii M să accepte N limbi, aveți nevoie de soluții M * N. Adică, fiecare editor trebuia să implementeze suport nativ pentru fiecare limbă în mod diferit.

Odată cu introducerea LSP, editorul avea nevoie doar de implementarea suportului pentru Protocolul de server de limbă. Odată ce a făcut-o, oricine creează un server de limbă (urmând standardele LSP) poate fi integrat perfect cu editorul, fără ca editorul să „știe” în mod inteligent cu ce limbă lucrează!

Viitorul IDE-urilor

Pe măsură ce din ce în ce mai multe limbi apar cu serverele lor de limbă, oamenii vor avea mai multă capacitate de a alege editorul care le place cel mai mult.

Nu va mai trebui să rămâneți doar la XCode pentru dezvoltarea Swift sau PyCharm pentru Python. Nu numai acest lucru, dar și LSP-urile pot fi implementate direct în JavaScript pentru a suporta IntelliSense în browser, așa cum fac eu la codedamn, o platformă pentru ca dezvoltatorii să învețe și să crească! Este un moment interesant pentru a fi în viață!

Pace,
Mehul