🚀 在 VS Code 中

语言的通用协议

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

Visual Studio Code 是一款面向所有开发者的编辑器,无论您使用何种编程语言。在工具中捆绑的语言或 Marketplace 中的扩展之间,我们支持超过 150 种语言。我们还致力于开放地开发 VS Code,并使为 VS Code 提供支持的组件可用且开源。我们最著名的组件之一是 Monaco 编辑器,但另一项为 VS Code 提供支持的技术是 开放的、基于 JSON 的协议,任何人都可以通过实现“语言服务器”来使用该协议为 VS Code 添加对新编程语言的支持。

any developer any language any tool

任何语言,任何工具

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

工作原理

Visual Studio Code 为许多编程语言提供了丰富的语言支持。对特定编程语言的支持由语言服务器提供支持,该服务器对该语言有深入的了解。VS Code 与这些服务器通信,以实现丰富的编辑功能,如“错误和警告”、“重构”和“转到定义”。

language server protocol

这是一个工具和语言服务器如何在例行编辑会话期间通信语义信息的示例

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

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

  • 用户对符号执行“转到定义”:该工具向服务器发送一个 definition 请求。服务器使用包含定义的文档的 uri 和文档内的 range 进行响应。基于此信息,该工具可以在定义位置打开相应的文档。

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

这种通过 JSON-RPC 进行的通信在典型的会话过程中会发生多次。

language server sequence

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

它还允许给定的语言服务器只需实现一次,就可以被不同的工具利用。这就是为什么该协议已被 Codenvy 采用令人兴奋的原因,Codenvy 已将其添加到下一代 Eclipse IDE Eclipse Che 中,以及 Red Hat,他们正在努力发布一个独立的 Java 语言服务器,该服务器可以被任何使用该协议的工具使用。

开放规范

此协议的完整规范在 公共 GitHub 存储库中提供,协议如何发展至今的历史记录也是如此。随着越来越多的语言和工具采用该协议,我们打算与 Red Hat、Codenvy 和开源社区中的其他合作伙伴一起支持和发展该协议。任何人都可以像任何其他开源项目一样,在存储库上提问、提交问题或提交拉取请求。

下一步是什么

这仅仅是个开始——OmniSharp (C#)、JSON、C++、xText、JavaFX 和 R 等编程语言的社区已承诺在未来发布其语言的语言服务器。包括语言服务器、编辑器和 SDK 在内的完整协议实现列表在 GitHub 存储库中提供。

如果您想了解更多信息,请观看分组会议,查看 Red HatEclipse Che 团队的博客文章,并访问 GitHub 上的语言服务器协议存储库。甚至还有一个语言服务器演练,您可以在其中逐步了解用 TypeScript 和 Node.js 实现的工作语言服务器的源代码。但当然,您可以用任何语言实现语言服务器!

编码愉快!

VS Code 团队,@code