0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p><em>В 2016 году компания Microsoft сделала две очень важные для разработчиков вещи - выпустила редактор Visual Studio Code, который разом изменил всю экосистему для программистов, а также представила протокол языкового сервера LSP. Мы<a>перевели</a>статью сервиса FreeCodeCamp - о том, как LSP меняет будущее IDE, в том числе и Visual Studio Code, и почему этого никто не замечает.</em></p>
1
<p><em>В 2016 году компания Microsoft сделала две очень важные для разработчиков вещи - выпустила редактор Visual Studio Code, который разом изменил всю экосистему для программистов, а также представила протокол языкового сервера LSP. Мы<a>перевели</a>статью сервиса FreeCodeCamp - о том, как LSP меняет будущее IDE, в том числе и Visual Studio Code, и почему этого никто не замечает.</em></p>
2
<h2>Содержание</h2>
2
<h2>Содержание</h2>
3
<ul><li><a>Что такое LSP?</a></li>
3
<ul><li><a>Что такое LSP?</a></li>
4
<li><a>Зачем нужен LSP?</a></li>
4
<li><a>Зачем нужен LSP?</a></li>
5
<li><a>Что такое JSON-RPC?</a></li>
5
<li><a>Что такое JSON-RPC?</a></li>
6
<li><a>LSP + JSON-RPC</a></li>
6
<li><a>LSP + JSON-RPC</a></li>
7
<li><a>Почему это вообще важно?</a></li>
7
<li><a>Почему это вообще важно?</a></li>
8
<li><a>Будущее IDE</a></li>
8
<li><a>Будущее IDE</a></li>
9
</ul><h2>Что такое LSP?</h2>
9
</ul><h2>Что такое LSP?</h2>
10
<p>Протокол языкового сервера (LSP) - это способ (или протокол) общения с языковыми серверами, такой же как HTTP или FTP. Языковые серверы - это специальные программы, которые работают на обычных серверах. Они принимают мета-состояние редактора, в котором пишется код: например, где находится курсор в редакторе и на что он наведён прямо сейчас. После анализа они возвращают набор инструкций, какое действие можно выполнить на текущем токене, если пользователь использует специальные сочетания клавиш.</p>
10
<p>Протокол языкового сервера (LSP) - это способ (или протокол) общения с языковыми серверами, такой же как HTTP или FTP. Языковые серверы - это специальные программы, которые работают на обычных серверах. Они принимают мета-состояние редактора, в котором пишется код: например, где находится курсор в редакторе и на что он наведён прямо сейчас. После анализа они возвращают набор инструкций, какое действие можно выполнить на текущем токене, если пользователь использует специальные сочетания клавиш.</p>
11
<p>Эта связь происходит с использованием набора правил, определенных протоколом. Протокол языкового сервера можно рассматривать как урезанную версию HTTP, который обменивается данными только через JSON-RPC.</p>
11
<p>Эта связь происходит с использованием набора правил, определенных протоколом. Протокол языкового сервера можно рассматривать как урезанную версию HTTP, который обменивается данными только через JSON-RPC.</p>
12
<h2>Зачем нужен LSP?</h2>
12
<h2>Зачем нужен LSP?</h2>
13
<p>Вы постоянно видите сообщения об ошибках и автопредложения для изменения кода, которые появляются в VSCode? Как так получается, что просто добавив расширение из магазина VSCode, вы получите всю мощь технологии автодополнения IntelliSense для совершенно другого языка, такого как C, Python, Java? Как раз это и происходит из-за LSP.</p>
13
<p>Вы постоянно видите сообщения об ошибках и автопредложения для изменения кода, которые появляются в VSCode? Как так получается, что просто добавив расширение из магазина VSCode, вы получите всю мощь технологии автодополнения IntelliSense для совершенно другого языка, такого как C, Python, Java? Как раз это и происходит из-за LSP.</p>
14
<p>Поддержка автозаполнения и IntelliSense для HTML/CSS/JavaScript поставляется с VSCode (так же, как PyCharm поставляется с поддержкой Python). Однако такая же поддержка других языков может быть реализована с использованием протокола языкового сервера для этих языков.</p>
14
<p>Поддержка автозаполнения и IntelliSense для HTML/CSS/JavaScript поставляется с VSCode (так же, как PyCharm поставляется с поддержкой Python). Однако такая же поддержка других языков может быть реализована с использованием протокола языкового сервера для этих языков.</p>
15
<h2>Что такое JSON-RPC?</h2>
15
<h2>Что такое JSON-RPC?</h2>
16
<p>JSON-RPC означает удаленный вызов процедуры JSON. Эта архитектура аналогична архитектуре REST, в которой основной единицей является вызов процедуры, а не конечная точка API, как в случае с REST.</p>
16
<p>JSON-RPC означает удаленный вызов процедуры JSON. Эта архитектура аналогична архитектуре REST, в которой основной единицей является вызов процедуры, а не конечная точка API, как в случае с REST.</p>
17
<p>В этом примере мы отправляем полезные данные в кодировке JSON в соответствии со спецификацией RPC. Если сервер корректно настроен для обработки JSON-RPC, он выполнит метод runThisFunction с переданными параметрами, после чего вернет результат, как показано в примере выше.</p>
17
<p>В этом примере мы отправляем полезные данные в кодировке JSON в соответствии со спецификацией RPC. Если сервер корректно настроен для обработки JSON-RPC, он выполнит метод runThisFunction с переданными параметрами, после чего вернет результат, как показано в примере выше.</p>
18
<h2>LSP + JSON-RPC</h2>
18
<h2>LSP + JSON-RPC</h2>
19
<p>LSP использует JSON-RPC для связи с удаленным сервером. Это должно соответствовать такому формату:</p>
19
<p>LSP использует JSON-RPC для связи с удаленным сервером. Это должно соответствовать такому формату:</p>
20
<p>Например:</p>
20
<p>Например:</p>
21
<p>LSP требует, чтобы вы передали заголовок Content-Length, за которым следует два переноса строки CRLF \r\n. Когда запущенные языковые серверы, такие как ccls, получат это, ответ придет подобным сообщением:</p>
21
<p>LSP требует, чтобы вы передали заголовок Content-Length, за которым следует два переноса строки CRLF \r\n. Когда запущенные языковые серверы, такие как ccls, получат это, ответ придет подобным сообщением:</p>
22
<p>В этом примере вы можете видеть, что ccls говорит об отсутствии вызываемого метода runThisFunction. Однако удаленный сервер на это так же отвечает с заголовком Content-Length, согласно спецификации JSON-RPC</p>
22
<p>В этом примере вы можете видеть, что ccls говорит об отсутствии вызываемого метода runThisFunction. Однако удаленный сервер на это так же отвечает с заголовком Content-Length, согласно спецификации JSON-RPC</p>
23
<h2>Почему это вообще важно?</h2>
23
<h2>Почему это вообще важно?</h2>
24
<p>С введением протокола LSP компания Microsoft свела знаменитую M*N проблему к M+N проблеме.</p>
24
<p>С введением протокола LSP компания Microsoft свела знаменитую M*N проблему к M+N проблеме.</p>
25
<p>M - это разные языки (C, C ++, PHP, Python, Node, Swift, Go и т. д.)</p>
25
<p>M - это разные языки (C, C ++, PHP, Python, Node, Swift, Go и т. д.)</p>
26
<p>N - разные редакторы (VSCode, Eclipse, Notepad ++, Sublime Text и т. д.)</p>
26
<p>N - разные редакторы (VSCode, Eclipse, Notepad ++, Sublime Text и т. д.)</p>
27
<p>Раньше, чтобы редакторы M поддерживали N-языки, нужно было реализовать M*N решений. При этом поддержка языков должна была быть нативной. Сделав это однажды, кто угодно сможет интегрировать поддержку своего языка в редактор кода, даже если тот его "не знает". При этом во время работы с LSP редактор даже не будет знать, с каким языком сейчас работает пользователь.</p>
27
<p>Раньше, чтобы редакторы M поддерживали N-языки, нужно было реализовать M*N решений. При этом поддержка языков должна была быть нативной. Сделав это однажды, кто угодно сможет интегрировать поддержку своего языка в редактор кода, даже если тот его "не знает". При этом во время работы с LSP редактор даже не будет знать, с каким языком сейчас работает пользователь.</p>
28
<h2>Будущее IDE</h2>
28
<h2>Будущее IDE</h2>
29
<p>По мере того, как все больше и больше языков переходят на свои языковые серверы, люди получат большое количество редакторов и смогут выбрать наилучший для себя</p>
29
<p>По мере того, как все больше и больше языков переходят на свои языковые серверы, люди получат большое количество редакторов и смогут выбрать наилучший для себя</p>
30
<p>В будущем пользователям больше не придется использовать только XCode для разработки на Swift, или PyCharm для Python. И не только это, ведь LSP может быть реализован на JavaScript для поддержки прямо в браузере! Прекрасное будущее уже почти наступило!</p>
30
<p>В будущем пользователям больше не придется использовать только XCode для разработки на Swift, или PyCharm для Python. И не только это, ведь LSP может быть реализован на JavaScript для поддержки прямо в браузере! Прекрасное будущее уже почти наступило!</p>