Струны и пряди в MoarVM
При запуске кода Raku на Rakudo с бэкэндом MoarVM есть ли способ распечатать информацию о том, как данный Str хранится в памяти изнутри запущенной программы? В частности, мне любопытно, есть ли способ узнать, сколько Strands в настоящее время составляют Str (будь то интроспекция Raku, NQP или что-то, что имеет доступ к уровню MoarVM (существует ли такая вещь во время выполнения?).
Если нет возможности получить доступ к этой информации во время выполнения, есть ли способ получить ее через вывод одного из флагов командной строки Rakudo, например
--target
, или же
--tracing
? Или через отладчик?
Наконец, управляет ли MoarVM количеством Strands в заданной Str? Я часто слышу (или говорю), что одна из суперспособностей Раку заключается в том, что он может индексировать строки Unicode за время O(1), но я думал о патологическом случае, и мне кажется, что это будет O (n) . Например,
(^$n).map({~rand}).join
похоже, что это создаст Str с длиной, пропорциональной той, которая состоит из
$n
Strands - и, если я правильно понимаю структуру данных, это означает, что для этой Str потребуется проверка длины каждого Strand для временной сложности O(n). Но я знаю, что можно выровнять Strand-ed Str; сделает ли MoarVM что-то подобное в этом случае? Или я неправильно понял что-то более важное?
2 ответа
При запуске кода Raku на Rakudo с бэкэндом MoarVM есть ли способ распечатать информацию о том, как данный Str хранится в памяти изнутри запущенной программы?
Мое обоснованное предположение - да , как описано ниже для
App::MoarVM
модули. Тем не менее, мое образование я получил после получения степени, которую я получил в Невидимом университете, и волшебник исключил меня за то, что я слишком много гадал, так что ...
В частности, мне любопытно, есть ли способ узнать, сколько цепочек в настоящее время составляет Str (будь то интроспекция Raku, NQP или что-то, что обращается к уровню MoarVM (существует ли такая вещь во время выполнения?).
Я на 99,99% уверен, что нити - это просто детали реализации бэкэнда, и без специальных уловок MoarVM не будет доступа Raku или NQP к этой информации. Тем не менее, читайте дальше.
Если нет возможности получить доступ к этой информации во время выполнения
Я вижу, что во время выполнения есть доступ через MoarVM.
есть ли способ получить его через вывод одного из флагов командной строки Rakudo, например --target или --tracing? Или через отладчик?
Я на 99,99% уверен, что есть несколько способов.
Например, в MoarVM есть набор отладочного кода.
ops.c
файл, начинающийся с #define MVM_DEBUG_STRANDS ...
.
Возможно, более интересным является то, что кажется настоящей золотой жилой сложных функций отладки и профилирования, встроенных в MoarVM. Плюс то, что кажется специфическими модулями Rakudo, которые управляют этими функциями, предположительно через код Raku. Чтобы найти около дюжины статей, в которых обсуждаются некоторые аспекты этих функций, я предлагаю прочитать блог timotimo . Просматривая github, я вижу текущие коммиты, связанные с функциями отладки MoarVM, в течение многих лет и вплоть до 2021 года.
Наконец, управляет ли MoarVM количеством Strands в заданной Str?
Да. Я вижу, что код обработки строк (некоторые ссылки ниже), который был написан samcv (чрезвычайно умным и осторожным) и, как мне кажется, рассмотрен jnthn, имеет логику, ограничивающую количество цепочек.
Я часто слышу (или говорю), что одна из суперспособностей Раку заключается в том, что он может индексировать строки Unicode за время O(1), но я думал о патологическом случае, и мне кажется, что это будет O(n).
Да, если бэкэнд, поддерживающий пряди, не управлял количеством прядей.
Но для MoarVM я думаю, что цель состоит в том, чтобы установить абсолютную верхнюю границу с помощью#define MVM_STRING_MAX_STRANDS 64
в MoarVM
MVMString.h
файл, и логика проверки в отношении , что (и другие характеристики струн; см это
else if
заявление как образец). Но логика достаточно сложна, а мой C достаточно скуден, так что я даже близко не могу выразить уверенность в этом, даже если я могу сказать, что это, по-видимому, является намерением.
Например,
(^$n).map({~rand}).join
похоже, что это создаст Str с длиной, пропорциональной той, которая состоит из$n
Пряди
Я на 95% уверен, что строки, построенные такими простыми соединениями, будут
O(1)
.
Это основано на моем мнении, что операция соединения строки уровня Raku / NQP обрабатывается MVM_string_join
, и мои попытки понять, что делает этот код.
Но я знаю, что можно сгладить Strand-ed Str; сделает ли MoarVM что-то подобное в этом случае?
Если вы прочтете код, то обнаружите, что он обрабатывает очень изощренно.
Или я неправильно понял что-то более важное?
Я почти уверен, что неправильно понял что-то базовое, поэтому я не буду комментировать, понимаете ли вы. :)
Насколько я понимаю, тот факт, что MoarVM реализует цепочки (иначе говоря, объединение двух строк приведет только к созданию цепочки, состоящей из «ссылок» на исходные строки), на самом деле это: деталь реализации.
Вы можете реализовать язык программирования Raku без необходимости реализации цепочек. Следовательно, по крайней мере, насколько мне известно, это невозможно проанализировать.
Был PR, чтобы выставить nqp:: op, который фактически объединит нити в одну строку, но это было отклонено / закрыто: https://github.com/rakudo/rakudo/pull/3975