语言的通用协议
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也已采纳,他们正在努力发布一个独立的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