首页 > 其他分享 >LSP(Language Server Protocol)简介

LSP(Language Server Protocol)简介

时间:2024-01-23 11:44:19浏览次数:28  
标签:java Language Server 编辑器 LSP Protocol IDE

概述

Language Server Protocol(LSP)是微软2016年提出的一项通讯协议方案。该方案定义了一套协议,用于在IDE或编辑器和提供代码补全、转到定义等功能的Language Server之间通信。
官方释义如下:

The Language Server Protocol (LSP) defines the protocol used between an editor or IDE and a language server that provides language features like auto complete, go to definition, find all references etc. The goal of the Language Server Index Format (LSIF, pronounced like "else if") is to support rich code navigation in development tools or a Web UI without needing a local copy of the source code.

通俗地说,就是定义了一套通信规范,用于给IDE实现代码编辑工具的功能。

解决的问题

微软提出 LSP 的目的是,之前各个编辑器(VSCode, Vim, Atom, Sublime...)各自为战,编辑器内部实现的特性和协议都不同。每换一个编辑器,就有可能要给该编辑器中支持的每门语言写一个对应的 Language Server,也就是说假设有 n 门语言,m 个编辑器,那全部编辑器适配所有语言的开发成本和复杂度为 n * m。

能不能在中间层做一个抽象,让语言的「静态分析服务」和「编辑器 / IDE」分离开来?这样上述情景下开发成本和复杂度就可以降低为线性的 n + m。

例如,每个编辑器(客户端)都在用户产生某些通用的行为时(比如点击跳转到定义)负责生成标准中的行为事件,然后以 JSON-RPC 的形式去调用 Language Server 的接口方法。Language Server 相对应地,也必须实现全部 LSP 规范(或者至少实现其中关键部分)定义的接口。

这么做的好处在于,对于某门编程语言,一个编辑器工具不需要再去关心怎么去做代码分析,而是只需要关注如何在界面上发起或响应 LSP 规定的 RPC 事件。而在语言服务器这边也是同理,只需要关注协议本身的事件并响应 & 发起事件即可。

另外,由于编辑器和 Language Server 是两个进程,所以如果 Language Server 挂了,编辑器进程本身也还会存在,用户不用担心还没修改好的代码因此丢失的问题。

有没有缺点?肯定有,那就是市面上所有的 编辑器 和 Language Server 的 maintainer 都需要花时间和精力去兼容这个协议,并且这个协议本身也会随着自身版本更新而要求服务端 / 客户端响应新的协议行为。但是总体来说,利大于弊。

在计算机科学中的任何问题,都可以用加上另一层间接参照来解决。(Any problem in computer science can be solved with another level of indirection) ——鲁迅

果然所有问题都可以通过增加一层解决,如果一层不够,就再加一层

image

运行机制

LSP 是一个「双工协议」。

不只是开发者工具(客户端)会主动向 Language Server (服务端)通信,服务端也可能主动向开发者工具发起 RPC 请求。

在 LSP 规范定义文档 中,每个 RPC 事件会标注可能的发起方以及是否需要对方做出响应。

举个例子具体了解一下LSP的运作。

比如要实现Goto Type Definition的功能:
右键菜单点击了Goto Type Definition选项后,IDE会向 Language Server 进程以 IPC 形式发送如下信息(仅举例,实际参数结构比较复杂):

  "jsonrpc": "2.0",
  "id": 24,
  "method": "textDocument/typeDefinition",
  "params": {
    "textDocument": {
      "uri": "file:///User/bytedance/java-hello/src/main/java/Main.java"
    },
    "position": {
      "line": 3,
      "character": 13
    },
    // ...其他参数
  },
}

然后 Language Server 拿到这条指令,会执行如下动作:

调用的方法是 textDocument/typeDefinition,也就是分析一个符号的类型定义信息。
根据参数,指令的来源文件是 Main.java 第 3 行第 13 个字符 —— 分析后可知是 foo 这个符号。
Server 寻找 foo 的符号对应的类型 Foo 所在位置。找到之后,同样通过 IPC 返回结果 JSON-RPC:

  "jsonrpc": "2.0",
  // Request 中的 id 为 24,因此 Server 端对应的 Response id 也必须为 24
  "id": 24,
  "result": {
    "uri": "file:///User/bytedance/java-hello/src/main/java/Main.java",
    "range": {
      "start": { "line": 7, "character": 25 },
      "end": { "line": 7, "character": 28 }
    }
  },
}

最后客户端根据返回值中的参数,让当前用户的编辑光标跳转到指定位置。

