主要观点:作者在进行 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++头文件。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。