cod*_*ons 5 string rakudo moarvm raku nqp
当使用 MoarVM 后端在 Rakudo 上运行 Raku 代码时,是否有任何方法可以从正在运行的程序内部打印有关给定 Str 如何存储在内存中的信息?特别是,我很好奇是否有一种方法,看看有多少钢绞线目前弥补STR(无论是通过乐自省,NQP,或者一些访问MoarVM水平(不这样的话,即使在运行时存在吗?)。
如果在运行时无法访问此信息,是否有办法通过 Rakudo 的命令行标志之一(例如--target, 或 )的输出来获取它--tracing?还是通过调试器?
最后,MoarVM 是否管理给定 Str 中的 Strands 数量?我经常听到(或说)Raku 的超能力之一是可以在 O(1) 时间内索引到 Unicode 字符串,但我一直在考虑病理情况,感觉就像是 O(n) . 例如,
(^$n).map({~rand}).join
Run Code Online (Sandbox Code Playgroud)
似乎它会创建一个长度与$n由$nStrands组成的长度成正比的 Str – 如果我正确理解数据结构,这意味着进入这个 Str 需要检查每个 Strand 的长度,时间复杂度为 O( n)。但我知道可以压平 Strand-ed Str;在这种情况下,MoarVM 会做类似的事情吗?还是我误解了更基本的东西?
当使用 MoarVM 后端在 Rakudo 上运行 Raku 代码时,是否有任何方法可以打印有关给定 Str 如何从正在运行的程序内部存储在内存中的信息?
我有根据的猜测是肯定的,如下App::MoarVM模块所述。也就是说,我的教育来自于我在 Unseen 大学开始的学位,一个巫师因为我猜测太多而将我开除,所以......
特别是,我很好奇是否有办法查看当前有多少条 Strand 组成 Str(无论是通过 Raku 内省、NQP 还是访问 MoarVM 级别的东西(这样的东西在运行时是否存在?)。
我 99.99% 确定 strings 纯粹是后端的实现细节,如果没有 MoarVM 特定的技巧,就无法通过 Raku 或 NQP 访问该信息。也就是说,请继续阅读。
如果没有任何方法可以在运行时访问此信息
我可以看到运行时可以通过 MoarVM 进行访问。
有没有办法通过 Rakudo 的命令行标志之一(例如 --target 或 --tracing)的输出来获取它?或者通过调试器?
我 99.99% 确信有多种方法。
ops.c例如,MoarVM 的文件中有一堆以#define MVM_DEBUG_STRANDS ....
也许更有趣的是 MoarVM 中内置的复杂调试和分析功能似乎是名副其实的金矿。再加上似乎是Rakudo 特定模块来驱动这些功能,大概是通过 Raku 代码。对于讨论这些功能某些方面的十几篇文章,我建议阅读timotimo 的博客。浏览 github 时,我看到多年来一直在进行与 MoarVM 调试功能相关的提交,直至 2021 年。
最后,MoarVM 是否管理给定 Str 中的 Strand 数量?
是的。我可以看到字符串处理代码(下面有一些链接)是由 samcv (非常聪明和细心)编写的,并且我相信由 jnthn 审查过,具有限制链数的逻辑。
我经常听说(或说)Raku 的超能力之一是可以在 O(1) 时间内索引到 Unicode 字符串,但我一直在考虑病态的情况,感觉就像是 O(n) 。
是的,如果支持股线的后端无法管理股线数量。
但对于 MoarVM,我认为#define MVM_STRING_MAX_STRANDS 64其目的是在 MoarVM文件中设置绝对上限MVMString.h,并检查该上限的逻辑(以及字符串的其他特征;将此else if语句视为示例)。但逻辑足够复杂,而且我的 C 代码也足够贫乏,以至于我根本无法表达对此的信心,即使我可以说这似乎是意图。
例如,
(^$n).map({~rand}).join看起来它会创建一个长度与由Strand$n组成的长度成比例的 Str$n
我有 95% 的信心通过这样的简单连接构造的字符串将是O(1).
这是基于我认为 Raku/NQP 级别的字符串连接操作由 处理MVM_string_join,并且我尝试理解该代码的作用。
但我知道有可能将一条绞合线压平;在这种情况下,MoarVM 会做类似的事情吗?
如果您阅读代码,您会发现它进行了非常复杂的处理。
或者我误解了一些更基本的东西?
我很确定我会误解一些基本的东西,所以我肯定不会评论你是否误解了。:)