MoarVM 中的字符串和链

问题描述

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

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

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

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

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

解决方法

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

您可以实现 Raku 编程语言而无需实现链。因此,至少据我所知,没有办法反省这一点。

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

,

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

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

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

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

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

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

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

我 99.99% 确定有多种方法。

例如,MoarVM 的 ops.c 文件中有一堆以 #define MVM_DEBUG_STRANDS ... 开头的链调试代码。

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

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

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

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

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

但是对于 MoarVM,我认为的目的是在 MoarVM 的 MVMString.h 文件中设置一个带有 #define MVM_STRING_MAX_STRANDS 64 的绝对上限,以及检查它的逻辑(和其他特性字符串;参见 this else if statement 作为示例)。但是逻辑足够复杂,而且我的 C 代码也很微不足道,以至于我几乎无法表达出对此的信心,即使我可以说这似乎是意图。

例如,(^$n).map({~rand}).join 似乎会创建一个长度与 $n 成正比的 Str,其中包含 $n 条链

我有 95% 的把握相信由像这样的简单连接构造的字符串将是 O(1)

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

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

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

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...