如何添加新的语言绑定

师成师成· 更新于 2026-09-28· 阅读 5 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

添加新语言绑定的路线图

在考虑新增语言绑定时,需要思考以下几个要点。首先,你要弄清楚自己是要实现 Thrift 尚未支持的全新语言绑定,还是只想为某种已实现语言的特定“变体”添加支持。

问:该语言已经存在,但它不支持某个功能或版本,我该怎么办?

这种情况下,建议将新功能作为现有语言的一个选项来添加。关于如何操作,一个很好的范例是 js/nodejs 的实现,或者 Python 中已经存在的各种选项。thrift --help 会是一个很好的起点。根据所需改动的多少,你仍然会觉得本文其余部分很有用。

一般工作流程

准备工作

好消息是,尽管需要一些工作,这个过程并没有看起来那么困难。首先,确保你拥有一个完全可用的构建环境,并且能够从源码构建编译器。阅读如何参与贡献部分,了解整体的贡献流程是如何运作的。

接下来,搜索 Jira,也可以查阅邮件列表存档。如果没有找到类似的内容,就创建一个新的工单,简要描述你的计划。如果你不太确定,可以在开发者邮件列表上询问。

然后在 GitHub 上 fork Apache Thrift 代码库。虽然我们也接受补丁文件,但对于生命周期相对较长的特性分支(例如添加一门新语言),使用 GitHub 分支要容易管理得多。

实现一个最小功能集

  • 实现代码生成器,通常的做法是从现有的生成器中挑选一个与你的需求最接近的。目前已有大量语言获得支持,你会发现面向对象、过程式和函数式等多种风格。如果在你找出的两三个候选者之间犹豫不决,可以参考下面一点。

  • 实现该语言对应的 Thrift 库,同样以某个现有库为起点。由于各库在实现的「深度」上差异很大,建议你仔细研究哪些功能已经实现、哪些尚未实现。

  • 实现标准化的跨平台测试,并确保在至少与另一种语言交互运行时所有测试都能通过。这样可以保证互操作性,确保代码不仅在与自己(即同一种语言)通信时才能工作。你也可以添加其他测试,但应将它们放在 lib/yourlang/test 中,而不是 test/yourlang——后者专门用于承载标准化的跨平台测试。

  • 实现教程代码,并与其他某种语言进行联调测试。如果前面的步骤都做对了,这最后一步相对会比较轻松。

最小功能集

最低要求的功能集至少应涵盖:

  • 传输层:Socket、Buffered、Framed 为必需,HTTP 客户端为推荐
  • 协议:Binary 和 Multiplex 为必需,JSON 为推荐
  • 服务器类型:SimpleServer 为必需

其他推荐功能

这些功能在第一轮提交中并非严格必需,但使用非常广泛。根据不同语言,某些功能可能比另一些更容易实现。或者,你也可以考虑在后续贡献中再补充下面列出的功能,而不必强行塞进首次提交中。如果有疑问,应重质而不重量。

  • 传输层:HTTP 服务器、管道、命名管道(在有意义的场景下)
  • 协议:Compact
  • 服务器类型:Nonblocking、Threaded 和/或 Threadpool 服务器实现

最后事项

  • 在你的库文件夹中添加一个 Readme.md 文件,说明相关要求、依赖项以及其他重要的信息。如果不确定该写些什么,可以参考现有的 Readme 文件。
  • 确保生成器、库、测试和教程都有正确的 makefile.am 文件,并将所有内容纳入构建/测试脚本。如果在这些步骤上需要帮助,请随时在邮件列表中提问。
  • 一切都完成了,现在就去提交 Pull Request 吧!

备注

请注意,这 4 个实施步骤并不是一个真正的线性过程,而更像是一种迭代。即使生成器最终产出的代码能够编译通过、不产生任何警告,而且看起来运行良好,你仍然会在继续实现库和编写测试的过程中遇到问题。这完全正常,也在预料之中。

尽早把你的工作发布到邮件列表上,并尽早创建 JIRA 工单,是个好主意——这也是为什么这一条排在列表最前面。这样做不仅是为了宣布你即将开展的工作,也为那些正好在寻找这方面内容的人提供了一个很好的起点。你不仅能获得宝贵的早期反馈,还可能争取到一些在实现和(或)测试方面的帮助。让别人来审视你的代码(或互相评审),通常是一件好事,尤其是对于你即将提交的贡献的整体质量而言。

祝编码愉快!


评论

登录后参与评论

正在加载评论…