#embed #perl #cpan

bin+lib ruperl

在 Rust 项目中嵌入 Perl 的库

1 个不稳定版本

0.0.1-alpha.12024 年 5 月 1 日

433嵌入式开发

47 每月下载次数

Apache-2.0

13KB
162

RuPerl - Rust 中嵌入 Perl

这本来不应该存在的东西,但它确实存在。这是一个嵌入 Rust 中的 Perl 解释器。

一旦克隆,您可以运行以下命令来查看其运行情况

  • cargorun --verbose --hello.pm showtime
  • cargorun --verbose --hello.pm get_quick_headers

工作原理

有大量的自动生成代码,主要针对两件事

  • bindings.rswrapper.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_parseperl_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 可以工作,并且嵌入也可以工作 :)

itsalive

我通过遵循 perlembed 指南使大部分功能工作。

为什么?

为什么不呢?。

我想看看我是否可以将 Python 也嵌入到同一个二进制文件中,这样我就可以从本地 Python 调用本地 Perl,并看看我如何将这些全部整合到 os-autoinst

依赖项

~0.9–3MB
~55K SLoC