Это четыре режима одного проекта. Ваши программы, заметки, начальные ленты, остановки и таблица глифов сохраняются вместе. Старые версии книги и лабораторий остаются отдельными выпусками.
Маршрут
- Chip Machine: состояние, программа, цикл, повторение и сохранение.
- Glyph Machine: код, строка, собственное начертание, перенос таблицы.
- Распознаватель: обнаружение и классификация символов по кодам.
- Калькулятор: текст выражения → числовые данные → алгоритм → коды цифр → глифы.
Один исполнитель
Ячейка DATA содержит один бит. Белая сторона — 0, чёрная — 1. Указатель данных выбирает одну фишку; указатель программы выбирает одну команду. Команды:
| Код | Имя | Действие |
|---|
| 000 | NOP | Перейти к следующей команде. |
| 001 | RIGHT | На один бит вправо. |
| 010 | LEFT | На один бит влево. |
| 011 | FLIP | Перевернуть текущую фишку. |
| 100 | LOOP_BEGIN / [ | При 0 перейти за конец цикла, при 1 войти в тело. |
| 101 | LOOP_END / ] | Вернуться к проверке начала цикла. Проверка — отдельный шаг. |
Окончание программы завершает исполнение. Выход за границу памяти останавливает его без изменения ленты. Коды 110 и 111 не используются. READ, WRITE, увеличение, уменьшение, сложение и вычитание не являются командами этой машины. Это наш битовый учебный язык; он отличается от обычного байтового Brainfuck.
Механическая сцена первой лаборатории
Голубая головка PROGRAM считывает три фишки одной команды. Три индикатора показывают момент считывания; правило записано в центральном блоке. Рабочая головка DATA выбирает другую ленту: RIGHT и LEFT передвигают её, FLIP переворачивает фишку. Положение головок независимо. Три бита здесь выбирают фиксированное правило; это учебная модель исполнителя, а не реконструкция физического компьютера.
Один шаг показан четырьмя фазами: чтение → правило → действие → следующая команда. Счётчик исполнения увеличивается один раз, в момент действия. Сохранение и сброс во время анимации ждут окончания текущего шага; «Пауза» завершает его и останавливается перед следующим.
Зелёная дуга соединяет парные LOOP_BEGIN и LOOP_END. Начало проверяет бит под текущей головкой DATA: при 0 головка PROGRAM переходит за парный конец, при 1 входит в тело. Конец всегда возвращает PROGRAM к началу для новой проверки. Сам переход не двигает DATA. Метка не включает скрытый режим и не хранит прежнее значение бита; программа внутри цикла могла передвинуть DATA, и новая проверка увидит уже другую фишку.
В опытах под сценой есть переворот, движение, цикл с начальным 0 и 1, сумматор двух битов. Детальную анимацию видно при 1–4 шагах/с и по кнопке «Шаг». Быстрый режим выполняет ту же программу без показа каждого движения. При системной настройке уменьшения движения перевороты не анимируются. Полный редактор открывается кнопкой «Изменить программу».
Работа с программой и данными
Начните с прогноза. «Шаг» исполняет одну команду. «Запуск» выполняет их последовательно; «Пауза» позволяет продолжить позже. «Сначала» возвращает начальные данные, сохраняя программу и рисунки.
В редакторе можно писать имена команд, скобки [ ] или тройки битов; комментарий начинается с #. «Применить» начинает новый прогон. Неприменённый текст сохраняется в файле как черновик и сам не исполняется.
Щелчки по DATA готовят черновик начальной ленты. Пока он не применён, SCREEN показывает текущее исполнение. «Применить начальную ленту» запускает новый опыт с изменёнными начальными условиями. При ручном изменении размера памяти карта и адреса учебного образца снимаются: проверьте программу самостоятельно.
Как устроен SCREEN
DATA читается группами по 16 бит, старший бит слева. Внутри этих учебных групп показаны кодовые единицы UTF-16. Это логический порядок битов; файл UTF-16LE/BE здесь не создаётся. Большинство выбранных для начала букв занимает одну единицу; символы за пределами BMP — две. Корректная суррогатная пара выбирает один глиф. Для неизвестного символа показана диагностическая рамка; одиночный суррогат помечается как незавершённая пара.
Код выбирает рисунок, но не содержит его пиксели. Один глиф — 8 столбцов × 16 строк, то есть 128 фишек. Редактор меняет рисунок; он не меняет код символа. Изменение A обновит все A на экране. Черновики разных глифов сохраняются при переключении и в файле проекта. Для обновления SCREEN нажмите «Применить рисунок».
В комплекте — латиница, цифры, знаки и учебная кириллица. Строчная кириллица использует уменьшенные начертания; это учебная таблица, не полный шрифт Unicode. Можно добавить любой скалярный символ Unicode, включая знак из частной области U+E000. Справка Unicode о UTF-16.
Сохранение — часть опыта
- Рецепт сохраняет все этапы, программы, начальные данные, заметки, таблицу и черновики. Исполнение каждого этапа начинается сначала.
- Остановка дополнительно хранит текущее состояние каждой машины и её указатели. После открытия можно продолжить. Файлы остановок проверяются воспроизведением перед импортом.
- Таблица переносит применённые глифы отдельно. Для переноса неприменённых рисунков используйте полный проект.
- Изображение SVG сохраняет вид SCREEN. Оно не содержит исполняемую программу.
Локальная копия восстанавливает работу в этом браузере. Очистка данных браузера, другой адрес сайта или другое устройство могут сделать её недоступной. Для переноса скачайте файл. «Сохранить этап и перейти дальше» скачивает остановку и открывает следующий режим с той же таблицей. Навигация сохраняет предыдущие опыты внутри проекта. Загрузка учебной заготовки заменяет текущий опыт этого режима — сначала сохраните свою версию.
Проекты выпуска 2.0 открываются и продолжаются в 2.1: формат, программы и правила исполнения сохранены. Проекты формата 0.1 и 1.0 открываются в прежнем выпуске машины. Этот пакет их не переинтерпретирует. Названия, коды и правила шести общих команд сохранены.
Распознавание и калькулятор
Образцы разворачиваются в обычные команды. Карта программы только подписывает блоки; она не является дополнительным исполнительным языком. Сначала можно изучить образец, затем изменить его. После ручной правки карта снимается, чтобы не показывать неверные границы.
Распознаватель обрабатывает до 16 кодовых единиц. Он различает латинские и русские буквы (включая Ё/ё), цифры 0–9, знаки +/− (в записи используется ASCII -) и завершающий =. Остальные коды дают нулевые флаги. Это правила нашего языка, а не автоматическая семантика Unicode. Суррогатные единицы в распознавателе относятся к «другим»; SCREEN умеет показывать их парой.
Калькулятор принимает ровно четыре знака: одна цифра, + или -, одна цифра, =. Допустимые операнды 0–9, результаты от -9 до 18. Он проверяет запись, извлекает числа, выполняет сложение либо вычитание, преобразует результат в коды цифр. Все эти действия выполняет битовая программа. Неверная запись даёт ?? и флаг ошибки. Увеличение и уменьшение — развёрнутые последовательности FLIP и циклов, а не встроенная арифметика исполнителя.
В общем проекте сохраняются все ваши версии программ. Калькулятор использует предоставленный проверенный образец распознавания; отредактированный студентом распознаватель не подставляется в него автоматически. Для исследования переносите и изменяйте фрагменты явно.
Пределы и проверка
До 4096 бит памяти, 1 000 000 команд, 20 000 000 успешных шагов на запуск, 64 кодовых единицы SCREEN, 2048 глифов в таблице. Предел файла проекта — 64 МБ. Журнал содержит лишь последние 48 переходов и не раздувает остановку. При достижении предела шагов нужно изменить программу или начать сначала.
Кнопка «Проверить опыт» проверяет наблюдаемый результат. Объяснение и авторство программы оценивает преподаватель. Готовый образец всегда обозначен как учебный.
Сложение двух битов: 16 команд
Это первый маленький сумматор: A и B принимают только 0 или 1. Начальная лента — [0, A, B, 0, 0], головка DATA стоит на первой фишке D0; оставшиеся фишки учебной ленты нулевые. После остановки первые две фишки дают сумму: D0 — старший разряд, D1 — младший. Команды ADD нет.
RIGHT
RIGHT
LOOP_BEGIN
FLIP
LEFT
LOOP_BEGIN
FLIP
LEFT
FLIP
RIGHT
RIGHT
LOOP_END
FLIP
RIGHT
RIGHT
LOOP_END| A | B | Первые две фишки | Число | Шагов | DATA в конце |
|---|
| 0 | 0 | 00 | 0 | 3 | D2 |
| 0 | 1 | 01 | 1 | 11 | D3 |
| 1 | 0 | 01 | 1 | 3 | D2 |
| 1 | 1 | 10 | 2 | 18 | D4 |
Два RIGHT приводят к B. Если B = 0, внешний цикл пропускается: первые фишки уже содержат 0A. Если B = 1, первый FLIP сбрасывает B и LEFT возвращается к A. При A = 0 внутреннее тело пропускается и следующий FLIP превращает A в 1. При A = 1 внутреннее тело сбрасывает A, ставит 1 в старший разряд и возвращается к уже нулевой фишке B. Проверка внутреннего цикла видит этот ноль и завершает тело. Затем головка уходит на нулевую служебную фишку, где завершается внешний цикл.
Нулевые фишки D3 и D4 нужны для завершения разных ветвей. Головка в конце находится в разных местах; исходные операнды могут измениться. Читать результат нужно именно из D0 и D1, а не трактовать всю ленту как одно число. Здесь хорошо видно, зачем большой программе договорённости об адресах и положении головки.
Скачать открываемый опыт 1 + 1. Либо в Chip Machine откройте «Опыты с машиной», выберите «Сложение двух битов», задайте A и B и нажмите «Подготовить опыт». Затем используйте «Шаг» или «Запуск». Это дополнительный разбор перед калькулятором, а не замена его программы для многобитных чисел.
Маленькие алгоритмы перед калькулятором
Сначала разберите перенос на числе 7. На 16-битной ленте запишите 0000 0000 0000 0111 и передвиньте указатель на крайний правый бит пятнадцатью RIGHT. Затем исполните:
LOOP_BEGIN
FLIP
LEFT
LOOP_END
FLIP
Пока встречается 1, она превращается в 0 и указатель идёт влево. Первый 0 превращается в 1: получается 8. При всех шестнадцати единицах потребовался бы дополнительный разряд: данный пример явно остановится на границе.
Для уменьшения 8 до 7 снова начните с крайнего правого бита:
FLIP
LOOP_BEGIN
LEFT
FLIP
LOOP_END
Нули превращаются в единицы, затем первая единица — в ноль. Указатель в конце этих алгоритмов зависит от данных. В полной программе нужны дополнительные действия, чтобы восстановить известное положение и сохранить рабочие флаги; поэтому её запись существенно длиннее.
Открываемый пример переноса 7 → 8 · Пример заимствования 8 → 7
Стартовые проекты
Скачайте файл и откройте его кнопкой «Открыть проект». Это предоставленные учебные образцы.
Без подключения к сети
Вычисления, рисунки и сохранения выполняются в браузере. Серверная часть, учётная запись и внешние библиотеки не нужны. Для локального запуска используйте комплектный launch.py или обычный статический сервер. При публикации перенесите всю папку site_package в отдельный каталог сайта, сохранив внутренние пути.
Вернуться в лаборатории →