1 个不稳定版本
0.0.1-alpha.1 | 2024 年 5 月 1 日 |
---|
433 在 嵌入式开发
47 每月下载次数
13KB
162 行
RuPerl - Rust 中嵌入 Perl
这本来不应该存在的东西,但它确实存在。这是一个嵌入 Rust 中的 Perl 解释器。
一旦克隆,您可以运行以下命令来查看其运行情况
cargorun --verbose --hello.pm showtime
cargorun --verbose --hello.pm get_quick_headers
工作原理
有大量的自动生成代码,主要针对两件事
bindings.rs
和wrapper.h
;我做了很多假设,而perlxsi.c
在未来可能需要也可能不需要(参见main::xs_init_rust
),这取决于您阅读此内容时我对 C 的了解有多糟糕。xs_init_rust
函数是执行魔法的地方,据我所知,它通过 ffi 将boot_DynaLoader
连接到 Perl 中的 DynaLoader。
有了这两部分,再加上 bindgen
crate 的魔力,经过一些初始化后,我决定使用 Perl_call_argv
,请注意,这里的 Perl_
来自 bindgen,我可能稍后会将其更改为 ruperl
或类似的东西,以避免与 perl_parse
或 perl_alloc
混淆,这些(如果理解正确)是直接由 ffi 接口公开的。
我最终做的是直接将相同的参数列表(目前,至少在这个 PoC 中)传递给 Perl_call_argv
,它将依次将第三个参数原样传递给 call_argv
Perl_call_argv(myperl, perl_sub, flags_ptr, perl_parse_args.as_mut_ptr());
目前,hello.pm 定义了两个子程序,一个用于打开文件,写入一些内容并将时间打印到 stdout,另一个用于查询我的博客并显示标题。这只是一个示例代码,但足以演示 DynaLoader 可以工作,并且嵌入也可以工作 :)
我通过遵循 perlembed 指南使大部分功能工作。
为什么?
为什么不呢?。
我想看看我是否可以将 Python 也嵌入到同一个二进制文件中,这样我就可以从本地 Python 调用本地 Perl,并看看我如何将这些全部整合到 os-autoinst
依赖项
~0.9–3MB
~55K SLoC