программирование

«МК-61»: размер программ

Много где говорится, что программы для «Электроники МК-61» занимают не более 105 ячеек памяти. На самом деле, смотря как считать.

Из-за ограниченности памяти у большинства программ константы в регистры вводятся ещё до ввода программы, отдельно и не занимают 105 ячеек, где хранится сама программа. То есть существует часть программы, которая как бы не считается, которая выполняется и результат её выполнения потом используется основной программой.

Например, на приведённом тетрадном развороте справа видно значения, которые надо ввести до ввода программы.

Рукописная программа «Звёздный бой» для ЭВМ: таблица команд с адресами, кодами и комментариями по вводу координат, вычислению энергии, выводу символов победы и управлению кораблём.
Разворот тетради Александра Долгушина, автора кучи программ для «Электроники МК-61»

Это как если бы браузер (или что вы там запускаете каждый день) состоял из двух программ, которые надо было запускать каждый одну за другой, всегда в определённой последовательности, потому что вместе они не влезают в память.

Это очень хорошее изобретение позволяет впихивать в ограниченную память калькулятора очень много логики, так как на значениях предзагруженных констант иногда строятся такие алгоритмы, что закачаешься!

И в «МК-Про», и в «MK-61s» это тоже приходится учитывать. И в первом и во втором проекте пришлось конструировать средства для предвыполнения кода перед основной программой.

В «МК-Про» я сделал особый блок state, где записываются такие конструкции, а в «MK-61s» я просто загружаю в память сначала первый блок и выполняю его, потом, в те же ячейки гружу саму программу.

3 комментария

«МК-Про»: далеко ли до «отлично»?

В моей работе над проектом ретроконсоли «МК-61s» сейчас наступило запланированное затишье: все разумные улучшения сделаны. Иногда я нахожу небольшие ошибки или вижу возможность что-то сделать лучше и вношу соответствующие изменения, но моего активного участия проект уже не требует.

Поэтому высвободившееся внимание я направил на проект «МК-Про» — интерпретатор придуманного мной языка высокого уровня с мощным оптимизатором. Он должен уметь умещать программы разумного объёма в безумные 105 байт, доступных на программируемом калькуляторе «Электроника МК-61».

Этот проект родился в ответ на вопрос Ивана Чернякова, заданный в недавно вышедшем документальном фильме, при создании которого я выступал консультантом: не знаю ли я такой задачи, с которой не смогли бы справиться программирующие нейросети.

Со временем, у меня сложится такой критерий того насколько нейросеть хорошо решила эту задачу — насколько близко мы приблизились к оптимизированной версии игры «Пещера сокровищ» в варианте Сергея Анварова «Крестики-нолики 4×4» программиста Hs On — монстра оптимизации под эту ретроплатформу.

На настоящий момент разница составляет 34 байта или 25%, я попросил нейросеть нарисовать для наглядности график. Планирую сегодня запустить свежевышедшую на днях сеть «ГПТ-5.6 Сол» в режиме «ультра», посмотрим, продвинется ли она дальше. В режиме «очень высокого» усилия (это уровень, предшествующий режиму «ультра»), она продвинулась на два байта, это много.

График изменения размера в клетках с 28 мая по 11 июля: рост до 386 (полная игра), затем резкое снижение до 134 (UI fix), стабилизация около лимита 105.
Там где значения плюсовые — это исправления каких-то багов оптимизатора

Добавлено позднее: в итоге сеть мне сначала довела почти до 105 байт, а потом откатила часть прогресса, сделанного другими сетями и теперь программа у нас занимает 154 байта. Причина — оптимизации слишком заточены под конкретную программу, что противоречит задаче.

3 комментария

ИИ: локальное ревью кода

reviewbot запросил изменения в ревизии: дифф добавляет функционал коротких тем для вопросов ОГ, включая таблицы, миграции, контроллеры, валидаторы и интеграцию в карточку…

Подключил локальный DeepSeek-V4-Flash, который работает у нас в офисе на четырёх H200, к ревью кода. Прошла неделя, выводы такие: моя оценка колеблется от 3+ до 4, снижаю из-за многословности и промахов по ревью. Первое в процессе исправления, второе правится документацией, в которой надо описать особенности, которые он иногда из контекста и кода не выводит.

Бот-ревьювер полностью навайбкожен за день в виде плагина к нашему менеджеру задач и имеет несколько инструментов, позволяющих ему анализировать текущий код и даже заглядывать в описание задачи.

Считаю, что польза уже есть, но надо продолжать его улучшать.

Оставить комментарий

«МК61s»: распробовал «Фейбл 5»

Скриншот Finder macOS: папка /Volumes/MK61S FS с тремя файлами .M61 — Bumblebee Fly, Fox Hunting, Infinity Story — с иконками вопроса.

