在 jank 中开始无缝的 C++ 互操作性

主要观点:作者在进行 jank 的无缝 C++互操作工作一个月,有令人兴奋的进展并分享,此季度工作受 Github 赞助商和 Clojurists Together 赞助。Clojure 与 Java 的互操作虽非“无缝”但很强大,jank 要从开始就做好,其宿主是 C++,目前是首个这样做的 Lisp。
关键信息

  • 可访问 C++的全局值如std::string::npos,需包含<string>头,通过cpp/raw声明,其值在 jank 中保持符号。
  • 能直接构造栈分配的 C++对象,需匹配正确的构造函数重载,jank 会进行二次检查和自动转换。
  • 实现了类型转换,可明确将值转换为另一种类型以消除重载调用的歧义。
  • 介绍了 LLVM IR 中如何将 JIT 编译的 C++代码与 jank 的 IR 拼接,包括查找值、转换值、返回值等过程,最终可优化为简洁形式。
  • 后续还有很多工作要做,如处理自由/静态函数调用等,同时呼吁大家参与,可通过加入 Slack、在 GitHub 讨论或成为赞助商等方式。
    重要细节
  • npos在 C++中表示不存在的索引,值为-1但在无符号类型中为最大可能值,jank 的整数类型是i64所以保留符号。
  • jank 的运行时有自己的对象模型,对于std::string::npos这种类型需通过转换特质进行转换,转换特质可针对任何类型进行专门化。
  • 构造 C++对象时,jank 编译器会确定参数类型,找到所有重载并让 Clang 找到最佳匹配,若提供 jank 值且有多个重载可支持转换则会有歧义。
  • 在 LLVM IR 中,通过生成 C++代码让 Clang 编译来访问 C++值,包括存储值、进行转换等过程,最终可优化掉一些冗余代码。
  • 后续工作包括处理多种 C++相关操作及确保能以可移植方式处理 C++头文件。
阅读 9
0 条评论