在 VS Code 中试用

一种通用的语言协议

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

Visual Studio Code 是一款适用于任何开发人员的编辑器,无论您使用何种编程语言。通过工具内置的语言或 Marketplace 中的扩展,我们支持 超过 150 种语言。我们还致力于开源开发 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(他们已将其添加到下一代 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