Самая сложная задача, которую пришлось решать для ретроконсоли «MK61s», — это монтирование её как диска. В прежней прошивке программы были зашиты внутрь, и пользовательского способа сохранить туда новые программы не существовало. Я подумал, что раз есть USB-разъёмы, то можно попробовать сделать свою файловую систему, которая будет отображаться на компьютере как диск.

Перебрав в голове все варианты, я решил делать эмуляцию FAT12. Напрямую она не подходила: не очень хорошо ложится на флеш-память, да и размер сектора о-го-го по сравнению с программой. Но, по сути, это был единственный вариант: все остальные системы сложнее, а те, что требуют установки отдельного софта, просто неудобны.

Этот путь тоже не был безоблачным, проблем хватало. Система, к которой подключён такой диск, не пишет файлы последовательно, то есть там нет команд вроде: «мы начали писать вот такой файл, вот его полное упорядоченное содержимое, а вот и конец». Система пишет кусками, причём это могут быть куски разных файлов вперемешку. Их нужно получить в буфер, а по окончании аккуратно разобрать на файлы, найдя там же метаинформацию, из которой можно получить имя файла. Нетривиальная задача, на самом деле.

Я написал «ГПТ-5.5» всю первую версию, которая довольно неплохо работала, пока я не стал копировать файлы группами — на группе по пять файлов возникал сбой, диск пропадал и операция прерывалась. С «ГПТ-5.5» я просидел до часу ночи, но баг не лечился. Мы даже делали псевдофайл, в который сохранялись команды операционной системы, чтобы разобраться в ситуации, но всё тщетно.

«ГПТ-5.5» мне говорил «вот новая прошивка, я всё починил», но баг никуда не уходил — простое копирование пяти файлов опять всё роняло.

В итоге, я открыл сеть «Фейбл 5», описал ей проблему и она задумалась минут на двадцать, после чего начала неспешно писать код, в котором проблема была исправлена. Без отладки, без тестов, без диагностики. Задачу я ставил в минимальной формулировке, почти буквально «пять файлов копирую, оно падает», а «Фейбл» разобрала весь код, увидела проблему и решила, даже ни разу ничего не запустив.

Что я хотел сказать этой историей — человек так не сможет.

43 комментария

«МК-61s»: русские буквы

Вчера я писал, что сделал ретроконсоли «МК-61s» русификацию. Звучит несложно, если не знать, что дисплей того устройства, которое у меня на руках, не выводит графику. У него алфавитно-цифровой принцип, причём у меня стоит японская версия, в которой русских букв нет. Вот вся его таблица:

Таблица символов кодовой страницы CP437: десятичные коды от 32 до 255, соответствующие ASCII-символы, латиница, кириллица, японские катакана и специальные графические символы.

Как же делается русификация? Секрет в том, что в позициях от нуля до семи стоят символы, которые можно определять самостоятельно. Пришлось написать упаковщик, который, выводя на экран русские символы, на самом деле заменяет их латиницей, а те буквы, которые есть только в русском, распихивает по восьми символам, которые можно рисовать самостоятельно. Если позиций не хватает, пытается минимально изуродовать вывод, заменяя «Ч» на «4» и «У» на «Y».

Пока работает идеально, глюков не было — во тех фразах, что используются в интерфейсе, восьми дополнительных символов хватает, а пользователь русские символы ввести не может — для этого нет никаких средств.

Оставить комментарий

Доработка «МК-61s»

Программировать всякие железки — увлекательнейшее занятие. За ночь и утро я её русифицировал (решив проблему распихивания русских букв на восьми программируемым знакоместам), выделил слой примитивов работы с экраном, что позволило объединить две прошивки в одну, добавил интепретаторы двух языков (Бейсик и Фокал), сделал файловую систему с монтированием этой системы на компьютере и ещё многое другое.

Бейсик планировали сделать в сообществе и я его прикрутил строго по техзаданию, но мне не понравился режим ввода букв — на клавиатуре калькулятора нет способа ввода алфавита, не нужно было, поэтому в Бейсике предлагалось нанести на клавиатуру ещё один слой клавиш со своей уникальной раскладкой.

Запомнить это тяжело, поэтому я и реализовал Фокал. Не совсем чистый, его диалект. В Фокале каждое ключевое слово начинается на свою собственную букву. Их вообще можно не дописывать, а так и оставить однобуквенными — Фокал их и в такой форме понимает.

В «МК-61s» я сделал то же самое — на клавиатуре есть буквы от «a» до «e» для ввода имён регистров и некоторые другие буквы, на них я завязал ввод операторов, по пути переименовав некоторые из них — ASK, BRANCH, COMMENT, DO и так далее. А остальные буквы вводятся на цифровой клавиатуре, как это раньше делали с СМС — нажимаем K («клавиша»), а потом нужную цифровую кнопку на каждой из которой сидят по три или четыре цифры, как на старых кнопочных телефонах.

