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

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

В качестве другого примера, алгоритмы должны принимать абсолютные значения M1 и M2. Вы могли бы написать
Воз так не повторяется. Он пишет одну процедуру, которая принимает абсолютное значение M1, а потом меняет M1 и M2. Затем вызывает эту процедуру дважды, поэтому тот же результат достигается с вдвое меньшим количеством кода. Более того, замена M1 и M2 необходима ещё и в другом месте, так что код выполняет двойную работу.
Конечно, такой интенсивный факторинг затрудняет отслеживание потока, но поразительно, насколько этот код опередил своё время. Читая другие статьи в номере 1976 года, можно найти массу не особенно хорошо написанного кода. Это понятно: люди просто выясняли, как воспользоваться преимуществами новых микропроцессоров. И посреди всего этот бриллиант, который вполне может достоин современного хакера с демосцены. Для сравнения, здесь такой же уровень тотальной изобретательности, как и в этом восхитительном коде для 6502, написанном 30 лет спустя.
Хватит истории. Почему я в 2019 году тщательно изучал этот древний код? Дело в том, что я работаю над новым компаньоном для I²CDriver и SPIDriver, а он должен был выполнять операции с плавающей точкой на 8-битном процессоре Silicon Labs EFM8 (на базе 8051), который я использовал в предыдущих проектах. Сейчас он легко выполняет эти вычисления, точно как и библиотека 6502. Я не нуждался в настолько маленьком и оптимизированном коде, но теперь он работает довольно быстро, немного быстрее, чем аналогичная библиотека Keil. Отличный код никогда не умирает!

Это набор арифметических процедур на действительных числах. Микропроцессор (6502, такой же, как в Apple I и II) мог работать только с байтами, то есть целыми числами между 0 и 255. Хуже того, он мог только складывать и вычитать их. Но с помощью этой библиотеки вы можете вычислить
Это довольно впечатляющий образец программирования. Прочитав его несколько раз, могу сказать, что он просто гениален. Например, циклы процедур умножения и деления срабатывают 23 раза, по одному разу для каждого бита в результате. Думаете, Воз тратит два байта, записывая константу 23 в обоих местах? Конечно, нет! Он загружает константу 23 в предварительную подпрограмму, которую используют оба цикла:

В качестве другого примера, алгоритмы должны принимать абсолютные значения 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. Отличный код никогда не умирает!