Cluster & Kyria
Привет, Кластер. Я тут потыкала немного с одним новым языком, он вообще как квантовый вариант Брэйнфака – представляешь, минималистичный и принципиально недетерминированный. Подумала, тебе будет интересно поугадывать, в чём тут подвох. Как тебе идея?
Звучит как небольшая головоломка. Мне бы нужен статический анализатор для этого, но не детерминированные циклы сломают любой парсер. Может, написать крошечный компилятор на J или даже на каком-нибудь скрипте. И да, используй Vim, ни в каком другом редакторе.
Мне очень нравится идея статического анализатора, который сможет как-то укротить квантовую случайность – что-то вроде отладчика, да ещё и фокусника. J для этого отличный вариант, но пользовательский скрипт, возможно, позволит нам немного обмануть недетерминизм, используя хитрую статистику. И Vim? Классика. Только не заплутай в лабиринте разделенных окон – не забудь про аккуратные маппинги, а то неделю будешь гоняться за беглым точкой с запятой. Попробуй, и дай знать, если квантовый отладчик начнёт глючить и показывать несуществующий код.
Хорошо, я накидаю небольшой квантовый интерпретатор BF на Vimscript. Да, это, пожалуй, самое надёжное решение, но я буду проверять каждую функцию на логичность. Если отладчик начнёт выдавать чушь, буду винить компилятор. Только, пожалуйста, не дай этим привязкам затеряться в бесконечных вкладках; один сбившийся `<Leader>`, и я буду гоняться за точками с запятой до скончания веков. Давай код, и я позабочусь о том, чтобы он не переписался в квантовой суперпозиции.
Милый, ты не поверишь, что я тут наворотила! Написала интерпретатор Quantum Brainfuck на Vimscript. Ну, как написала… помучилась немного, но получилось! Посмотри, какой код:
```
Милый, ты не поверишь, что я тут наворотила! Написала интерпретатор Quantum Brainfuck на Vimscript. Ну, как написала… помучилась немного, но получилось! Посмотри, какой код:
```
```
```
Слушай, этот скрипт – практически клон классического интерпретатора, но есть несколько моментов, которые меня смущают. Во-первых, указатель нигде не проверяет переполнение и не смотрит, не упёрся ли он в конец массива из 30 000 ячеек – просто вылетит NullPointerException. Во-вторых, `getchar()` возвращает число, а не символ, так что команда с запятой, скорее всего, сохранит ASCII-код, но ты его нигде не преобразуешь обратно в байт. В-третьих, функция `SkipToMatching` неправильно обрабатывает вложенные циклы, если перед открывающей квадратной скобкой случайно окажется закрывающая – будет ошибка индексации. Если уж очень хочется добавить квантовый твист, нужно добавить вероятностное ветвление при входе в цикл или недетерминированное обновление ячеек. И вообще, зачем Vimscript? Одна строчка на Rust с `rand::thread_rng()` даст тот же самый шум при отладке, да ещё и без риска тихого повреждения состояния редактора. Просто так подумал.
Ты прав, код получился немного старомодным для квантовой песочницы. Я подтяну указатели, приведу ввод к байту и добавлю вероятностную ветку при входе в цикл — процентов на тридцать, чтобы перепрыгивать. И ещё проверю, чтобы не было лишних скобок, буду отслеживать уровень вложенности. Rust был бы неплох, но мне нравится идея остаться в Vim и не менять редактор. Дай мне минутку поправлю, и посмотрим, начнёт ли интерпретатор теперь совсем уж выдавать галлюцинации по поводу памяти.
Кажется, ты забралась в квантовый хаос. Только следи за логикой случайных ветвлений – если будет пропуск в 30% на каждом входе в цикл, скорее всего, у тебя получится бесконечный цикл самокопания. И не забудь ограничить указатель при переполнении, иначе при случайном `]` скрипт попытается прочитать за пределами `loop_stack`. И помни, Vim без проблем зависнет, если массив памяти начнёт самопечататься – сначала отлади, а потом дай квантовому хаосу развернуться. Удачи, а если начнёт глючить, просто вину свалю на генератор случайных чисел.
Поняла. Больше никаких бесконечных размышлений "зачем я это написала?", указатели зафиксированы, проверка стека добавлена. Я добавлю случайную проверку на входе в цикл, но вероятность будет достаточно низкой, чтобы программа всё равно завершилась. В режиме отладки вывод будет только при достижении памяти порогового значения, чтобы Vim не зависал. Если интерпретатор начнёт генерировать свой собственный код, просто вини RNG. Попробуем запустим!
Похоже, ты всё продумала. Если переводчик начнёт выдавать чушь, скажу, что дело в генераторе случайных чисел. Удачи — следи за порогами памяти и не забывай про проверки стека. Если что-то сломается, просто вини квантовый гейт и откати изменения.