← Палеокомпьютинг · English

Оберон и машина RISC5

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

184строки — ядро процессора
4 953строки — ядро, файлы, компилятор, ОС, окна
1,2 МБвесит всё это в браузере
1986год системы, которая загрузится

Что это такое

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

Ядро процессора описано на 184 строках, вместе с умножителем, делителем и дробной арифметикой — на 538. Со всей обвязкой — видео, мышь, клавиатура, порты, SD-карта — 935. Система поверх него, вместе с собственным компилятором и оконным интерфейсом, — ещё 4 953. Около шести тысяч строк от вентиля до окна. Это читается за неделю.

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

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

Что можно попробовать прямо сейчас

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

  1. Система на настоящем железе

    Убедиться, что под этим окном действительно схема, а не имитация.

  2. Защиты памяти здесь нет

    Посмотреть, что бывает, когда её нет, — и почему систему это не убивает.

  3. Система пересобирает сама себя

    Запустить пересборку и дождаться, пока она соберёт собственный компилятор.

  4. Сколько тактов на инструкцию

    Померить и сверить с тем, что обещает схема.

  5. Куча кончается внутри команды

    Довести систему до нехватки памяти ровно посреди работы и увидеть, что будет.

  6. Неподвижная точка: два поколения

    Собрать компилятор компилятором, потом ещё раз — и сравнить результаты побайтово.

  7. Первый свой модуль

    Написать программу на Обероне, скомпилировать её внутри системы и запустить.

  8. Ключ интерфейса

    Сломать совместимость между модулями и посмотреть, как система это ловит.

  9. Внутри кодогенератора

    Залезть в то место компилятора, где команды процессора наконец появляются.

  10. Сборщик мусора изнутри

    Намусорить, посмотреть, как заполняется куча, и выяснить, почему сборщик работает только между командами.

  11. Одна задача за раз

    Написать фоновую задачу, заморить её голодом длинной командой, а потом заморозить ею всю систему.

  12. Цена проверки своими руками

    Переключиться на ядро с командой проверки границ и померить, во что проверка обходится в вашем собственном цикле, — аппаратная, программная и никакая.

  13. Своя встроенная процедура

    Научить компилятор новой встроенной функции, пересобрать компилятор прямо в работающей системе и собрать им модуль, который ею пользуется.

Методичка

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

Если хочется проверить нас самим

Всё, что мы утверждаем, воспроизводится одной командой. Нужен Verilator и компилятор C++:

git clone https://github.com/tym83/paleocomputing
cd paleocomputing/impl
make deps     # проверить окружение
make check    # около восьми минут

За эти восемь минут прогоняются тесты набора команд, загружается система, идёт пошаговая сверка с эталонной моделью на 14,6 млн инструкций, компилятор собирает сам себя, и система пересобирает себя целиком — 37 файлов побайтово.

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

Что здесь чьё

Взято готовым: ядро RISC5 и периферия — Никлаус Вирт, projectoberon.net; образ системы Project Oberon; компилятор с командной строки и эталонный эмулятор — pdewacht.

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

Чего эти числа не означают

Мы измерили, сколько стоит проверка границ массива: 2,2 % времени. Важно, чего это не значит.

  1. Это Оберон, а не «вообще». Цифра относится к этой машине и этой работе. Переносится метод и вывод о разбросе, а не сами числа.

  2. У этого процессора нет ни кэша, ни предсказателя переходов. Поэтому мы не гадали, а померили тот же цикл на других машинах. Проверка везде одна и та же — две команды, сравнение и переход, — а цена разная: на RISC5 это два такта из одиннадцати, на Apple M4 и AMD EPYC — ничего измеримого, устойчивые 2–6% на серверном ядре Arm Neoverse N2, которому в этом тесном цикле не хватает ширины; поставьте проверку на критический путь — и она стоит два такта везде, ровно как на RISC5. Современный компилятор обычно выбрасывает её совсем, если может доказать, что индекс в пределах; компилятор Вирта — никогда. На CHERI проверка живёт внутри самого чтения и не стоит ни одной команды. Вся лестница с телами циклов — находка 61 и находка 63.

  3. На живой плате не запускали. Но развели на настоящей ткани ПЛИС (Lattice ECP5): с задержками проводов ядро держит штатные 25 МГц с запасом, и команда проверки границ его не замедляет. Такты на команду — по-прежнему из модели схемы, а не с платы.

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