Струны и пряди в 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 с длиной, пропорциональной той, которая состоит из $nStrands - и, если я правильно понимаю структуру данных, это означает, что для этой 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

Другие вопросы по тегам