LSP(Language Server Protocol)简介
概述
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) ——鲁迅
果然所有问题都可以通过增加一层解决,如果一层不够,就再加一层
运行机制
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 }
}
},
}
最后客户端根据返回值中的参数,让当前用户的编辑光标跳转到指定位置。
参考:
LSP(Language Server Protocol)简介的更多相关文章
- 如何把VS Code的Language Server Protocol整合到Eclipse中来
Eclipse官方已经在着手做这件事情了,在Oxygen中,Eclipse提供了LSP4E扩展点(language server protocal for eclipse)来支持language se ...
- SMB2 Protocol – 简介(应用层协议主要用于在计算机间共享文件、打印机、串口等)
SMB2 Protocol – 简介 SMB协议简介: 服务器信息块(SMB)协议是一个应用层协议主要用于在计算机间共享文件.打印机.串口等. 在介绍SMB协议的时候,一般提到使用的端口为139,44 ...
- Language Server for Java™ 1.0 在VS Code上正式发布!
Nick Zhu form Senior Program Manager, Developer Division at Microsoft 今天,我们很高兴与大家宣布:Language Server ...
- 第三篇——第二部分——第一文 SQL Server镜像简介
原文:第三篇--第二部分--第一文 SQL Server镜像简介 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26951563 镜像是什 ...
- 第十六周翻译-SQL Server复制的阶梯:第1级 - SQL Server复制简介
SQL Server复制的阶梯:第1级 - SQL Server复制简介 作者:Sebastian Meine,2012年12月26日 翻译:赖慧芳 译文: 该系列 本文是Stairway系列的一部 ...
- vscode + gradle 创建 java 项目 - java language server无法启动
1.在系统上安装一个版本的gradle,用`gradle init --type java-application`创建一个默认的java项目,假设项目目录是hellojava 2.vscode写ja ...
- SQL server 2008 简介
一.简介 网状模型 关系模型(独立表) 拆分成有主键的表.连接表即可. 工资与奖金有了依赖关系.所以可以不保存奖金,计算得出结果. 二. 1. 2.环境配置 安装iis服务 https://jingy ...
- SQL Server 数据类型简介
在 SELECT 的查询过程和查询结果中,每个列.变量.表达式和参数都具有一个相关的数据类型.数据类型用于指定某个对象可保存的数据的类型. SQL Server系统的数据类型主要有:数值类型.日期和时 ...
- Windows Server 2016-Telnet 简介及安装
Telnet是基于请求注释(RFC)854的因特网标准程序和协议,该RFC规定了一种在网络上发送和接收未加密的ASCII字符(明文)的方法.Telnet包含两个功能模块:Telnet客户端和Telne ...
- Server JRE 简介
Server JRE, 服务器版JRE JRE安装包, JDK安装包, 以及 Server JRE 压缩包, 在 Java SE Download 页面都可以下载: http://www.oracle ...
随机推荐
- 使用docker运行nginx服务,挂载自定义配置文件
错误命令: 下面的方式,启动容器时,-d 后面跟一个指定容器ID的参数写在前面,导致容器不能正常启动,出现异常 docker run --name testnginx -d 7f0fd59e0094 ...
- 提升团队协作效率:欧奥PicHome打造无缝资料共享平台
1. 引言 在快节奏的工作环境中,团队成员需要快速访问和共享信息.有效的资料共享不仅提高工作效率,还能促进团队协作和创新.然而,许多团队仍在使用传统的文件共享方法,这些方法往往效率低下,难以满足现代工 ...
- C# PaddleOCR 车牌识别
效果 车牌识别测试地址 http://47.108.88.211/manual/VehPlateTest.html 通用OCR识别测试地址 http://47.108.88.211/manual/OC ...
- FTP上传中文文件,内容乱码
记录一下: spring boot 程序 ftp上传中文文件,内容乱码. 1.刚开始程序部署在Windows平台上测试,发现上传后的文件内容是乱码,查看文件编码格式是ANSI(Windows下文本文件 ...
- KinbaseES 优化之IO优化
IO 资源作为目前服务器中最昂贵的资源之一,是目前绝大部分业务系统主要的瓶颈资源,原因就在于服务器相关的硬件资源中IO资源的性能提升是难度最大的.存储的发展步伐远低于内存和CPU的发展. 在数据库管理 ...
- 【已解决】MySQL数据库8.0版本 连接失败错误码1251
错误原因: 是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password 解决方式: 1. cmd 进入 ...
- 浅谈ET框架--ECS设计核心(一)
ET框架的ECS设计核心可以总结为一句话,那就是: 继承转组件,多态转分发 OOP设计里的继承更换为组件Component模式,多态转成分发模式. 框架代码里头的案例: 数值组件挂载Entity上. ...
- C# Dev GridControl小结
1. 如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 2. 如何新增一条记录 (1).gridView.Ad ...
- .NET服务发现(Microsoft.Extensions.ServiceDiscovery)集成Consul
随着Aspire发布preview5的发布,Microsoft.Extensions.ServiceDiscovery随之更新, 服务注册发现这个属于老掉牙的话题解决什么问题就不赘述了,这里主要讲讲M ...
- Linux之网络排错
Linux 网卡收包流程如下 网卡收到数据包 将数据包从网卡硬件缓存移动到服务器内存中(DMA方式,不经过CPU) 通过硬中断通知CPU处理 CPU通过软中断通知内核处理 经过TCP/IP协议栈处理 ...