Я попробовал, так гораздо проще набирать программы. Мне кажется, что от Бейсика надо избавиться и, если уж хочется иметь в этой консоли какой-то язык высокого уровня, развивать Фокал.

Электроника МК-61s-Mini с экраном «ГРОМКОСТЬ 0, СКОРОСТЬ ТУРБО» и клавиатурой, подключена кабелем к USB; ссылка на GitHub: https://github.com/un7fg0/mk61s_mini

Оставить комментарий

Ретроконсоль «МК-61s»

Мне довольно быстро дошла посылка с собранной ретроконсолью «МК-61s». Я уже писал, что познакомился с её авторами на почве интереса к «Электронике МК-61», и они выслали мне устройство.

Ещё не успел как следует разобраться, только включил: правильно догадался, что за включение отвечает рычажок справа. Надо будет хотя бы инструкцию почитать, а то я пока даже не знаю, как к нему подступиться.

Пока интересует, как в него заливать свежую прошивку, что делает рычажок сверху и почему у него два юэсби-порта. В меню я уже попал, там есть предзагруженные игры, парочку запустил, но пока отложил, надо отдельно с ней разбираться.

Дополнено: немножко разобрался, но вопросов стало только больше. Для работы с прошивкой предназначен разъём слева, устройство надо перевести в режим DFU через меню. Но, самое главное, — дата прошивки 10 мая 2026 года, а репозиторий устройства не обновлялся уже восемь месяцев. Вопрос — где же идёт работа?

Да и размеры не совпадают. Я слил прошивку с устройства, она там занимает около 80КБ, тогда как, если собрать прошивку из репозитория, она займёт около 60. Ничего не понимаю.

Калькулятор ЭЛЕКТРОНИКА МК-61s-Mini на фоне зелени. На корпусе URL: https://github.com/un7fg0/mk61s_mini

2 комментария

О разном

Раз дочка в Лениногорске счастливо проводит время с бабушкой и дедушкой и нет надобности откуда-то её забирать вечерами, решил заняться здоровьем. Сначала зубы — во Вьетнаме как-то сама собой сломалась пломба, да и остальные зубы глянуть не мешает, всё-таки больше десяти лет у зубного не был. Потом займусь зрением — садится, надо всерьёз задуматься об очках, а потом и чекап неплохо было бы сделать. С прошлого почти семь лет пришло.

Всё вожусь с языком «МК-Про», всё глубже погружаясь в дебри «Электроники МК-61». Познакомился с увлечёнными программистами из старой гвардии, которые пилят проект «МК-61s» — программно-аппаратный эмулятор программируемого калькулятора с расширенными возможностями. Свой проект на Си++ я переписал в том числе с их подачи. Сообщество небольшое, но увлечённое, я сам не заметил, как тоже увлёкся.

Теперь ко мне едет уже собранный «MK-61s», должен через неделю приехать. Купить я пока не решился, этот мне выслали для тестов, возможно я смогу тоже привнести что-то своё в проект.

Говорят нам на днях должны вернуть нейросеть «Фейбл 5», на которую американское правительство наложило запрет. Сам я её погонять успел мало, но те, кто успел, говорят, что она программирует уже на уровне синьора. Ну проверим, у меня задача для неё есть — довести в «МК-Про» оптимизатор до такого уровня, чтобы повторить или превзойти по компактности вариант Сергея Анварова игры «Пещера сокровищ».

В то, что она хотя бы дотянет до этого уровня я не верю, но любопытно посмотреть насколько близко подойдёт, так как доступные сейчас сети уже упёрлись в свой потолок.

Поставил себе и родителям «Дельта-чат» — программу, которая умеет чатиться через электронную почту, настроил через почту «Яндекса». Удобно, что работает и когда «белые списки» врубают, правда неспешно. Каким-то чудом там работают и звонки, причём даже с видео. В ней есть несколько очевидных недостатков, хочется дописать, но не настолько хочется, видимо, чтобы этим заняться.

48 комментариев

«МК-Про»: два регистра в одном

В оптимизаторе «МК-Про» как будто бы все низко висящие плоды собраны — реализованы все оптимизации, кроме очень сложных. Но осталась одна эталонная программа, не укладывающаяся в размер: оптимизатор до сих пор проигрывает ручной упаковке.

Сейчас я реализую многоходовую оптимизацию, и у меня трудятся сразу несколько агентов, чтобы её запрограммировать.

Первая часть уже, в принципе, давно готова: идея в том, чтобы хранить в одном регистре сразу два значения. Тут можно придумать несколько способов, но самый простой — следующий.

Идея в том, что два целых числа с известными диапазонами можно упаковать в одно число: одно — в целую часть, другое — в дробную. Тогда извлечь их можно операциями нахождения целой части (K [x]) и дробной части (K {x}), причём дробную часть потом часто можно и не домножать: транслятор может заменить всю арифметику с ней так, что всё будет работать ожидаемым образом, но вместо диапазона 0…9 будет использоваться диапазон 0…0,9.

