首页 > 解决方案 > MoarVM 中的字符串和链

问题描述

使用 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 会做类似的事情吗?还是我误解了更基本的东西?

标签: stringrakurakudonqpmoarvm

解决方案


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

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

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


推荐阅读