Целый компьютер — от логического вентиля до окна на экране — который помещается в одну голову. Здесь он загружается прямо в браузере, на настоящем описании схемы, написанном Никлаусом Виртом.
В 1980-х Никлаус Вирт сделал вещь, которую с тех пор никто не повторил: не язык, не операционную систему и не процессор по отдельности, а всё сразу — и так, чтобы одному человеку было видно целиком.
Ядро процессора описано на 184 строках, вместе с умножителем, делителем и дробной арифметикой — на 538. Со всей обвязкой — видео, мышь, клавиатура, порты, SD-карта — 935. Система поверх него, вместе с собственным компилятором и оконным интерфейсом, — ещё 4 953. Около шести тысяч строк от вентиля до окна. Это читается за неделю.
В современной операционной системе десятки миллионов строк, и целиком её не держит в голове никто — ни один человек в мире не отвечает за всю цепочку. Оберон — редкое место, где можно проверить утверждение о компьютерах насквозь, не упираясь ни в одно «здесь работает магия».
Ставить не нужно ничего: лаборатория открывается в браузере, каждое задание проверяется само.
Убедиться, что под этим окном действительно схема, а не имитация.
Посмотреть, что бывает, когда её нет, — и почему систему это не убивает.
Запустить пересборку и дождаться, пока она соберёт собственный компилятор.
Померить и сверить с тем, что обещает схема.
Довести систему до нехватки памяти ровно посреди работы и увидеть, что будет.
Собрать компилятор компилятором, потом ещё раз — и сравнить результаты побайтово.
Написать программу на Обероне, скомпилировать её внутри системы и запустить.
Сломать совместимость между модулями и посмотреть, как система это ловит.
Залезть в то место компилятора, где команды процессора наконец появляются.
Намусорить, посмотреть, как заполняется куча, и выяснить, почему сборщик работает только между командами.
Написать фоновую задачу, заморить её голодом длинной командой, а потом заморозить ею всю систему.
Переключиться на ядро с командой проверки границ и померить, во что проверка обходится в вашем собственном цикле, — аппаратная, программная и никакая.
Научить компилятор новой встроенной функции, пересобрать компилятор прямо в работающей системе и собрать им модуль, который ею пользуется.
Восемь глав — от «зачем это» до «что мы измерили». Лабораторные ссылаются на них по ходу дела, но читать можно и отдельно.
Всё, что мы утверждаем, воспроизводится одной командой. Нужен 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 % времени. Важно, чего это не значит.
Это Оберон, а не «вообще». Цифра относится к этой машине и этой работе. Переносится метод и вывод о разбросе, а не сами числа.
У этого процессора нет ни кэша, ни предсказателя переходов. Поэтому мы не гадали, а померили тот же цикл на других машинах. Проверка везде одна и та же — две команды, сравнение и переход, — а цена разная: на RISC5 это два такта из одиннадцати, на Apple M4 и AMD EPYC — ничего измеримого, устойчивые 2–6% на серверном ядре Arm Neoverse N2, которому в этом тесном цикле не хватает ширины; поставьте проверку на критический путь — и она стоит два такта везде, ровно как на RISC5. Современный компилятор обычно выбрасывает её совсем, если может доказать, что индекс в пределах; компилятор Вирта — никогда. На CHERI проверка живёт внутри самого чтения и не стоит ни одной команды. Вся лестница с телами циклов — находка 61 и находка 63.
На живой плате не запускали. Но развели на настоящей ткани ПЛИС (Lattice ECP5): с задержками проводов ядро держит штатные 25 МГц с запасом, и команда проверки границ его не замедляет. Такты на команду — по-прежнему из модели схемы, а не с платы.
Это не разоблачение Вирта. Расхождения, которые мы нашли, — в поставке и вспомогательных инструментах, и часть объясняется историей версий.