HTML Diff
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>