语言的通用协议
2016 年 6 月 27 日,来自 VS Code 团队,@code
Visual Studio Code 是一个面向所有开发人员的编辑器,无论您使用何种编程语言。通过工具中捆绑的语言或市场中的扩展,我们支持超过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 采用,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