Izdanje Visual Studio Code-a jednim je utjecajem utjecalo na ekosustav programera na takav način da sada nema povratka. Otvoreni je izvor, besplatan i što je najvažnije, super moćan alat.
No, s VSCodeom, Microsoft je 2016. godine oživio još jednu super važnu stvar, koja je manje poznata. Zove se Language Server Protocol.
Što je protokol jezičnog poslužitelja?
Protokol jezičnog poslužitelja (LSP) protokol je ili način razgovora s jezičnim poslužiteljima (baš poput HTTP-a ili FTP-a).
Jezični poslužitelji su posebni programi koji se izvode na redovnim poslužiteljima. Oni preuzimaju meta stanje uređivača u kojem kodirate (na primjer, gdje se kursor trenutno nalazi unutar uređivača, nad kojim tokenom trenutno lebdite) i vraćaju niz radnji / uputa - koji token treba pojaviti se sljedeće, što bi se trebalo dogoditi kad CMD / Ctrl kliknete na taj žeton i tako dalje.
Ova se komunikacija događa pomoću skupa pravila definiranih protokolom. Na protokol jezičnog poslužitelja moglo bi se gledati kao na skraćenu verziju HTTP-a i komunicira samo na JSON-RPC.
Zašto je potreban LSP?
Vidite li one fensi autosugestije i poruke o pogreškama koje se stalno pojavljuju u VSCodeu? I kako, samo dodavanjem jednostavnog proširenja s tržišta VSCode, dobivate svu onu IntelliSense snagu za potpuno drugačiji jezik kao što su C, Python, Java i tako dalje? To dolazi od LSP-a.
Podrška za automatsko dovršavanje i IntelliSense za HTML / CSS / JavaScript dolazi pečena u VSCode (baš kao što se PyCharm isporučuje s podrškom za Python). Međutim, ista podrška za druge jezike može se implementirati pomoću jezičnog protokola za te jezike.

Što je JSON-RPC?
JSON-RPC je kratica za JSON daljinski postupak. To je arhitektura (slična onoj kako je REST arhitektura), ali s temeljnom jedinicom koja je poziv procedure, a ne API krajnja točka u slučaju REST.
Evo jednostavnog korisnog tereta za 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 }
U ovom primjeru šaljemo JSON kodirani teret slijedeći RPC specifikaciju. Ako je poslužitelj konfiguriran da ispravno obrađuje JSON-RPC, izvršit će metodu runThisFunction
s prosljeđenim parametrima i vratiti rezultat u obliku kao što je prikazano.
LSP + JSON-RPC
LSP koristi JSON-RPC za komunikaciju s udaljenim poslužiteljem. Slijedi ovo:
Content-Length: \r\n\r\n
Da napišem primjer, bit će ovako:
Content-Length: 78 {"jsonrpc":"2.0","method":"runThisFunction","params":["some-param",2],"id":1}
LSP zahtijeva da proslijedite Content-Length
zaglavlje nakon kojeg slijede 2 CRLF
tokena \r\n
. Kad poslužitelji s pokrenutim jezicima poput ccls
ovoga prime, odgovorit će odgovarajućom porukom:

Naravno, u gornjem primjeru možete vidjeti da se ccls
kaže da ne postoji pozvana metoda runThisFunction
. Ali možete vidjeti da udaljeni poslužitelj također odgovara Content-Length
zaglavljem s JSON-RPC specifikacijom.
Zašto je sve ovo važno?
Uvođenjem formalnog protokola LSP, Microsoft je slavni M x N
problem sveo na M + N
problem.
M = Različiti jezici (C, C ++, PHP, Python, Node, Swift, Go, itd.)
N = Različiti urednici (VSCode, Eclipse, Notepad ++, Sublime Text, itd.)

Prije toga, da bi M urednici podržavali N jezika, trebaju vam M * N rješenja. Odnosno, svaki je urednik morao različito implementirati matičnu podršku za svaki jezik.
Uvođenjem LSP-a urednik je trebao samo implementirati podršku za protokol jezičnog poslužitelja. Jednom kad je to učinio, svatko tko napravi jezični poslužitelj (slijedeći LSP standarde) može se neprimjetno integrirati s uređivačem, bez da urednik ikada inteligentno "zna" s kojim jezikom radi!
Budućnost IDE-a
Kako sve više jezika izlazi sa svojim jezičnim poslužiteljima, ljudi će imati više mogućnosti odabrati uređivač koji im se najviše sviđa.
Više se nećete morati držati samo XCode za Swift razvoj ili PyCharm za Python. I ne samo to, već se i LSP-ovi mogu implementirati izravno u JavaScript kako bi podržali IntelliSense u pregledniku kao što to radim na codedamn, platformi za razvoj i razvoj programera! Uzbudljivo je vrijeme biti živ!
Mir,
Mehul