通用的语言协议
2016年6月27日,由 VS Code 团队发布,@code
Visual Studio Code 是一个面向任何开发人员的编辑器,无论您使用何种编程语言。无论是工具中捆绑的语言还是 Marketplace 中的扩展,我们都支持超过 150 种语言。我们还致力于开放式开发 VS Code,并使驱动 VS Code 的组件可用且开源。我们最著名的组件之一是 Monaco 编辑器,但驱动 VS Code 的另一项技术是一个 开放的、基于 JSON 的协议,任何人都可以通过实现“语言服务器”来为 VS Code 添加对新编程语言的支持。
任何语言,任何工具
今天在旧金山举行的 DevNation 大会上,我们与 Red Hat 和 Codenvy 共同宣布,该语言服务器协议现正被行业内的工具创建者和语言提供商广泛采用。对于语言创建者来说,这意味着他们的语言在各种开发工具和操作系统上都能获得增强的工具体验,类似于 TypeScript 开发人员或 C# 开发人员(通过 OmniSharp)今天所获得的体验。这也意味着任何开发人员都可以在任何工具上为其喜爱的编程语言获得一致的编辑体验——即使该工具不是 VS Code。
工作原理
Visual Studio Code 为许多编程语言提供了丰富的语言支持。对特定编程语言的支持由对该语言有深入理解的语言服务器提供。VS Code 与这些服务器通信,以实现丰富的编辑功能,如“错误与警告”、“重构”和“转到定义”。
下面是一个工具和语言服务器在日常编辑会话中如何通信语义信息的示例
-
用户在工具中打开一个文件(称为文档):工具通知语言服务器该文档已打开(
didOpen
),并且该文档的信息由工具在内存中维护。 -
用户进行编辑:工具通知服务器文档更改(
didChange
),程序的语义信息由语言服务器更新。在此过程中,语言服务器分析此信息并向工具通知发现的错误和警告(diagnostics
)。 -
用户对符号执行“转到定义”:工具向服务器发送
definition
请求。服务器响应包含定义的文档的uri
和文档内的range
。根据此信息,工具可以在定义位置打开相应的文档。 -
用户关闭文档(文件):工具发送
didClose
通知,告知语言服务器该文档现在不再位于内存中,而是由文件系统维护(即存储在文件系统上)。
这种通过 JSON-RPC 进行的通信,在典型的会话过程中会发生多次。
这种架构允许 VS Code 与多个语言服务器交互,每个服务器都可以用任何语言实现(独立于工具实现的语言),并支持各种功能,只要它使用通用的基于 JSON 的协议。
它还使得一个语言服务器可以一次实现,并被不同的工具利用。因此,协议已被 Codenvy 采用,他们已将其添加到下一代 Eclipse IDE Eclipse Che 中,并且 Red Hat 也在努力发布一个独立的 Java 语言服务器,该服务器可以被任何使用该协议的工具使用,这令人兴奋。
开放规范
该协议的完整规范可在公共 GitHub 仓库中获取,同时还有一份协议迄今为止的演进历史。随着它被越来越多的语言和工具采用,我们打算与 Red Hat、Codenvy 以及开源社区中的其他合作伙伴一起支持和发展该协议。任何人都可以像在其他任何开源项目上一样,在仓库上提问、提交问题或提交拉取请求。
下一步
这仅仅是个开始——诸如 OmniSharp (C#)、JSON、C++、xText、JavaFX 和 R 等编程语言社区已承诺将来会为其语言发布语言服务器。协议实现的完整列表,包括语言服务器、编辑器和 SDK,可在 GitHub 仓库中获取。
如果您想了解更多信息,请观看分组讨论会,查看 Red Hat 和 Eclipse Che 团队的博客文章,并访问 GitHub 上的语言服务器协议仓库。甚至还有一个语言服务器演练,您可以在其中逐步查看用 TypeScript 和 Node.js 实现的可用语言服务器的源代码。当然,您可以用任何语言实现语言服务器!
编码愉快!
VS Code 团队,@code