Programming
Perfect code
Manufacture and development of electronics
History of IT
CPU
Comments 69
+4
Спасибо за перевод и статью.
А что насчет проблемы хорошего кода, которая поднимается в статье?
Мне кажется, что сейчас мы утратили тот энтузиазм, с которым раньше писался код. Системы были жестко ограничены в ресурсах и каждый старался хитрить и искать хаки для того, чтобы как можно более богатый функционал уместить в максимально малый объём. Сейчас все иначе (
+13

Странно, почему смайл в конце грустный. Вы бы хотели поддерживать чужой проект, полный хаков и неочевидных оптимизаций кода?

+4
В данном случае грусть насчет того, что сейчас все несколько иначе. Я не знаю, возможно я слишком сентиментален, но такого рода разработки уносят меня в детство 90тых, первые клоны Spectrumа и мои начинания в освоении компьютерной техники.
+1
Я понимаю Вашу ностальгию, но мне всё же комфортнее работать на ноутбуке с 16 Гб памяти, чем с грустью продираться сквозь тормоза на моём первом ноутбуке с 4 Mb памяти и 386 процессором. Несмотря на намного лучшую оптимизацию старого кода — к которому, кстати, в отличие от современного, намного сложнее найти исходники, open source в то время был в куда более зайчаточном состоянии.
+12
но мне всё же комфортнее работать на ноутбуке с 16 Гб памяти, чем с грустью продираться сквозь тормоза

Меня, например, куда больше удручают тормоза ноутбука с 16 гб памяти в ряде приложений. Для машинок середины 1990-х это хотя бы имело какое-то обоснование…
+2
Мне кажется тогда вам будут интересны вот эти две книжки fabiensanglard.net/gebb/index.html Там достаточно подробно разбираются движки вульфенштейна и дума и то, с какими ограничениями пришлось столкнуться id при их разработке. На хабре, кстати, была пара переводов оттуда.
+1
Я это читал. История про магическую константу порадовала)
+1
Иначе не значит хуже. Разные акценты, подходы, методы, области при программировании делают эту сферу разнообразнее и это не значит, что тот кто не считает байты плохой программист, у него просто другая сфера ответственности и другие цели.
+1
Суть в том, что для того, чтобы писать код, который использует все нюансы и возможности процессора, нужно хорошо понимать как он работает.

При этом, если ресурсов хватает, не обязательно извращаться, но можно сразу писать довольно оптимальный код, грамотно и правильно использовать подходящие инструменты и типы данных без оверхеда.

Сейчас же критически мало кто озадачивается подобными вещами. Иначе бы не писали на электрон.
+6
Сейчас нет необходимости в хитрых хаках, так как железа как правило хватает с избытком, и можно переключиться на реализацию ГОРАЗДО более сложных вещей на высоком уровне вместо попыток экономии пары байт или пары инструкций в цикле на низком уровне. Но и такие задачи никуда не шли — остается разработка для встраиваемых систем с парой десятков килобайт RAM или ROM, и там приходится заниматься подобной оптимизацией, как и пишет автор статьи.
+9
Ага, с избытком. Так и получается очередной Skype, который тормозит на самом современном железе. Простой IM, тормозит, в 2019 году. На Android он феерично тормозит с момента появления в 2011 (если что, у меня сейчас Galaxy S9+, то есть флагман прошлого года), а на десктопе особо тормозящая версия 8 вышла пару лет назад. Ну да, железо становится каждый год мощнее. Может на каких 5%. Это не 20-30 лет назад, когда новый компьютер успевал устареть за год-два.

Необходимости в хаках как в статье, конечно, нет необходимости. Но и лозунг «проще докупить железа, чем оптимизировать» тоже уже перебор.
+2
На андроиде он стал тормозить чётко через две недели после покупки Майкрософтом.
0
Неправда. Я им пользуюсь с самых первых версий, запускал его на флагманах того времени (Galaxy S и Galaxy S2). Помню что очень ждал релиза первой версии, и помню своё разочарование, когда увидел её тормоза. Даже современный Telegram на древнем Galaxy S2 проворнее.
0

Я тоже пользовался на Galaxy Y. Прилетело обновление и всё стало тупить.

