В конкурсе IOCCC 2025 выбрали 23 победителя, и в этом году обфусцированный C снова вышел за пределы привычной шутки для любителей код-гольфа. Один из главных экспонатов — эмулятор Subleq длиной 366 байт, который в демонстрации рисует цветное множество Мандельброта, запускает Pong и в итоге добирается до Linux. Для русскоязычных разработчиков здесь интерес не только в эстетике хаоса: это редкий случай, когда предельно странный код вдруг упирается в вполне прикладную тему — сохранение и переносимость ПО.
Об этом обфусцированном C сообщает The Register, пересказывая итоги 29-го International Obfuscated C Code Contest. Конкурс существует с 1984 года и награждает программы, которые одновременно работают, ломают читабельность и показывают нетривиальные идеи в языке C. После четырехлетней паузы IOCCC вернулся в прошлом году, а теперь снова прошел без долгого перерыва. Судейство завершилось примерно за три недели до публикации материала, но сами ролики с победителями разбирали и выкладывали отдельно: многие работы проще один раз увидеть, чем пытаться понять по исходнику, где заканчивается программа и начинается розыгрыш.
Главный номер сезона — работа Адриана Кейбла, получившая приз как лучший воображаемый эмулятор. Формально это реализация Subleq, то есть One Instruction Set Computer с одной инструкцией subtract and branch if less than or equal to zero. Если довести идею RISC до логического предела, получится примерно это: дальше упрощать уже некуда. Но важен не только сам трюк. The Register связывает проект с Eternal Software Initiative — подходом к сохранению ПО через архитектуру, которую предельно легко эмулировать спустя годы, когда исходное железо уже умерло, перепродано на металлолом или просто не существует в дата-центрах и лабораториях. У ESI есть программная реализация Subleq, компилятор C на базе LLVM и даже порт Linux с библиотеками времени выполнения для C и C++. На этом фоне девятистрочный конкурсный исходник перестает быть просто мемом про кривые скобки: это минималистичная витрина идеи, что программную совместимость можно собирать с почти абсурдно маленького основания.
Второй сильный мотив этого года — эмуляция как форма технического фокуса. Ник Крейг-Вуд взял сразу три награды. Одна из них — за рабочий эмулятор оригинального Nintendo Game Boy, уместившийся в 66 строк C и еще и оформленный в виде самой консоли. Вторая — за «дробный» эмулятор Commodore 64 внутри языка FRACTRAN Джона Конвея, что звучит как шутка, но именно поэтому и попало в IOCCC. Третья — за использование Unicode в реализации варианта Forth с программой, которая строит вращающийся зум по множеству Мандельброта. В нормальной инженерной жизни это почти ни к чему не приведет напрямую. Зато очень хорошо показывает, насколько условны наши представления о минимально достаточном рантайме, удобстве языка и размере «неизбежной» инфраструктуры вокруг эмулятора или интерпретатора.
Юсукэ Эндо, один из самых известных участников IOCCC, тоже взял три награды, и здесь уже начинается чистая демонстрация того, что обфусцированный C умеет ломать не только синтаксические ожидания, но и само представление об исходнике как о пассивном тексте. В одной работе он сделал симулятор nixie tube: код отформатирован в виде лампы, а цифры в исходнике подсвечиваются цветом и сами становятся механизмом вывода. В другой — компактно генерирует фигуры Лихтенберга. В третьей — программа многократно патчит собственный код, пересобирает себя и в итоге печатает исходник для diff-инструмента, которым сама же и пользовалась. Судьи назвали это самым устойчивым победителем, а для самого Эндо это уже 23-я победа в истории конкурса. По меркам обычной разработки пользы от такого мало, но для тех, кто пишет компиляторы, инструменты анализа, генераторы кода или системы самосборки, это хорошее напоминание: границы между исходником, артефактом сборки и выходом программы намного подвижнее, чем кажется в стандартном CI-пайплайне.
Отдельная находка — работа Джоны Уэлленберга с Pong-квайном. Квайн сам по себе печатает собственный исходный код, а это уже нетривиальная задача. Здесь идея доведена до уровня, где игра и есть последовательность версий исходника. В тексте программы скрыто поле Pong, компиляция запускает кадр, нажатие клавиши двигает ракетку, после чего программа переформатирует собственный код и выводит новую версию следующего кадра. Играть нужно буквально через цепочку перекомпиляций. Рядом на этом фоне даже сравнительно «обычные» победители выглядят спокойно: 54-строчная roguelike-игра, анимированная ASCII-заставка в духе Doctor Who, генерация множества цифр числа Эйлера с одной переменной по имени e, а также 36 строк C, которые создают WAV-файл с пятиминутной эмбиент-композицией и шумом моря.
Если отбросить зрелищность, итоги IOCCC 2025 дают вполне трезвый вывод для индустрии. Во-первых, экстремально сжатые и запутанные программы остаются хорошим стресс-тестом для компиляторов, рантаймов и наших собственных представлений о сложности систем. Во-вторых, история с Subleq и Eternal Software Initiative показывает, что даже конкурсный артефакт может подсветить реальную проблему — как сохранить исполняемость софта дольше жизненного цикла конкретного процессора, платформы или вендора. И в-третьих, такие работы полезны именно как прививка против избыточности: когда очередной сервис тянет полгигабайта зависимостей ради одной кнопки, девять строк, запускающие цепочку вплоть до Linux, смотрятся не столько магией, сколько неприятно точным комментарием к состоянию отрасли. Больше примеров и разбор победителей собрано в материале .