В эталонной программе, о которой идёт речь, все регистры заняты под завязку, и эта оптимизация должна работать в связке с другой: в дробной части будет храниться счётчик, а в целой — опорное число для адреса перехода, которое, например, будет менять знак в зависимости от условия. Сам адрес считается по подобранной формуле.

Опорное число и формула подбираются в зависимости от того, где реально оказались в памяти подпрограммы, к которым надо перейти, и это не проблема. Хотя сеть убеждала меня, что опорное число придётся подобрать вручную, я подсказал ей идею простого решателя, и он, судя по тестам, работает.

Вчера я остановился на том, что решатель должен перебирать функции, в том числе тригонометрические: именно они обычно дают самый толковый результат. Но в «МК-61» и в C++ они дают немного разные результаты.

В общем, зарядил я «Кодекс», чтобы он покопался в микрокоде калькулятора и алгоритмически повторил код, реализующий тригонометрию в Си++. Цель была обозначена, на мой взгляд, очень чётко. Но не зря я говорю, что нейросеть иногда похожа на джина, который всё, что можно понять двояко, вывернет вам во вред.

Когда я уходил спать, всё работало как часы — нейросеть копалась в ПЗУ калькулятора, сравнивала реализацию с эталоном, разбиралась почему ошибки. Утром я первым делом полез в этот код, чтобы посмотреть что получилось. А там…

А там, как говорят поляки «wygląda jak gówno, a smakuje jeszcze lepiej» — «выглядит как говно, а на вкус ещё лучше». Пятьдесят тысяч строк отвратительного лапшекода, сгенерированного программно из ПЗУ «МК-61».

Сеть на каком-то этапе поняла, что цель не приближается, написала автогенератор этой дичи, убедилась, что все тесты позеленели и успокоилась.

48 комментариев

Программируемые калькуляторы и баги

Самое интересное в советских программируемых калькуляторах — исследовать их недокументированные возможности, или, иначе говоря, баги. Я сейчас говорю про «Электронику МК-61», с эмуляторами которой я вожусь уже которую неделю, но, в принципе, в любой модели их было навалом. И что мне сейчас кажется странным — эти модели выпускались годами, но баги никто не исправлял.

Например, «МК-61» выпускали с 1984 до 1991 года, но ни один баг, насколько я знаю, не исправили. В принципе, с частью багов жилось даже веселее — бо́льшая часть из них позволяла, при известной фантазии, уменьшать размер программ, что, конечно, при объёме памяти в 105 ячеек очень даже полезно. Но непонятно, почему нельзя было исправить хотя бы те, которые влияли на вычисления.

Таких багов я знаю два: функция вычисления максимума считает ноль самым большим числом (можно попробовать ввести 500 В↑ 0 max, чтобы убедиться), а второй — генератор случайных чисел начинает зацикливаться, если попробовать взять целую часть случайного числа.

Сравнение раскладок калькулятора ЭЛЕКТРОНИКА МК 61: слева латиница, справа кириллица с кнопками F, K и цветными функциями.
Разворот из брошюры «Elektronika MK-61 Calculator Operating Instructions»

Если к первой ошибке можно было привыкнуть — и я даже видел игры, где это свойство использовалось, — то ломающийся генератор, во-первых, никаким полезным свойством не обладал, а во-вторых, увеличивал размер программы, потому что целую часть приходилось получать другими способами, вместо функции F [x], которая для этого предназначена.

Почему эту проблему нельзя было решить, выпустив условную «Электронику МК-61М», для меня загадка. С одной стороны, страна гордилась своей инженерной школой — и отголоски этой гордости до сих пор хорошо заметны. С другой — такое вот безразличие к багам в массовых моделях.

16 комментариев

«МК-Про»: прогресс по переводу на Си++

По моим ощущениям, я должен был перевести с помощью нейросети на Си++ код транслятора языка программирования высокого уровня «МК-Про» для «Электроники МК-61» к вечеру воскресенья. Да, там много сложного кода, но мне казалось, что синтаксически перевести одно в другое, а потом посмотреть на тесты — довольно простая задача для современных нейросетей.

В реальности же пошёл уже шестой день. С некоторыми перерывами, конечно: иногда работа, например, прерывается ночью — сеть ждёт от меня ответа на какой-то вопрос, а я сплю. Так что можно считать, что шестой день работа идёт примерно с семи утра до одиннадцати вечера.

В данном случае мы наблюдаем горе от ума: сеть попроще — GPT-5.3-Codex-Spark — перебрасывает код именно по той схеме, которая была у меня в голове: «айда перепишем, а потом посмотрим на тесты», но у неё быстро кончаются лимиты. А вот ГПТ-5.5 работает более методично: переписывает кусками, основываясь на том, что показывают тесты. Так медленнее, да ещё и тесты гоняются по многу минут, а их много, поэтому всё и идёт туго.

