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

в 9:01, , рубрики: 6502, Apple I, apple II, ВОЗ, персональные компьютеры, Программирование, Производство и разработка электроники, Процессоры, Совершенный код, Стив Возняк

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

Я нашёл отличного программиста по имени Стив Возняк - 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, написанном 30 лет спустя.

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

Автор: m1rko

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js