是否可以将 perl6 嵌入到 C(或 C++)程序中?

Posted

技术标签:

【中文标题】是否可以将 perl6 嵌入到 C(或 C++)程序中?【英文标题】:Is it possible to embed perl6 in a C (or C++) program? 【发布时间】:2018-11-19 00:17:40 【问题描述】:

在 perl5 中,很容易在 libperl.so 中进行链接,设置一些变量并运行一些带有回调的代码。在 perl6 中是否有这样做的故事?

【问题讨论】:

【参考方案1】:

我认为您可以在 https://metacpan.org/pod/Inline::Perl6 找到这方面的最新技术,它在 Perl 5 中嵌入了 Rakudo。

【讨论】:

【参考方案2】:

除了@elizabeth-mattijsen 的评论之外,不,没有这样的事情。虽然 perl 解释器是一个单一的东西,可以相对容易地转换为 .so 库,然后与一些 API 端点链接,但 Perl 6 是两个重要的东西:一个虚拟机,Java 或 MoarVM,加上解释器,Rakudo。可能存在不需要嵌入 Java 或 MoarVM 的场景,因为这两种语言将在同一个 VM 中运行。例如,想想嵌入 Clojure 的 Perl 6。或者嵌入在007 中的 Perl6,两者都在 MoarVM 中运行。这很容易,而且您将针对具有相同功能的虚拟机。但是 C++、C 和 Perl6 有一个非常不同的抽象虚拟机作为目标;考虑一下 Unicode 处理或并发接口。在 C 中嵌入 Perl6 基本上就是从 C 中运行 Perl6 程序,而不是从命令行运行它们。

有可能,就像 Perl 正则表达式在所有地方结束一样,某些 Perl 6 功能,如 Unicode handling 或 grammars,最终可能会被移植或嵌入到其他语言中。但是我现在还没有看到将 Perl 嵌入 C 或 C++ 的明确用例,因此,为这种事情付出一些努力会更好地用于完全不同的事情。

【讨论】:

【参考方案3】:

这不是答案,但假设我有一个已经存在的 C 程序,该程序旨在使用 .dll 或 .sos 插件,并且它们通过 dlopen 或 LoadLibrary 加载,找到 API 入口点使用 dlsym 或 GetProcAddress,然后使用某种句柄调用该入口点,以便插件调用回主进程。

现在,假设我希望我的插件(在这个 .dll 或 .so 内)加载 moarvm,然后运行一些 perl6 脚本,该脚本又使用 NativeCall 回调到主进程。我该怎么做呢?

或者,假设我希望我的插件(在这个 .dll 或 .so 中)加载 jvm,然后运行一些 perl6 脚本等。我该怎么做呢?

加载 perl5 只是为了加载 perl6 似乎是一个愚蠢的解决方案。它可能有效,但是...

【讨论】:

@elizabeth-mattijsenn 链接到的模块中的Perl6.xs 文件已设置为嵌入 MoarVM 并运行 Perl6 解释器。 metacpan.org/source/NINE/Inline-Perl6-0.08/Perl6.xs XS 是 Perl5 用来处理 C 库的一组宏。这(github.com/MoarVM/MoarVM/tree/master/src)表示您可以在 repo 的主 moar.c 文件中查找嵌入 API。试试看;如果你被卡住了,你最好的选择是跳上 IRC 或以其他方式与 MoarVM 大师通信。 moarvm.org/contributing.html

以上是关于是否可以将 perl6 嵌入到 C(或 C++)程序中?的主要内容,如果未能解决你的问题,请参考以下文章

从C到C++过渡的3个原因

如何将非托管 C++ 表单嵌入到 .NET 应用程序中?

将包转换为 perl6

在应用程序中嵌入 C++ 编译器

Perl6 Bailador框架:路径匹配

在 C++ 应用程序中嵌入 python 环境