参考:

微软官方文档

标签:java,Language,Server,编辑器,LSP,Protocol,IDE
From: https://www.cnblogs.com/-867259206/p/17981984

相关文章

  • CF1424M Ancient Language 题解
    1.题意描述一本字典中有\(r\)\((1\leqr\leq10^6)\)个单词,单词长度不超过$10^3$,所有字母都是小写英文字母,但字母排序不是按英文字母排序,求所有出现字母的一种排序,如果不存在,输出"IMPOSSIBLE"。2.题目分析由排序规则可知,对于字符串\(s\)和\(t\),\(s\)排在\(t\)......
  • IPP(Internet Printing Protocol)CUPS(Common Unix Printing System)
    IPP(InternetPrintingProtocol)是一个网络打印协议,用于在客户端和打印服务器之间进行通信和管理打印任务。而CUPS(CommonUnixPrintingSystem)是一个实现了IPP协议的打印系统框架。具体来说,以下是IPP组件和CUPS之间的区别:IPP组件:IPP组件是指实现了IPP协议规范的软件、库或模块......
  • LSP 网络劫持(Layered Service Provider Hijacking)
    LSP简介:分层服务提供商(LayeredServiceProvider,LSP)是一种可以扩展Winsock作为应用程序的Windows的网络套接字工具的机制。WinsockLSP可用于非常广泛的实用用途,包括Internet家长控制(parentalcontrol)和Web内容筛选。在以前版本的WindowsXP中,删除不正确的(也称......
  • LSP 网络劫持(Layered Service Provider Hijacking)
    LSP简介:分层服务提供商(LayeredServiceProvider,LSP)是一种可以扩展Winsock作为应用程序的Windows的网络套接字工具的机制。WinsockLSP可用于非常广泛的实用用途,包括Internet家长控制(parentalcontrol)和Web内容筛选。在以前版本的WindowsXP中,删除不正确的(也称......
  • 【VSCode】CMake Language Support 总是下载 .NET 超时,但又不想升级dotnet
    错误信息Error:Couldnotresolvedotnetpath!Anerroroccurredwhileinstalling.NET(6.0):.NETAcquisitionFailed:Installationfailed:Error:.NETinstallationtimedout.Youmayneedtochangethetimeouttimeifyouhaveaslowconnection.Pleasesee:h......
  • No appropriate protocol (protocol is disabled or cipher suites are inappropriate
    问题原因:jdk版本过高导致,jdk1.8高版本对ssl做了限制1、在URL中添加在数据库后面添加?createDatabaseIfNotExist=true&useSSL=false2、修改JDK下的为java.security文件文件里查找:jdk.tls.disabledAlgorithms= 然后把红色部分删除。3、直接降低jdk版本(本人将jdk1.8.0_29......
  • [转帖]SecurityProtocolType 枚举
    https://learn.microsoft.com/zh-cn/dotnet/api/system.net.securityprotocoltype?view=net-8.0 命名空间:System.Net程序集:System.Net.ServicePoint.dll指定Schannel安全包支持的安全协议。此枚举支持其成员值的按位组合。C#复制 [System.Flags]publicenum......
  • Diffie-Hellman Key Agreement Protocol 安全漏洞 (CVE-2002-20001)【原理扫描】
    Diffie-HellmanKeyAgreementProtocol是一种密钥协商协议。它最初在Diffie和Hellman关于公钥密码学的开创性论文中有所描述。该密钥协商协议允许Alice和Bob交换公钥值,并根据这些值和他们自己对应的私钥的知识,安全地计算共享密钥K,从而实现进一步的安全通信。仅知道交换......
  • TI 专访 Merlin Protocol:构建在比特币网络上的资产适配协议
    近期BTC生态上铭文的热度和流量为市场带起了一波小的高潮。越来越多的用户开始关注BRC-20赛道。但作为铭文,BRC-20稀缺的应用场景和价值也一直为人们所诟病。MerlinProtocol,一个构建在比特币网络上的资产适配协议,提出了自己独特的解决方案。今天,我们邀请到了MerlinProtocol......
  • InstructGPT《InstructGPT: Training language models to follow instructions with h
    背景GPT-3虽然在各大NLP任务以及文本生成的能力上令人惊艳,但是他仍然还是会生成一些带有偏见的,不真实的,有害的造成负面社会影响的信息,而且很多时候,他并不按人类喜欢的表达方式去说话。在这个背景下,OpenAI提出了一个概念“Alignment”,意思是模型输出与人类真实意图对齐,符合人......