0
Однако скайп есть и он неплохо работает на всем зоопарке железа. Это один из моих основных рабочих инструментов, им я вполне доволен и каких-то критичных тормозов не замечал. У вас разве не вызывают уважения их алгоритмы подавления эха в конференции на 10 человек, все на разном железе в т.ч на смартфонах, при этом, как правило, обеспечивается вполне приличное качество связи? А прозрачная синхронизация, когда я имею доступ ко всей истории всех контактов с любого устройства — по мне так это крутая фишка.
В текщих условиях скорость выкатки новой версии и поддержка множества платформ важнее идеальной оптимизации под одну конкретную платформу.
+11
Он настолько «хорошо» работает на всём зоопарке железа, что самая востребованная функция — собственно обмен сообщениями — в нём работает хуже всех. Если закрывать глаза на тормоза, он иногда может банально не доставить сообщение. Да, они прикрутили хранение истории в облаке, но они хранят её всего за 2 года — это мало. В Telegram, например, я могу просматривать историю с самого момента как я начал им пользоваться, с 2015. Со всех устройств, и через Web-интерфейс.

Да, Skype всё ещё есть, но люди из него уходят. Я сам очень долго был его поклонником (сказывалось то, что Skype действительно впечатлил своими фишками в 2005-2010 годах), и с грустью наблюдал, что люди из него уходят, всё больше контактов становилось «вечно серыми». Чем-то напоминало агонию ICQ. Всё надеялся, что может вместе с новым более простым протоколом (что они сделали на замену старому P2P) у них получится сделать быстрый мобильный клиент. Но они сделали только хуже — новый тормозной клиент для десктопа, а мобильный клиент тормозит как и раньше.

Я также надеялся, что они сделают нормальный web-клиент. Но знаете что происходит, когда я из своего самого распоследнего Firefox захожу на web.skype.com? Оно большими буквами говорит «unsupported browser» и не даёт воспользоваться даже самыми базовыми функциями. Для таких разработчиков, которые тупо блокируют какие-то конкретные браузера, есть отдельный котёл в аду. Я им посылаю искренние лучи ненависти.

Тем временем, у меня всё общение плавно переехало в Telegram. Skype всё ещё запускаю раз в пару недель проверить, вдруг мне кто-то там что-то писал. А вообще держу его на случай необходимости позвонить на обычный телефон в другой стране. Наверное, главная его фишка. Но нужно это всё реже и реже — за этот год ещё ни разу не пользовался.
0
а как в телеграм обстоят дела с конференц-звонками? или с видео звонками?
0
А почему видеозвонки и конференц-звонки должны быть определяющей
функцией для мессенджера?

Да, у скайпа есть хорошие стороны именно в плане качества его звонков и конференций, а также интеграция skype-for-business с эксченджем еще залетает. Это и удерживает скайп еще на плаву.

Но свою главную функцию как современный и удобный мессенджер он уже потерял.
0
А почему видеозвонки и конференц-звонки должны быть определяющей
функцией для мессенджера?

Потому что любой пользователь мессенджера рано или поздно сталкивается с ситуацией, когда ему хотелось бы увидеть собеседника. А практически любой пользователь, который, извините за тавтологию, пользует мессенджер на работе, рано или поздно сталкивается с ситуацией, когда нужно поговорить втроем, вчетвером и т.д.
Функция отправки сообщений, она нифига не уникальна, ей обладает абсолютно любой мессенджер. И выбирают их как раз не по функции отправки сообщений, а по этим вот дополнительным фичам.
0
Пол беды скайп, он всегда этим славился. Наглядный пример современного подхода к программированию — это новый интерфейс Gmail. «Стабильный», «легкий» и «быстрый» как никогда. Вот уж кто точно принес с собой все круги ада.
+1
Сейчас просто доллар длинее. Народ выпадает из вышеупомянутой демосцены как раз в погоне за долларом.
0
Так вам ничего не мешает погрузиться в этот удивительный мир ограничений, особенно сейчас во времена IoT. Микроконтроллеры вам в руки и вперёд))
0
Помню, писал арифметику произвольной точности (мантисса находилась в массиве) на 386 Ассемблере. Славное было время.
+4
Cразу напомнило «историю одного байта». Тогда и вправду были другие времена…
+4
При этом, написанный Возняком Бейсик для Apple II не умел арифметику с плавающей точкой. Он так и назывался: Integer BASIC.
+4
Это из-за ограничения на размер памяти, всего 4 килобайта. Занятно, что чуть ранее Билл Гейтс и Пол Аллен написали свой Бейсик для Altair 8800. И у них была как раз версия для 4К без вещественной арифметики и версия побольше, для 8К, уже с нею и другими дополнительными функциями типа работы со строками и логическими переменными. Стоили они, кстати, аж $600 и $800 в современных долларах. Интересно ещё, что они написали его не имея собственно компьютера.
+3