Я согласен с тем, что так, наверное, лучше, потому что это позволяет скорректировать архитектуру, поэтому особо не настаиваю, но ждать уже надоело. В данный момент прогресс такой: перетащено всё — основной код транслятора, оптимизирующие стратегии (их более 300), тесты синтаксиса проходят, но эталонные программы транслируются байт в байт не все: ещё около двух третей сильно отличаются от эталона.

Оставить комментарий

Программирование на четырёх GPU

Я сходил в отпуск, но ребята в офисе не прекращали тестировать нейросетки для локального программирования. Мы уже смотрели на сети, которые запускаются на одной и двух картах Nvidia H100, и приступили к тестированию конфигурации из четырёх H200.

Я не помню, рассказывал ли я, для чего вообще мы рассматриваем конфигурации больше чем с одним графическим ускорителем. Ответ простой — большие сети занимают очень много памяти и в память одного ускорителя не помещаются. Современные фреймворки разбивают сети на части, загружают их в память нескольких ускорителей, а данные между ними гоняют по быстрой шине, соединяющей ускорители между собой. В случае карт Nvidia это шина NVlink.

К слову, мы пробовали соединение через центральную шину — с точки зрения производительности это печально, пользоваться невозможно.

В общем, мы потестировали несколько больших моделей, работающих в этой конфигурации и спустя две недели рейтинг уже сложился:

  1. DeepSeek-V4-Flash
  2. zai-org/GLM-4.5-Air-FP8
  3. Qwen3-Coder-480B-A35B-Instruct-FP8

Можно попробовать ещё ГЛМ поновее и КИМИ, но они обе будут с сильными квантированием, поэтому есть сомнения, что они смогут побить победителя. «Квен» что-то расстроил, я ожидал, что он будет лучше всех, а он на тестах занял последнее место.

Скриншот вывода nvidia-smi: 4 GPU NVIDIA H200 NVL, драйвер 595.71.05, CUDA 13.2; температура 27–30°C, потребление 91–98 Вт из 600 Вт, память ~136 ГБ из 143 ГБ, загрузка 0%.

8 комментариев

«МК-Про»: переписываю на Си++

Сейчас транслятор «МК-Про» — языка высокого уровня для «Электроники МК-61» — написан на ТайпСкрипте. Я выбрал этот язык по двум причинам: хотелось на него посмотреть, и была идея прикрутить транслятор к эмулятору «МК-61», который работает в браузере.

Но вчера я решил переписать его на Си++. При помощи нейросети, конечно. Производительность ТайпСкрипта стала серьёзным блокером: в процессе трансляции оптимизатор перебирает огромное количество вариантов, чтобы уместить программу в 105 байт, и иногда этот процесс занимает минуты. Надеюсь, перевод на Си++ решит эту проблему.

Интересно, за какое время нейросеть справится с этой задачей. Проект большой: около 80 тысяч строк только основного кода; кроме того, очень много тестов — около двух тысяч, если ничего не путаю, — и есть эталонные программы, которые должны скомпилироваться байт в байт.

Спустя полтора часа транслировалось уже десять программ и я удивился такой скорости, пошёл читать исходники, а там, то, что на скриншоте — чёртова ленивая нейросеть просто затолкала внутрь кода эталонный результат десяти программ. Офигенное решение.

Скриншот редактора кода с открытым файлом compiler.cpp, где виден фрагмент C++-кода с функцией lower_remaining_exact_example_program и массивами шестнадцатеричных данных.

4 комментария

«Электроника МК-61»: «Экспресс»

Как я когда-то говорил, будь сейчас менее просвещённое время, я обязательно основал бы секту по сохранению любой информации, пусть даже самой незначительной и малоинтересной. Мне плохо физически, когда я понимаю, что какие-то знания утрачены навсегда, и я очень радуюсь, когда исследователи находят что-то новое, до сих пор неизвестное.

Думаю, заметно, что последние несколько недель я занят языком «МК-Про» — при помощи нейросеток пишу высокоуровневый язык для калькулятора «Электроника МК-61». В рамках этой же движухи я также собираю себе в репозиторий все игры для этого калькулятора, которые так или иначе упоминаются в источниках, которые мне приходится штудировать. Благо с этой работой нейросетки справляются на четыре с плюсом, но зато куда быстрее, чем это мог бы сделать я.

В процессе вышел на архивный сайт, где когда-то были опубликованы самоиздатовские выпуски клуба любителей игровых программ «КЛИП» — довольно известного и хорошо организованного движения ранних 90-х. Его участники увлекались программированием на «МК-61», а лучшие программы публиковались.

