string - 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
由$n
Strands 组成的 Str 成比例的 Str - 如果我正确理解数据结构,这意味着进入这个 Str 需要检查每个 Strand 的长度,时间复杂度为 O( n)。但是我知道可以将Strand-ed Str 变平;在这种情况下,MoarVM 会做类似的事情吗?还是我误解了更基本的东西?
解决方案
据我了解,MoarVM 实现了链(也就是连接两个字符串只会导致创建一个包含对原始字符串的“引用”的链)的事实,实际上就是:实现细节。
您可以实现 Raku 编程语言,而无需实现 strands。因此,至少据我所知,没有办法对此进行反省。
有一个 PR 公开了 nqp:: op,它实际上将链连接成一个字符串,但已被拒绝/关闭:https ://github.com/rakudo/rakudo/pull/3975
推荐阅读
- python - 将 SQLite 转换为 Django
- html - 电子邮件签名按钮在放入 Outlook 后没有样式?
- exe - 使用 installshield 安装后运行 .exe
- azure - 在 Azure 上复制数据库而没有性能提升
- sql - 基于行号的 SSRS 总和值
- c# - 如何使用for循环在c#windows窗体应用程序中检查文本框是否为空,使用数组
- swift - 如何定义和使用 LLDB 用户变量?
- vue.js - 在 Vue.js 和 Slim 中将类绑定到数据对象属性
- r - 如何在R中按天平均一组数据,然后提取特定日期范围的数据
- java - 当我在 Linux 中将 Spring Boot 应用程序作为系统服务启动时,没有生成日志文件?