语言通用协议

2016年6月27日由 VS Code 团队发布,@code

Visual Studio Code 是一款面向所有开发者的编辑器,无论你使用什么编程语言。无论是工具中自带的语言还是 Marketplace 中的扩展,我们支持的语言已超过 150 种。我们还致力于以开源方式开发 VS Code,并使驱动 VS Code 的组件公开且开源。我们最知名的组件之一是 Monaco 编辑器,而驱动 VS Code 的另一项技术是一个基于 JSON 的开放协议,任何人都可以通过实现“语言服务器”(language server)为 VS Code 添加对新编程语言的支持。

any developer any language any tool

任何语言,任何工具

今天在旧金山举行的 DevNation 会议上,我们与 Red Hat 和 Codenvy 一起宣布,该语言服务器协议现在正被整个行业的工具创作者和语言提供商所采用。对于语言创建者而言,这意味着他们的语言在各种开发工具和操作系统上都将拥有增强的工具体验,类似于 TypeScript 开发者或 C# 开发者(通过 OmniSharp)目前所享有的体验。这也意味着任何开发者都可以在任何工具上为其喜爱的编程语言获得一致的编辑体验——即使该工具并非 VS Code。

工作原理

Visual Studio Code 为许多编程语言提供了丰富的语言支持。对特定编程语言的支持由深入理解该语言的语言服务器驱动。VS Code 与这些服务器进行通信,以启用诸如“错误和警告”(Errors & Warnings)、“重构”(Refactor)和“转到定义”(Go To Definition)等丰富的编辑功能。

language server protocol

以下是工具和语言服务器如何在日常编辑会话期间通信语义信息的示例:

  • 用户在工具中打开一个文件(称为文档):工具通知语言服务器文档已打开(didOpen),并且该文档的信息由工具保留在内存中。

  • 用户进行编辑:工具将文档更改通知服务器(didChange),程序语义信息由语言服务器更新。在此过程中,语言服务器会分析这些信息,并将发现的错误和警告(diagnostics)通知工具。

  • 用户对某个符号执行“转到定义”:工具向服务器发送 definition 请求。服务器返回包含该定义所在文档的 uri 以及文档中的 range 的响应。基于这些信息,工具可以在定义位置打开对应的文档。

  • 用户关闭文档(文件):工具发送 didClose 通知,告知语言服务器该文档已不在内存中,而是改由文件系统维护(即存储在文件系统上)。

这种通过 JSON-RPC 进行的通信在常规会话期间会发生多次。

language server sequence

这种架构使 VS Code 能够与多个语言服务器进行交互。只要利用通用的基于 JSON 的协议,每个语言服务器都可以用任何语言实现(与工具自身的实现语言无关),并支持各种功能。

它还使得某个语言服务器只需实现一次,即可被不同的工具所利用。正因如此,该协议被 Codenvy 采纳并加入到新一代 Eclipse IDE Eclipse Che 中,同时也被 Red Hat 采纳(他们正致力于发布一个可供任何利用该协议的工具调用的独立 Java 语言服务器),这令人无比兴奋。

开放规范

该协议的完整规范可在公开的 GitHub 仓库中获取,其中还记录了该协议迄今为止的演进历史。随着它继续被更多语言和工具所采用,我们打算与 Red Hat、Codenvy 以及开源社区中的其他合作伙伴一起,共同维护和演进该协议。任何人都可以像在其他开源项目中一样,在这个仓库中提问、提交 Issue 或提交 Pull Request。

下一步计划

这只是一个开始——OmniSharp (C#)、JSON、C++、xText、JavaFX 和 R 等编程语言的社区已经承诺未来将为各自的语言发布语言服务器。GitHub 仓库上提供了完整的协议实现列表,其中包含语言服务器、编辑器和 SDK。

如果您想了解更多信息,请观看专题演讲,查看来自 Red HatEclipse Che 团队的博客文章,并访问 GitHub 上的语言服务器协议仓库。这里甚至还有一个语言服务器演练,您可以通过它逐步了解用 TypeScript 和 Node.js 实现的运行中的语言服务器的源代码。当然,您完全可以使用任何语言来编写语言服务器!

祝编码愉快!

VS Code 团队,@code

English 한국어 中文(简体) 中文(繁體)
© . This website operates independently and is not affiliated with or endorsed by Microsoft. All brand names, logos, and trademarks are the property of their respective owners.