vak: (Default)
[personal profile] vak
Добыл новую прикольную книжку себе в компьютерную коллекцию. Это последнее издание 2014 года. Доступно только непосредственно с сайта Springer. На Амазоне его нет, там только первое издание от 1999-го.



MMIX это 64-битная компьютерная архитектура типа RISC, изобретённая лично Дональдом Кнутом для своих потребностей. То есть в качестве универсального абстрактного компьютера для разработки алгоритмов из эпохального труда "Искусство программирования". Изначально Кнут придумал машину MIX, но она была сделала в стиле 60-х и быстро устарела. MMIX же получилась неплохо, напоминает MIPS или DEC Alpha. Что и неудивительно, ведь Кнуту помогали Джон Хеннесси и Ричард Сайтс, их разработчики.

Идея MMIX в том, что компьютерные архитектуры не стоят на месте: быстро развиваются и сменяют друг друга. Но когда вы творите нетленку, к примеру реализацию классических алгоритмов для "Искусства программирования", желательно чтобы ваш код сохранял жизнеспособность хоть сколько-нибудь продолжительное время: лет 50 хотя бы. Поэтому делаем RISC-архитектуру один раз и навсегда. Изменения и расширения запрещены. Есть симулятор, даже два, есть ассемблер, этого вполне достаточно. Народ даже реализацию для FPGA сварганил. 

Хоть сама архитектура MMIX и не развивается (незачем), но софт к ней - вполне. Компилятор GCC поддерживает MMIX в полном объёме. Даже самая последняя версия GCC 12.2 собирается и генерит код для MMIX без нареканий. К примеру, вот компиляция стандартного "Hello World".
$ cat hello.c 
#include <stdio.h>
int main()
{
printf("Hello World\n");
}

$ mmix-gcc -O hello.c -o hello

$ mmix-size hello
text data bss dec hex filename
81464 4416 0 85880 14f78 hello

$ mmix hello
Hello World
Смотрим ассемблерный код:
$ mmix-gcc -O -S hello.c

$ cat hello.s
# 1 "hello.c"
! mmixal:= 8H LOC Data_Section
.text ! mmixal:= 9H LOC 8B
.section .rodata
.p2align 2
LOC @+(4-@)&3
LC:0 IS @
BYTE "Hello World",#0
.text ! mmixal:= 9H LOC 8B
.p2align 2
LOC @+(4-@)&3
.global main
main IS @
GET $0,rJ
GETA $2,LC:0
PUSHJ $1,puts
PUT rJ,$0
SETL $0,0
POP 1,0

.ident "GCC: (GNU) 12.2.0"
.data ! mmixal:= 8H LOC 9B
Бинарники компилятора MMIX GCC для Линукса и МакОС можно скачать по ссылкам: