5

使用 MoarVM 后端在 Rakudo 上运行 Raku 代码时,是否有任何方法可以打印有关给定 Str 如何从正在运行的程序内部存储在内存中的信息?特别是,我很好奇是否有办法查看当前有多少组成了 Str(无论是通过 Raku 自省、NQP 还是访问 MoarVM 级别的东西(这样的东西甚至在运行时存在吗?)。

如果在运行时无法访问此信息,有没有办法通过 Rakudo 的命令行标志之一的输出来获取它,例如--target,或--tracing?还是通过调试器?

最后,MoarVM 是否管理给定 Str 中的 Strand 数量?我经常听到(或说)Raku 的超能力之一是可以在 O(1) 时间内索引到 Unicode 字符串,但我一直在考虑病态的情况,感觉就像是 O(n) . 例如,

(^$n).map({~rand}).join

似乎它会创建一个长度与$n$nStrands 组成的 Str 成比例的 Str - 如果我正确理解数据结构,这意味着进入这个 Str 需要检查每个 Strand 的长度,时间复杂度为 O( n)。但是我知道可以将Strand-ed Str 变平;在这种情况下,MoarVM 会做类似的事情吗?还是我误解了更基本的东西?

4

2 回答 2

4

据我了解,MoarVM 实现了链(也就是连接两个字符串只会导致创建一个包含对原始字符串的“引用”的链)的事实,实际上就是:实现细节。

您可以实现 Raku 编程语言,而无需实现 strands。因此,至少据我所知,没有办法对此进行反省。

有一个 PR 公开了 nqp:: op,它实际上将链连接成一个字符串,但已被拒绝/关闭:https ://github.com/rakudo/rakudo/pull/3975

于 2021-03-02T22:25:52.013 回答
4

使用 MoarVM 后端在 Rakudo 上运行 Raku 代码时,是否有任何方法可以打印有关给定 Str 如何从正在运行的程序内部存储在内存中的信息?

我有根据的猜测是yes,如下所述的App::MoarVM模块。话虽如此,我的教育来自我在看不见的大学开始的学位,一个巫师因为我猜测太多而被开除,所以......

特别是,我很好奇是否有办法查看当前有多少股组成 Str(无论是通过 Raku 自省、NQP 还是访问 MoarVM 级别的东西(这样的东西甚至在运行时存在吗?)。

我 99.99% 确定 strands 纯粹是后端的实现细节,如果没有 MoarVM 特定的技巧,就没有 Raku 或 NQP 访问该信息。也就是说,请继续阅读。

如果在运行时无法访问此信息

我可以看到在运行可以通过 MoarVM 访问。

有没有办法通过 Rakudo 的命令行标志之一(例如 --target 或 --tracing)的输出来获取它?还是通过调试器?

我 99.99% 确定有多种方法。

例如,MoarVM 的ops.c文件中有一堆以#define MVM_DEBUG_STRANDS ....

也许更有趣的是 MoarVM 中内置的复杂调试和分析功能的名副其实的金矿。加上似乎是驱动这些功能的Rakudo 特定模块,大概是通过 Raku 代码。对于讨论这些功能的某些方面的十几篇文章,我建议阅读timotimo 的博客。浏览 github,我看到与 MoarVM 的调试功能相关的持续提交已持续多年,一直持续到 2021 年。

最后,MoarVM 是否管理给定 Str 中的 Strand 数量?

是的。我可以看到由 samcv 编写的字符串处理代码(下面有一些链接)(非常聪明和小心),我相信,由 jnthn 审查,具有限制股数的逻辑。

我经常听到(或说)Raku 的超能力之一是可以在 O(1) 时间内索引到 Unicode 字符串,但我一直在考虑病态的情况,感觉就像是 O(n) .

是的,如果支持 strand 的后端没有管理 strand 的数量。

但是对于 MoarVM,我认为#define MVM_STRING_MAX_STRANDS 64其目的是在 MoarVM 的文件中设置绝对上限MVMString.h,以及检查该上限的逻辑(以及字符串的其他特征;将此else if语句视为示例)。但是逻辑足够复杂,而我的 C 水平也足够微薄,即使我可以说这似乎是意图,我也无法表达对此的信心。

例如,(^$n).map({~rand}).join似乎它会创建一个长度与$n$nStrands组成的长度成比例的 Str

我有 95% 的信心认为,由像这样的简单连接构造的字符串将是O(1).

这是基于我认为 Raku/NQP 级别的字符串连接操作是由 处理的MVM_string_join,并且我试图理解该代码的作用。

但是我知道可以将 Strand-ed Str 变平;在这种情况下,MoarVM 会做类似的事情吗?

如果您阅读代码,您会发现它的处理非常复杂。

还是我误解了更基本的东西?

我很确定我会误解一些基本的东西,所以我肯定不会评论你是否有。:)

于 2021-03-02T23:13:15.160 回答