Хотел спросить что вот это значит:


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

Но пока писал код понял, что это чтобы не перезаписывать абсолютные значения в M1 и M2.


var M1 = -1;
var M2 = -2;

// Он пишет одну процедуру, которая принимает абсолютное значение M1, 
// а потом меняет M1 и M2.
function F(x){
M1=M2
log(x);
}; 

F(abs(M1)); // 1
F(abs(M1)); // 2

Да уж, может и "гениально", но такой код я бы поддерживать не хотел.

+14
Судя по коду, там надо взять abs от обоих чисел (для умножения/деления), и делается так:
abs_both:
  call abs_m1
abs_m1:
  выполнили обеззначивание M1
swap_m1_m2:
  обменяли местами М1 и М2
  ret

После ret'а он пройдет процедуру обеззначивания (abs_m1) опять и следующим ret'ом уже вылетит наружу.
Рефлексивный ret, трюк как трюк ¯\_(ツ)_/¯ чудо для тех, кто ассемблер не щупал никогда.
+1
Вот да, сразу подумал что то ли автор, то ли переводчик не очень. CALL на следующую инструкцию это как бы норма для двукратного повторения (ну, была 30-40 лет назад).
0
Я иногда пишу на ассемблере под AVR (как хобби), если это маленький чип с маленьким объемом флеша, тоже использую такой способ для минимизации кода программы. А 25 лет назад такое постоянно попадалось в коде для Z-80 на спектруме.
+1
В каждом языке свои «трюки», как и в свое время в ассемблере. Читая чужой код, ты им учился, и потом не было трудностей с непониманием подобных конструкций.
+1
Ничего удивительного. Просто сейчас всем гораздо важнее оптимизация по скорости а не по размеру. Причем, обычно, чем компактней код, тем хуже производительность. Именно поэтому никто сейчас не занимается оптимизацией по размеру. А не по каким-то выдуманным причинам.
ps. То что этот код внезапно оказался эффективнее — не более чем совпадение. Думаю не составит труда написать и более быстрый код, если уж даже оптимизированная не по скорости а по размеру библиотека показала такой результат.
+1
раньше так же было. Когда не было пентиумов, приходилось писать декранчи.
-40
Смешно да, как восхваляют одного и напрочь не видят своих и даже презирают.
Я в 1989 писал подпрограммы для «действительных» чисел (т.е. для плавающей запятой), не зная о разработках Воза (но зная про самого Воза и даже побывал на выставке «информатизация в США» прошедшей в Магнитогорске, в том числе в закрытой части) для военных нужд в закрытом институте Челябинска для процессора 580ик80А (i8080A).
Но свои же вам неинтересны. )) Тут у вас на Хабре культ английских хозяев — ШША и Либералов… (местных инженеров презирают — так ведут себя оккупанты или предатели).
+7

Ты это писал в 1989, а Возняк в 1976 — почувствуйте разницу.
А в 2015 шведы написали операционную систему Contiki:
Многозадачное ядро
Вытесняющая многозадачность
Протопотоки (Protothreads)
TCP/IP компьютерная сеть
Оконную систему и GUI
Удалённый доступ к рабочему столу компьютера, используя Virtual Network Computing
Веб-браузер (возможно, самый маленький в мире)
Персональный веб-сервер
Простой telnet-клиент
Хранитель экрана
и всё это благолепие в 64 килобайтах памяти на 8 разрядных процессорах...

0
Ты это писал в 1989, а Возняк в 1976 — почувствуйте разницу.

А в чем разница, если он не знал про работу Возняка, т.е. не основывался на существовавших до того решениях/знаниях? Вопрос же не в том, кто первый, а кто второй, а в способности написать компактный код в принципе.
+2

В том, что с начала 80-х в СССР стали появляться радиолюбительские ПК на основе 8080 и подпрограмм для обработки вещественных чисел (не считая программ и ОС) была уже написана целая куча?

-2

Это с одной стороны, а с другой — стандартное перестроечное "не имеющее аналогов на Западе", под которое бодренько развалили индустрию.

0
была уже написана целая куча?

На здоровье, вы не о том.
Еще раз: в чем разница, если автор не знал про предшествующие работы?

Вопрос же не в том, кто первый, а кто второй, а в способности написать компактный код в принципе.


