瓦拉:最平滑的 C 语言出口匝道

  • 作者及背景:Reuben Thomas 是长期的自由软件维护者和作者,擅长接手成熟项目并长期维护。
  • 用 Vala 重写旧 C 代码的原因:维护典型 C 代码库体验差,易出现内存管理错误等;用 Vala 实现 C API 可得到更易维护的代码库,能被多种语言使用,还可逐步重写 C 程序;重写成熟代码库虽工作量大但可能值得。
  • Vala 与 C 的适配性:Vala 设计与 C 适配良好,很多有用库已绑定到 Vala,其绑定能力强大,能绑定几乎任何 C API,也能实现 C API;翻译 C 代码到 Vala 相对容易,语法相似,可直接使用 C API 和复制 C 数据结构,静态类型也有帮助。
  • 避免新 bug 的方法:保持 Vala 与 C 语法相似,如 NULL 变为 null 等;利用已有的广泛测试套件,翻译过程中不更改测试用例;现有构建工具大多受 Vala 支持,如 Meson、CMake、GNU Autotools 等。
  • 翻译过程:向构建系统添加 Vala,每次翻译一个文件,添加私有 VAPI 文件并填充相关 C 头文件内容,复制 foo.cfoo_vala.vala 进行翻译,编译、测试、修复循环进行;翻译 Zile 时依赖 POSIX VAPI 等,Enchant 整体较易,因其基于 GLib。
  • 遇到的困难及解决方法

    • 文档和 API 覆盖:发现 Vala 生态系统中的文档 bug 并提交修复,为 VAPI 添加内容,为 Vala 项目提供专业知识。
    • 处于两种语言之间:小心处理中间的 C 代码,避免因翻译而导致程序崩溃;注意字符串处理的差异,可分阶段转换代码。
    • 绑定挑战:处理 config.hrelocatestrfreev[s]size_t 等问题,通过复制定义、添加 VAPI 包装器、进行类型转换等方法解决。
  • 最终评价:对于 GNU Zile ,可能值得,初始稳定版本有一个小 bug ,代码仍能稳定构建;对于 Enchant ,尚早,希望切换到 Vala 不会影响打包者和开发者,能提高未来工作效率;对于这种重写 C 为 Vala 的做法,对于低级别、高度可移植的项目是好的选择,重写后代码更短易读,可进一步简化,即使 Vala 不再流行,也可挽救生成的 C 代码并容易再次翻译。
  • 邀请参与:欢迎加入 matrix 聊天频道 [#vala:gnome.org] 询问关于 Vala 或贡献的问题。
阅读 14
0 条评论