You are here
Квайн? Это просто (МК-161)
пт, 22/09/2017 - 23:56 - Дробышев
Для ПМК МК-61 и подобных написать квайн (программу, выводящую саму себя) невозможно, однако это не так для ЭКВМ. Разумеется, здесь не обойтись без функций, адресуемых через регистры памяти. И всё вмещается в страницу памяти, точнее, в 98 шагов. Кто меньше?
File attachments:
Прикрепленный файл | Размер |
---|---|
![]() | 465 байтов |
Метки публикаций:
»
- Дробышев's blog
- Log in or register to post comments
- 15047 просмотров
Комментарии
Декомпиляция «квайна»
Понял, почему вы опубликовали программу в таком странном виде. Но всё же беру на себя смелость опубликовать декомпиляцию вашего труда для тех, кто захочет побить ваш рекорд. :-)
Да, всё верно - именно так
Да, всё верно - именно так программа и работает, как вы прокомментировали :) Можно, конечно, выводить ее текст на графический экран, а не в строку комментариев, но это увеличит размер квайна.
Сокращаем
1. Проверку на 255 (рядом с меткой A21) в МК-161 выполняет команда KNOT. Исходное число после проверки достаётся командой FВх. (4 шага)
2. В строке A68 не уверен, что нужен FR. Похоже на фортовскую привычку убирать за собой в стеке. (1 шаг)
3. Cx В↑ В↑ перед КЭКР стоят для красоты. Если мы работаем над минимальным размером программы, они не нужны. (3 шага)
4. В этом же жёстком жанре красивая временная задержка A83 меняется на FL0 с R0, заточенным под скорость железки. Конечно же, это потребует реальную МК-161, а не эмулятор. (около 5 шагов)
AtH wrote: 1. Проверку на 255
[quote=AtH]
1. Проверку на 255 (рядом с меткой A21) в МК-161 выполняет команда KNOT. Исходное число после проверки достаётся командой FВх. (4 шага)
[/quote]
Согласен, здорово.
[quote=AtH]
2. В строке A68 не уверен, что нужен FR. Похоже на фортовскую привычку убирать за собой в стеке. (1 шаг)
[/quote]
Из той же оперы, что и Cx В↑ В↑ перед К ЭКР. А именно, для того, чтобы в регистре T стека при выводе отображалось количество оставшихся символов. Жертвуя красотой, можно убрать.
[quote=AtH]
4. В этом же жёстком жанре красивая временная задержка A83 меняется на FL0 с R0, заточенным под скорость железки. Конечно же, это потребует реальную МК-161, а не эмулятор. (около 5 шагов)[/quote]
Но при этом в R0 нужно предварительно загонять константу задержки типа 9 F 10^X П0. Не спорю, сокращение здесь возможно.
Добавлю, что можно убрать в начале программы обнуление РР П9030 индексного регистра 0 универсального байтового буфера, если заранее известно, что там ноль (3 шага).
Как это невозможно?
Как это невозможно написать квайн для МК54/61? Возможно, если поупражняться в комбинаторике. Программа будет состоять из 3 или 4 шагов максимум, последняя команда - С/П. На экран должно выводится число IJKLMN50, где IJ, KL и MN - коды соответствующих команд ПМК. Желающие могут взять таблицу команд МК61 и написать программу перебора комбинаций.
60 50
ИП0 С/П, где в R0 записано число 6050 или даже видеосообщение "60 50".
Но это выведет код программы, а предложенный «квайн» выводит исходный текст.
Ни в коем случае
Такие "решения" не могут быть всерьез рассмотрены, как и однокомандное "решение" LIST для Бейсика. Если используются регистры, то программа должна сама их заполнять.
Конкурс "Программа печатает сама себя" проводился в НиЖ №6 1988. У языка МК нет исходного текста, есть внутреннее представление команд, есть их коды и есть многочисленные варианты мнемоник. Вывод кода при отсутствии алфавитного отображения ничем не хуже вывода его мнемоники.
Serguei_Tarassov wrote:
[quote=Serguei_Tarassov]
Как это невозможно написать квайн для МК54/61? Возможно, если поупражняться в комбинаторике. Программа будет состоять из 3 или 4 шагов максимум, последняя команда - С/П. На экран должно выводится число IJKLMN50, где IJ, KL и MN - коды соответствующих команд ПМК. Желающие могут взять таблицу команд МК61 и написать программу перебора комбинаций.[/quote]
Как отметил AtH, здесь действительно предполагается вывод исходного текста, а не кода.
У языка
У языка МК нет исходного текста, есть внутреннее представление команд, есть их коды и есть многочисленные варианты мнемоник. Например, команда с кодом 60 может записываться как ИП0, П-х0, RCL0 и т.д, включая собственно "60". Одна из систем записей программ для МК использовала именно коды, т.к. в те времена мнемоники были сложны для типографий и пиш.машинок.
73 шага
Применил все обсуждавшиеся выше оптимизации и ещё несколько моих фирменных. Сократил код примерно на четверть (на 25 шагов), теперь «квайн» занимает 73 ячейки памяти программ.
Алгоритм не менял, разве что перестал использовать регистр A и вывожу два пробела перед мнемоникой, а не после. Это позволяет подольше подержать на экране первую команду CX и упрощает очищение строки комментария. Некоторые оптимизации весьма суровы, ведь подобные конкурсы безжалостны. При желании нужные недокументированные сервисные возможности можно ввести обратно, всё равно код будет меньше исходной программы.
Выложил программу в виде файла quinemk8.mkl, но в обфусцированный вид (абсолютно совпадающий с выводом, без комментариев и с адресами) программу не приводил. Запишите с экрана, если нужно. :-)
Оптимизация существенная
[quote=AtH]Применил все обсуждавшиеся выше оптимизации и ещё несколько моих фирменных. Сократил код примерно на четверть (на 25 шагов), теперь «квайн» занимает 73 ячейки памяти программ.
[/quote]
Да, оптимизация существенная. Браво!
72 шага.
Это кажется невозможным, но с помощью ещё одного грязного трюка удалось сократить и эту программу на один шаг: quinemk9.mkl
Интересный факт. Благодаря тому, что метка TwoBytes равна 51, новосибирский декомпилятор на этом варианте сбоит. Думает, что по адресу 15 использована кодово-адресная связка. Она действительно была в одном из старых вариантов программы, но здесь её роль хорошо выполняет команда + перед меткой CopyM.