К сожалению, в архиве сайта выпуски не сохранились, но меня это только раззадорило: я решил попробовать выйти на бывших организаторов клуба в надежде, что у них сохранились сканы. Пока я этим занимался, случайно нашёл во «ВКонтакте» паблик человека, который пытался возродить исторический интерес к «МК-61» и выложил часть номеров. Я предположил, что у него могли сохраниться и остальные, и не ошибся.

У бывших организаторов, к слову, сканов не оказалось. Конечно, речь только о тех, с кем я смог связаться: не всех можно найти в интернете спустя три десятилетия. Найденные сканы я передал одному из них, и скоро они будут опубликованы на самом известном, наверное, сайте из тех, что посвящены программируемым калькуляторам, — «Кон-Тики».

Разворот журнала «Экспресс» (09.91): опрос читателей, объявления о продаже игр, таблица паролей к «Защитнику», редакция и логотип клуба любителей игровых программ.
Разворот девятого номера «Экспресса» (1991 год) — издания клуба по калькулятору «Электроника МК-61»

25 комментариев

«МК-Про»: ЯП высокого уровня для «МК-61»

Язык высокого уровня для программируемого калькулятора «Электроника МК-61», который я начал писать с нейросетью, теперь называется «МК-Про». Надо же его как-то называть.

Скриншот интерфейса оптимизатора кода с чатом, где обсуждаются изменения в файлах, тесты и команды npm, включая цель «Полностью довести оптимизацию через X2».

Вообще, начал я его писать, потому что меня спросили, не знаю ли я какую-то задачу, с которой сегодняшние нейросети не справятся. Не то чтобы я ожидал, что совсем ничего не выйдет, но думал, что хорошо, пожалуй, не получится. Задача — сделать язык программирования, который будет транслироваться в код, которому доступно всего 105 ячеек, — мне показалась достаточно сложной.

Справедливости ради, хорошо, пожалуй, ещё не вышло, мы только на пути к этому, хотя я верю, что может получиться. Тот вариант, который сейчас уже есть, я оцениваю где-то на три с плюсом. Последние несколько дней нейросеть занята самой, наверное, сложной оптимизацией, которая только есть, — использованием регистра X2 в калькуляторе.

На скриншоте видна очередная сессия, которая, как можно заметить длится без перерыва уже более тридцати часов и до конца ещё очень далеко — неделя или около того. Чтобы сеть не прерывалась, я выставил так называемую «цель», её видно на скриншоте.

105 байт памяти, стек и пятнадцать официально доступных регистров вынуждают использовать самые нетривиальные хаки. Их очень много: если начать рассказывать, я буду писать только о них. Самый нетривиальный, как оказалось, — хак с использованием регистра X2. Это недокументированная возможность, поэтому её использование не очень распространено.

Это не вполне регистр, скорее техническая ячейка для хранения копии экрана, но в программном режиме она обрастает некоторым количеством багов — их вообще в этом калькуляторе полно, — что позволяет использовать её в некоторых случаях как ещё один регистр. В основном — для хранения промежуточных значений.

Я собрал очень много готовых программ — больше четырёх сотен, и в самых плотно упакованных все регистры уже заняты. Выгрузить их тоже некуда: памяти, напоминаю, очень мало — сотня байт, поэтому X2 там очень даже к месту.

Интересно, насколько хорошо будет работать оптимизация, когда нейросетка её доделает. Хотя мы всё обвешиваем тестами, промежуточный результат пока ничего не даёт, кроме расхода токенов: оптимизацию можно будет полноценно включить только в самом конце. Очень жду завершения этого этапа: так долго подпинывать нейросеть без промежуточного результата — скучновато.

4 комментария

Попробовал «Кодекс»

Так исторически сложилось, что серьёзно программировать с нейросетями я начал с «Курсора». До сих пор его использую, и планов куда-то переходить у меня не появлялось.

«Курсор» — специализированная среда разработки, заточенная под работу с нейросетями. В ней есть очень много специальных костыликов, позволяющих нейросети делать свою работу. Такие среды дают огромный прирост по сравнению с копированием кода из окна нейросети — тем, с чего мы все начинали.

Недавно братишка уговорил меня попробовать «Кодекс» — конкурирующую среду разработки, которую делает компания «Оупен-Эй-Ай». Аргумент он привёл очень убедительный — стоимость.

Не обманул: позже я убедился, что в рамках подписки за двести долларов можно работать почти с любой интенсивностью. Там, где в «Курсоре» легко тратились двести долларов в день, тут я, заплатив один раз, больше ничего не плачу́.

Объяснение простое: «Курсор» в основном перепродаёт токены чужих нейросетей, зарабатывая на разнице, а «Кодекс» продаёт токены нейросетей той компании, которая его делает.

При этом с «Курсором» мне работать приятнее. Не из-за эффекта утёнка, а из-за двух вещей, которые в «Кодексе» сделаны плохо.