Человек же не по поводу «мы первые в мире, а я гений» высказался. Он подставил под сомнение правомерность называния человека гением по заданным критериям (способность написать такой-то компактный код).
Это можно перефразировать как «зачем Возняка назвали гением лишь потому что он написал компактный код, хорошо зная процессор, на котором работает — это может каждый, кто хорошо знает спецификацию ЦП, а в эпоху низкоуровневого программирования это, считай, каждый первый». Только с позиции ЯВУ и сегодняшнего дня, среднего сегодняшнего прикладника это «гениальные трюки», но не более.
Я не защищаю ту или иную позицию, просто отмечаю, что вы спорите о том, зеленый ли крокодил, или длинный.
+1

Мы, кстати, не знаем, насколько компактной или производительной была реализация автора ветки. Может быть она принципиально не отличалась от остальных библиотек для 8080. Одна из бед советского IT, как мне кажется, была в исключительно широком зоопарке несовместимого железа и ПО, отсюда все занимались велосипедостроительством, а не расширением возможностей существующих решений.

+3
Мы, кстати, не знаем, насколько компактной или производительной была реализация автора ветки

Зато мы можем примерно оценить размеры его ЧСВ. Оно явно в адресное пространство ВМ80А не помещается, даже если реализовать переключение страниц.
+5

А почему автор не знал про предшествующие работы — в 1989 про работы 1976 года? А потому, что не читал журнала Доктора Доббса за 1976 год.
И изобрёл велосипед, чем гордится и называет это "не имеет аналогов на Западе".


Небольшое лирическое отступление. Не так давно в интернетах был технический микрохайп на тему "коловратная машина инженера Тверского". Какой был гений Тверской, как его не понимали в XIX веке и всё такое… И я, в общем-то, проникся и заинтересовался.
И пошёл я на сайт archive.org (террористическая организация запрещённая роскомнадзором в нашей стране) и скачал английскую книжку XIX про паровые машины. А там… и такие машины, и сякие, и коловратные (кстати, Уатт изобрёл) и поршневые и всякие разные, и даже двигатель инженера Тверского присутствует, правда имя изобретателя другое и даты лет на 20 раньше.
Такие дела. Но у нас же всё "не имеет аналогов на Западе", даже велосипеды.

-2
Ты дурачок что-ли? )) Этот журнал в СССР не издавался.
Вот такие дурачки как-ты стонали в то время — «как плохо жить», а сейчас стонут опять — «как хорошо было в СССР» )) Этот журнал в России появился самое раннее в 1991 — ну так, чтобы в каждом киоске.

А спустя 30 лет можно конечно наврать, как ты (и тебе подобные обзорщики жизни в СССР, никогда там не жившие, копи-пастеры картинок из инета ))), что он появился и в 1985, ну конечно )) ха-ха, где-нить в Москве, в гостинице Метрополь или центральной Союзпечати. Но это не Россия, это цельно-нерезиновая.

И в таких журнальчиках печатали не программы на АСМе, а обзоры игр для дурчаков игроманов, то, что сейчас любой дурной ребёнок делает в ютубе. ))

В то время достать информацию по процессорам можно было либо через журнал, книгу (по блату в книжном магазе), либо BBS, либо официальное ТВ. В Челябинске было аж 2 канала ТВ.

Блата в книжном у меня не было (без меня разбирали книжки), а BBSок было штук 30, и только пара из них хоть боком про компьютерную технику, остальные для таких как ты — игроманов-дрочеров )), впоследствии ставших дурными программистами с Хабра.
+2
Человек, писавший в 80х на асме хорошие алгоритмы — по идее должен отличаться от орангутанга и заметить, что статья является переводом. поэтому никто из локальных авторов не «прославляет» зарубежных кодеров-энтузиастов. это делают «их местные» авторы. а вот почему «там» это происходит, а «тут» на труды отличных инженеров положили в лучшем случае клали болт — это вопрос к любимому союзу и существовавшей тогда системе.
отсутствие литературы или недоступность железа никак не являются оправданием, т.к. в статье просто освещается факт применения красивых «манёвров», для оптимизации кода, не более.
+1
А почему автор не знал про предшествующие работы — в 1989 про работы 1976 года? А потому, что не читал журнала Доктора Доббса за 1976 год.
И изобрёл велосипед, чем гордится и называет это «не имеет аналогов на Западе».

