MoarVM 中的字符串和链

Strings and Strands in MoarVM

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

如果无法在运行时访问此信息,是否可以通过 Rakudo 的命令行标志之一(例如 --target 或 [=12] 的输出来获取它=]?或者通过调试器?

最后,MoarVM 是否管理给定 Str 中的 Strand 数量?我经常听到(或说)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

When running Raku code on Rakudo with the MoarVM backend, is there any way to print information about how a given Str is stored in memory from inside the running program?

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

In particular, I am curious whether there's a way to see how many Strands currently make up the Str (whether via Raku introspection, NQP, or something that accesses the MoarVM level (does such a thing even exist at runtime?).

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

If there isn't any way to access this info at runtime

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

is there a way to get at it through output from one of Rakudo's command-line flags, such as --target, or --tracing? Or through a debugger?

我 99.99% 确定有多种方法。

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

也许更有趣的是 MoarVM 中内置复杂调试和分析功能的名副其实的金矿。加上似乎 Rakudo specific modules that drive those features, presumably via Raku code. For a dozen or so articles discussing some aspects of those features, I suggest reading timotimo's blog。浏览 github 我看到与 MoarVM 的调试功能相关的持续提交已经持续多年并一直持续到 2021 年。

Finally, does MoarVM manage the number of Strands in a given Str?

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

I often hear (or say) that one of Raku's super powers is that is can index into Unicode strings in O(1) time, but I've been thinking about the pathological case, and it feels like it would be O(n).

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

但对于 MoarVM,我 认为 的目的是以 #define MVM_STRING_MAX_STRANDS 64 in MoarVM's MVMString.h file, and logic that checks against that (and other characteristics of strings; see this else if statement 为范例设置绝对上限)。但逻辑足够复杂,我的 C 语言也足够贫乏,我远不能表达对此的信心,即使我可以说这似乎是意图。

For example, (^$n).map({~rand}).join seems like it would create a Str with a length proportional to $n that consists of $n Strands

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

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

But I know that it's possible to flatten a Strand-ed Str; would MoarVM do something like that in this case?

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

Or have I misunderstood something more basic?

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