Во-первых, «Кодекс» очень плохо сжимает контекст. Наверное, все знают, что у нейросетей есть так называемое «контекстное окно» — что-то вроде кратковременной памяти, где хранится ваш текущий разговор. И «Курсор», и «Кодекс» умеют заставлять сеть пересказывать себе ваш текущий разговор в более краткой форме, чтобы высвободить часть контекстного окна, когда оно приближается к пределу, но у «Кодекса» это получается плохо.

Я часто вижу, как «Кодекс» принимает часть моих указаний, на которые он уже отвечал, за сигнал к действию и начинает выполнять задачи, которыми уже занимался. В «Курсоре» я такого не видел ни разу.

Во-вторых, «Кодекс» плохо работает с планами. В «Курсоре» я частенько ставил большую задачу, он писал очень подробный план, показывал мне его, разбивал задачу на более мелкие, а потом очень долго воплощал план в жизнь, не останавливаясь, пока не доведёт дело до конца.

У «Кодекса» есть режим планирования, но развёрнутые планы он не пишет, а тем планам, которые пишет, не всегда следует. Он может без видимой причины остановиться, не доделав задачу; в этом случае мне приходится его подпинывать словами «делай дальше» или «продолжай».

В отпуске я очень много использую «Кодекс» — каждый день для развлечения пишу язык высокого уровня для калькулятора «Электроника МК-61», и у меня постоянно в стеке команд вереница фраз «делай дальше и коммить». Они подставляются по одной, когда сеть останавливается.

Выводы.

«Кодекс» я и дальше планирую использовать для своих собственных задач. Всё-таки возможность тратить меньше денег на хобби — существенный плюс, даже с учётом возрастающих затрат на управление. К счастью, возрастают они несущественно.

Бюджет «Курсора» буду тратить на работе. Во-первых, это позволит мне программировать для себя и компании в один и тот же день: раньше я разделял их, чтобы чётче понимать, сколько денег мне надо вернуть; во-вторых, затраты на управление для меня дороже в рабочее время, у меня очень высокая загрузка, и всё время дёргаться и смотреть, что там сделала сеть, для меня не вариант.

Скриншот интерфейса «Оптимизатор» с текстом о компиляции X2, ветках, масках и проверке кода; видны меню слева, панель среды справа и поле ввода внизу.

8 комментариев

Хаки в «Электронике МК-61»

Очень интересно разбирать хаки, которые разные люди изобретали, чтобы уместить свои программы в 105 байт памяти калькулятора «Электроники МК-61». Их там действительно просто нереальное количество, они разной сложности, но один из них показателен в своей простоте.

В коде программы «Рембо-III» есть несколько похожих мест (я буду приводить код на языке «МК-Про» для наглядности):

fn lost() {
  halt("ЕГГОГ")
}

fn front_stop() {
    …
    if cells[7] < 0 {
      lost()
    }
    …
}

Если некое проверяемое значение меньше нуля (в двух остальных местах — меньше или равно нулю), то пишем на экране «ЕГГОГ» — слово «error», это одно из немногих слов, которое калькулятор способен отобразить, так как у него есть специальная логика для отображения некоторых букв, поэтому его часто используют для обозначения проигрыша.

Мой оптимизатор умеет заменять halt("ЕГГОГ") одним опкодом, потому что это «встроенное» в калькулятор слово, но тут он пишет относительно много кода — проверка условия и вызов, тогда как проверку и вывод «еррора» можно объединить в один опкод — F √ или F lg в зависимости от условия.

Если число строго меньше нуля, квадратный корень из него даст ту же ошибку, как и логарифм от числа, которое меньше или равно нулю.

В «Рембо-III» это сокращает программу на четыре байта. Это существенно, когда у доступно так мало памяти.

13 комментариев

Язык высокого уровня для «МК-61»

Я тут довольно большой проект начал — язык высокого уровня для программируемого калькулятора «Электроника МК-61». В прошлом я с ним немного сталкивался и даже писал десять лет назад «Песню о пиве» для него.

Программирую вайбкодингом, разумеется, лучшими нейросетями из доступных — «Опусом 4.8» и «ГПТ 5.5». Вручную это проект на годы, без сеток я бы его даже не начинал.

Основная сложность — скромные возможности. На программу выделено всего 105 байт и несколько регистров, которыми можно оперировать, поэтому все лучшие программы написаны просто с нереальным количеством хаков, использующих как универсальные вещи (вроде возвратно-ориентированного программирования), так и специфические вещи, основанные на аппаратных особенностях и багах и багах калькулятора.

Электроника МК 61 — советский программируемый калькулятор с зелёным светодиодным дисплеем, показывающим «0112333333333», подключённый к кабелю, на деревянной поверхности.
Калькулятор «Электроника МК-61» по версии сети «Нанабанана-2»

Ядро языка уже давно написано и даже пережило несколько рефакторингов, но до конца ещё далеко. Я перевёл на него несколько существующих кодовых бриллиантов, чтобы разобраться с применёнными там приёмами оптимизации и моему транслятору до таких вершин ещё далеко.

Сейчас я, например, разбираюсь с упаковкой нескольких переменных в один регистр. Идея простая, но позволяет иногда экономить очень много: если у нас есть три переменные и каждая принимает значение от нуля до десяти, то можно хранить их в одном регистре поразрядно от «00.0» до «99.9».

Так, например, переписывается в текущем синтаксисе игра «Охота на лис» из блога Дениса Монатко:

program FoxHuntMK61 {
  field: board(0..9, 0..9)

  state {
    cell: coord(field)
    foxes: coord_list(field, 9) = random_unique()
    bearing: counter 0..9 = 0
  }

  loop {
    cell = read()

    if cell in foxes {
      found_fox()
    }

    scan_from_cell()
    show("--", cell:02, "--", bearing)
  }

  fn found_fox() {
    show(-20)
  }

  fn scan_from_cell() {
    bearing = line_count(foxes, cell)
  }
}

Это один из более чем двадцати примеров, где оптимизатор справляется лучше или на уровне опытного программиста на этом калькуляторе.

2 комментария

ИИ и системное администрирование

Вокруг программирования с помощью нейросетей так много шума, что кажется, будто остальные айтишные профессии остаются в стороне: будто в их жизни ничего не меняется и не поменяется.

Разумеется, это не так. Я уже как-то описывал случай, когда полторы-две недели занимался решением одной практической задачи: нужно было устанавливать и запускать на нескольких серверах мой пучок скриптов на Пайтоне для проверки различных гипотез.

Тогда я обошёлся без автоматизации — просто потому, что нейросеть выполняла мои хотелки с такой скоростью, что автоматизация оказалась мне не нужна. Тем более что в нестандартных ситуациях я не ограничен интерфейсом выбранного решения: в моём распоряжении голая командная строка, пиши что хочешь.

Выглядит это не очень промышленно, но не надо думать, что никто не исследует тему того, каким образом можно было бы хотя бы частично заменить системного администратора искусственным интеллектом.

На скриншоте — одна из первых ласточек: Линукс от «Селектела» со встроенным «системным администратором»; в его качестве выступает нейросеть «Квен 3.5» с весьма скромными по нынешним временам характеристиками. Она превращает задачу пользователя в команды в консоли сервера.

Интерфейс пока аскетичный, но и задачи полностью заменить администратора пока нет: каждая команда требует анализа специалистом и подтверждения. В таком режиме от администратора не требуется знать хитрые ключи командной строки или нетривиальную последовательность действий — всё это за него уже может делать машина.

У нас один из сотрудников, занимающихся системным администрированием, в настоящий момент гоняет это решение на изолированной виртуалке. Не для рабочих задач, разумеется, а чтобы понять, куда ветер дует.

Скриншот терминала: монтирование /dev/vdb в ext3, точка /mnt/storage-846, запись в /etc/fstab. Справа пояснения и подсказки.

15 комментариев

Программирование на двух GPU

Два золотистых серверных модуля NVIDIA H100, установленных в серверную стойку Lenovo, с видимыми разъёмами и маркировкой на корпусе.
Две карты Nvidia H100, вынутые из нашего сервера

На этой неделе мы наконец получили NVLink, чтобы связать наши два видеоускорителя собственной шиной. Это нужно, чтобы запускать модели большего размера, занимающие обе карты: на шине общего назначения скорости не те, и модели еле ворочаются.

Развернуть и потрогать пока успели только две модели:

  1. deepseek-ai/DeepSeek-V4-Flash
  2. QuantTrio/MiniMax-M2.7-AWQ

Обе модели урезанные, разумеется, но даже так они еле умещаются на картах, параллельность никакая. Эти модели должны быть мощнее, чем те, которые удалось запустить на одной карте; по крайней мере, синтетика даёт ожидаемые результаты, но на практике не всё так однозначно.

Ребятам больше всех пока понравился «Квен-Кодер» из предыдущего эксперимента, хотя я уверен, что они ещё просто не распробовали новые модели.

Надо понимать, что серьёзным облачным моделям эти модели в подмётки не годятся: они мощнее примерно на порядок, и оборудование, которое позволяет их запустить, стоит совершенно других денег.

Для серьёзного программирования такие локальные модели непригодны, но в каких-то вещах их приспособить всё же удаётся. Сейчас мы заняты тем, что пытаемся очертить для себя круг задач, где они облегчают, а не усложняют жизнь. Поделиться мне пока ещё нечем, так как эксперименты в самом разгаре.

4 комментария

← 1 2 3 4 5 6 67 →