Да на здоровье, пусть он по факту переизобрел велосипед, будучи в информационном ваккууме и имеет супер-мега надутое ЧСВ. Не в этом вопрос, бог ему судья с такими заходами.

это может каждый, кто хорошо знает спецификацию ЦП, а в эпоху низкоуровневого программирования это, считай, каждый первый
+1
Только зачем она нужна, ну, кроме «посмотрите как я могу и как люблю свой комод»?

В 90е для ZX-Spectrum сочинялось много ОС, только приложений под них не было, т.к. даже текстовый редактор хотел всю ОЗУ и под ОС ничего не оставалось.
0
Ну вот кому-то нужна )

Contiki is used in numerous commercial and non-commercial systems, such as city sound monitoring, street lights, networked electrical power meters, industrial monitoring, radiation monitoring, construction site monitoring, alarm systems, remote house monitoring, and so on.

For more information, see the Contiki website: contiki-os.org
0

Класс. Ардуино конца 80х. Понравилась фраза, "листинг программы перепишите в ПЗУ." Радиолюбители того времени были очень терпеливыми.

+4
Ну или придумывали разные трюки. Могу рассказать про свой опыт «набивания» этих кодов из журнала в компьютер (у меня был Львов ПК01, тоже на 580 процессоре, телевизор в качестве монитора, магнитофон — внешний носитель). Так вот, при наборе этих кодов естественно возникали ошибки. Кстати, чтобы вы понимали, процесс набора из-за крайней простоты системной программы «Монитор», в которой это делалось, не очень напоминал работу в современном текстовом редакторе. Кажется можно было исправить последний введенный байт. Или нет :) Исправить что-то раньше — точно нет. Нужно оборвать ввод и начать его заново, введя адрес, который надо исправить. Ну и, само собой, в основном ошибки оставались незамеченными. Потом введенное вычитывал вдвоем с кем-то из родителей (мне лет 14-15 было) — вывел дамп на экран и один читает, второй пальцем по журналу ведет и сравнивает. Потом усовершенствование придумал. Записал своим голосом на магнитофон слова ноль, один, два, и т.д. и буквы A-F и тем же однобитным «АЦП» компьютера, которым читались данные с магнитофона, эти слова оцифровал, затем обрезал паузы и сохранил. Ну и написал небольшую программу, которая проходила по введенным из журнала данным и «читала» их, выводя обратно на магнитофонный выход эти оцифрованные звуки, тогда стало достаточно одного меня чтобы водить пальцем по журналу. Принтер был недостижимой мечтой, хоть какой-нибудь, а сделать самостоятельно прямизны рук не хватало.
+1
Ну и, само собой, в основном ошибки оставались незамеченными. Потом введенное вычитывал вдвоем с кем-то из родителей (мне лет 14-15 было) — вывел дамп на экран и один читает, второй пальцем по журналу ведет и сравнивает.

Потом просто стали печатать контрольную сумму поблочно.
+2
Да ладно ещё радиолюбители. У меня в инструкции к бытовому компьютеру тех времен были перлы вида «чтобы подключить принтер, спаяйте кабель согласно прилагаемой схеме» или «бинарный код драйвера джойстика распечатан на последней странице настоящего руководства».
+3
Я в 1989 писал подпрограммы для «действительных» чисел

для процессора 580ик80А (i8080A).

культ английских хозяев — ШША

Жека, у английских хозяев из ШША в 1989-м вышел 486-й процессор. Миллион транзисторов, кеш первого уровня на кристалле, встроенный FPU и т.д. Можно мы твои слегка припоздавшие заслуги благополучно забудем?
+1
он должен был выполнять операции с плавающей точкой

Зачем?!
0
А это хороший вопрос. В SPI флоаты вычислять — это что-то новое.
0
КМК — надо писать не хороший код, кстати — слово «хороший» весьма спорное, а писать надо — компиляторы.
Которые смогут скомпилировать твой код с нужными параметрами — минимальный размер или максимум производительности итд.
+2
Многое, воспринимающееся сейчас как гениальный хак, раньше было вполне типовым решением, передаваемым из уст в уста, и от которого с радостью отказывались, как только уходили вызвавшие его ограничения, потому что поддержка такого кода — сущий ад.

Например, на программируемых калькуляторах типа БЗ-34/МК-61, чтобы втиснуть программу в их 98/105 команд, типовым способом выжать ещё 1-2 команду было такое подгадывание адреса перехода, чтобы в другом контексте он воспринимался как код команды.
Only those users with full accounts are able to leave comments. , please.