Намерих отличен програмист на име Стив Возняк

.td_uid_42_5d27612135ddf_rand.td-a-rec-img{text-align:left}.td_uid_42_5d27612135ddf_rand.td-a-rec-img img{margin:0 auto 0 0}

Оригиналът на статията е на Джеймс Бауман (James Bowman)

Много много отдавна, когато компютрите бяха големи, а бизнесът скучен, се случи нещо съвсем неочаквано. Млади хакери намериха начин да сглобяват персонални компютри от евтини процесори за телетайп машини и светофари. Един от тях е Стив Возняк. Тези момчета възприеха ограниченията на своите компютри като предизвикателство. Те се постараха и накараха тези миниатюрни чипове да вършат удивителни неща. Ето какво публикува Dr Dobb’s Journal през месец август 1976 година:

Това е набор аритметични процедури за работа с реални числа. Микропроцесорът е 6502 (използва се в Apple I и II) и може да работи само с байтове – тоест с цели числа от диапазона между 0 и 255. И още, този процесор може само да ги събира и изважда. Но с помощта на тази библиотека може да се изчисли например 1,2627 – 1099,56 и дори корен квадратен от Пи. Удивителното е, че авторът на тази програма е програмистът с име Стив Возняк, успял да побере основните аритметични функции (събиране, изваждане, умножение и деление) само в 239 байта, използвайки едва 127 процесорни инструкции.

.td_uid_41_5d27612135a73_rand.td-a-rec-img{text-align:left}.td_uid_41_5d27612135a73_rand.td-a-rec-img img{margin:0 auto 0 0}

Това е един наистина впечатляващ пример по програмиране. След като го разгледах няколко пъти, мога да кажа, че той е гениален. Така например, циклите на подпрограмата за умножение и деление се повтарят 23 пъти – по един път за всеки бит от резултата. Мислите, че Воз е изразходвал два бита, за да записва константата 23 в двете места? Разбира се, че не! Той записва константата 23 в предварителна подпрограма, която се използва и в двата цикъла.

Да се спрем на друг пример. Необходимо е да се изчислят абсолютните стойности на числата М1 и М2. Бихте могли да напишете например:

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

Воз не допуска подобни излишни повторения. Той написва само една подпрограма, която получава абсолютното значение на М1, а след това разменя М1 и М2. После той извиква тази подпрограма втори път. По този начин той постига същия резултат, но с двойно по-малко код. Освен това, подмяната на М1 с М2 се използва в още много други места и този код върши много работа.

Разбира се, този интензивен факторинг затруднява четенето и разбирането на алгоритмите. Но е поразително, доколко този код е изпреварил времето си. Ако прочетем другите статии в списанията от 1976 година, ще видим маса неособено добре написан код. Това е разбираемо: по това време хората просто опитват всичко и си изясняват възможностите на микропроцесорите. И сред всичко това този брилянт, което е достоен на работата на съвременен хакер, написал графична демосцена. За сравнение, подобно ниво на тотална изобретателност започва да се среща едва след 30 години, като например в този възхитителен сорс код също за процесора 6502.

Стига толкова история. Защо през 2019 година съм се заел най-внимателно да изучавам този древен код? Причината е, че работя върху новия помощник за I?CDriver и SPIDriver, а той трябва да извършва операции с плаваща точка на 8-битовия процесор Silicon Labs EFM8 (базиран на 8051), който използвах в предишните си проекти. Сега той вече с лекота извършва тези изчисления, точно както тази библиотека за 6502. Аз нямах нужда от чак толкова кратък и оптимизиран код, но сега всичко работи бързо, много по-бързо от аналогичната библиотека Keil. Отличният код никога не умира!

Коментари
Все още няма коментари
Статистика
Прегледи 13
Коментари 0
Рейтинг
Добавена на11 Юли 2019
ИзточникKaldata

Тагове
imgmargin0, auto
Ние във фейсбук