- PVSM.RU - https://www.pvsm.ru -

Я нашёл отличного программиста по имени Стив Возняк

Давным-давно, когда компьютеры были большими, а бизнес скучным, произошло нечто неожиданное. Молодые хакеры нашли способ собрать персональные компьютеры на дешёвых микропроцессорах от телетайпов и светофоров. Одним из них был Стив Возняк. Эти ребята восприняли ограничения своих компьютеров как вызов, сели и заставили эти крошечные чипы делать удивительные вещи. Вот что публиковал Dr Dobb's Journal в августе 1976 года [1]:

Я нашёл отличного программиста по имени Стив Возняк - 1 [1]

Это набор арифметических процедур на действительных числах. Микропроцессор (6502, такой же, как в Apple I и II) мог работать только с байтами, то есть целыми числами между 0 и 255. Хуже того, он мог только складывать и вычитать их. Но с помощью этой библиотеки вы можете вычислить $1.2627-1099.56$, или даже взять квадратный корень из пи. Удивительно, но автор программы по имени Стив Возняк уместил основные функции (сложение, вычитание, умножение и деление) в 239 байт, используя всего 127 инструкций.

Это довольно впечатляющий образец программирования. Прочитав его несколько раз, могу сказать, что он просто гениален. Например, циклы процедур умножения и деления срабатывают 23 раза, по одному разу для каждого бита в результате. Думаете, Воз тратит два байта, записывая константу 23 в обоих местах? Конечно, нет! Он загружает константу 23 в предварительную подпрограмму, которую разделяют оба цикла:

Я нашёл отличного программиста по имени Стив Возняк - 3

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

​M1 = abs(M1);
M2 = abs(M2);

Воз так не повторяется. Он пишет одну процедуру, которая принимает абсолютное значение M1, а потом меняет M1 и M2. Затем вызывает эту процедуру дважды, поэтому тот же результат достигается с вдвое меньшим количеством кода. Более того, замена M1 и M2 необходима ещё и в другом месте, так что код выполняет двойную работу.

Конечно, такой интенсивный факторинг затрудняет отслеживание потока, но поразительно, насколько этот код опередил своё время. Читая другие статьи в номере 1976 года, можно найти массу не особенно хорошо написанного кода. Это понятно: люди просто выясняли, как воспользоваться преимуществами новых микропроцессоров. И посреди всего этот бриллиант, который вполне может достоин работы современного хакера с демосцены. Для сравнения, здесь такой же уровень тотальной изобретательности, как и в этом восхитительном коде для 6502 [2], написанном 30 лет спустя.

Хватит истории. Почему я в 2019 году тщательно изучал этот древний код? Дело в том, что я работаю над новым компаньоном для I²CDriver [3] и SPIDriver [4], а он должен был выполнять операции с плавающей точкой на 8-битном процессоре Silicon Labs EFM8 (на базе 8051), который я использовал в предыдущих проектах. Сейчас он легко выполняет эти вычисления, точно как и библиотека 6502. Я не нуждался в настолько маленьком и оптимизированном коде, но теперь он работает довольно быстро, немного быстрее, чем аналогичная библиотека Keil [5]. Отличный код никогда не умирает!

Автор: m1rko

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/323566

Ссылки в тексте:

[1] в августе 1976 года: https://archive.org/details/dr_dobbs_journal_vol_01/page/n207

[2] восхитительном коде для 6502: https://github.com/pfusik/zlib6502

[3] I²CDriver: https://i2cdriver.com/

[4] SPIDriver: https://spidriver.com/

[5] аналогичная библиотека Keil: http://www.smxrtos.com/ussw/gofast/gofast_8051.htm

[6] Источник: https://habr.com/ru/post/459584/?utm_source=habrahabr&utm_medium=rss&utm_campaign=459584