Язык высокого уровня для «МК-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 комментария

Людно во Вьетнаме

Мы во Вьетнаме в третий раз. Тут всегда было людно, но сейчас особенно. Гиды говорят, что из-за событий в Эмиратах сюда хлынул весь поток туристов, который не поехал туда. Говорят, Вьетнам к такому наплыву оказался не готов.

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

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

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

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

Записались на пару экскурсий. Тут всё самое интересное далеко, так что выбрали то, что поближе: обезьяны, аквапарк, аттракционы, плавание в маске — достаточно традиционно. Ну и конечно, несмотря на дождь, всё же тут тепло, беззаботно, рядом море, бассейны и очень вкусно кормят.

Надеюсь прийти в норму.

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