语言的通用协议
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 采用令人兴奋的原因,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