3.4 Language Server Protocol

语言服务器(Language Server)提供了诸如自动补全、定义跳转、代码格式化等与编程语言相关的功能。

Language Server Protocol(LSP)是编辑器/IDE与语言服务器之间的一种协议,通过JSON-RPC传输消息,可以让不同的编辑器/IDE方便嵌入各种编程语言,使得开发人员能在最喜爱的工具中使用各种语言来编写程序。

那么,使用LSP有什么好处呢?

在设计Visual Studio Code的语言功能时,Visual Studio Code的开发团队发现了3个常见的问题:

○ 首先,语言服务器通常是由原生的编程语言实现的。这就给Visual Studio Code集成这些语言服务器增加了难度,因为Visual Studio Code是基于Node.js运行时的。

○ 此外,语言功能经常会是资源消耗密集型的。比如,为了验证一个文件,语言服务器需要去解析大量的文件,生成抽象语法树,然后进行静态分析。这些操作往往会带来大量的CPU和内存使用量。与此同时,我们又需要保证Visual Studio Code的性能不受影响。

○ 最后,集成不同的语言工具和不同的编辑器需要进行大量的工作。从语言工具的角度来看,它们需要适应代码编辑器的不同API。从代码编辑器的角度来看,它们无法从不同的语言工具中获取统一的API。假设我们要在M个代码编辑器中支持N种语言,则我们的工作量将会是M×N

为了解决以上这些问题,微软设计出了LSP,把语言工具和代码编辑器之间的通信标准化。语言服务器可以使用任何语言编写,并且运行在自己的进程中,而不会影响代码编辑器的性能,通过LSP与代码编辑器进行通信。任何兼容LSP的语言工具都可以与多个兼容LSP的代码编辑器集成,同样地,任何兼容LSP的代码编辑器都可以快速集成多个兼容LSP的语言工具。LSP给语言工具和代码编辑器带来了双赢。如今,如果我们要在M个代码编辑器中支持N种语言,工作量将会从M×N变为M+N,总体工作量大大减少(如图3-1所示)。

图3-1 LSP示意图

其实,LSP最初只是为Visual Studio Code而开发的。到了2016年6月27日,微软宣布与Red Hat和Codenvy一起合作,标准化了Language Server Protocol的规范。如今,众多主流语言都已经有了相应的Language Server,许多编辑器/IDE也都支持了LSP,包括Visual Studio Code、Visual Studio、Eclipse IDE、Eclipse Che、Eclipse Theia、Atom、Sublime Text、Emacs、Qt Creator等。完整的名单可以到参考资料[8]中进行查询。