使用 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
由$n
Strands组成的长度成比例的 Str
我有 95% 的信心认为,由像这样的简单连接构造的字符串将是O(1)
.
这是基于我认为 Raku/NQP 级别的字符串连接操作是由 处理的MVM_string_join
,并且我试图理解该代码的作用。
但是我知道可以将 Strand-ed Str 变平;在这种情况下,MoarVM 会做类似的事情吗?
如果您阅读代码,您会发现它的处理非常复杂。
还是我误解了更基本的东西?
我很确定我会误解一些基本的东西,所以我肯定不会评论你是否有。:)