История одного байта |
1 | Мне не хватало байта. Всего одного. Да-да. Того самого, что из восьми бит состоит. Что? Нет, я не псих, хотя одному богу известно, сколь тонкой была граница, отделявшая меня от этого состояния. Но все по порядку. Я программер. Но не просто программер. Я принадлежу к касте, которую иногда называют системщиками, иногда кристальщиками. Вы знаете, что это такое? Я объясню, если потерпите. Мне никак не обойтись без специфики, но иначе вы не сможете понять дальнейшее. Мы программируем чипы-однокристаллки, грубо говоря, это когда весь комп в одном кристалле. |
2 | Программная память и память данных разделены и не взаимодействуют между собой. Программа не может быть запущена в оперативке. Глубина программного стека ограничена. Максимум, на что я могу рассчитывать, – это восемь уровней вложения, причем я не могу изменять предельную глубину стека. О, вы не подумайте чего! У меня бездна ресурсов. Оперативки аж 128 байт! Это на все про все. Переменные там, то да се.... |
3 | Представили, да? С программной памятью тоже неплохо. Аж восемь килобайт. И пользоваться ей совсем несложно. Сначала нужно программно врубить нужный банк памяти, запустить в нем нужную процедуру, а по выходе из нее не забыть вернуться, где был. Да еще надо иметь в виду, что в пределах банка я могу перемещаться только джампами и вызовами процедур, а переходы по условиям возможны только в пределах одной страницы, т.е. 256 байт. |
4 | Это значит, если я сравниваю два байта и надо ветвиться, но метка не находится в пределах 256 байт, то это письмо на деревню дедушке, причем компилятор только в половине случаев предупредит, мол, широко шагаешь, парень, штаны бы поберег. И это только цветочки! Ягодки я вам сейчас выложу, чтоб вы ими в полной мере могли насладиться. У меня нет команды вычитания. Вообще! Только add. Уж про такую роскошь, как умножение или деление я вообще молчу, это для лентяев. |
5 | Зато мне нужно обеспечить десятичную математику. Вы проникаетесь потихоньку? Коды таких игрушек вылизываются так, что вам и не снилось, особенно если приходится решать задачи на пределе оперативной и программной памяти. Исходники переписываются далеко не один раз. Мне мало просто решить задачу. Я должен впихнуть ее в этот чертов кристалл! Ограничение по переменным, по размеру кода в целом, по размеру каждой процедуры и по числу вызовов. |
6 | Малейший недосмотр и... стек продавлен, и тебя вышвыривает черт знает куда. И компилятор не поможет. Такое он не ловит... Вы думаете, это все?))) Нееет, дорогие мои. Моя игрушка работает в реалтайме... Это когда напротив каждой крохотной процедурки моего кода нужно подсчитать и проставить время ее исполнения в миллисекундах. Мои модули не должны работать более жестко фиксированного времени, потому что мне надо еще сканировать киборду и дисплей, поспевать за датчиками и выдавать управляющие сигналы, а все остальное должно работать, никак не мешая сканнингу, иначе я прозеваю нажатие кнопки, или дисплей станет неприятно мерцать, меняя яркость. |
7 | Но и это еще не все! У меня есть интерфейс. Обычный писишный RS232C, так называемый компорт. Но если вы думаете, что это отдельный чип, мол, сунул ему байт, принял из буфера байт, то вы заблуждаетесь. Себестоимость. Я все это делаю ручками, телепая единственный бит порта. Ручками кручу диаграмму стартов, стопов и данных. Итак: если я накатал код, решающий задание, но он не влезает в память – задача не решена. |
8 | Если при этом я создал большее число переменных, и они не помещаются в оперативку – задача не решена. Если все оки-доки, но процедуры слишком длинны, разрушается диаграмма реалтайма – задача не решена. Если процедуры слишком коротки, их много, исчерпывается стек – задача не решена. Любой средней руки программер, поставь его в подобные условия, застрелится на второй день. Вообще, по моему убеждению, парни, работающие в этой области, имеют стальные нервы и неукротимую волю к победе. |
9 | Мы редко общаемся с обычными программерами – нам, в общем, не о чем разговаривать... И не потому, что мы снобы или гордецы. Совсем не обязательно. Нам трудно представить себе программирование под неисчерпаемыми ресурсами на языках высокого уровня. Мало винта? – Купи другой, в чем проблема? Мало RAM-ы? – Купи еще, толкни в слот. Меги кодов? – А я причем? Это компилятор виноват. Купите машину побольше. Это как разные планеты, и я надеюсь, вы поняли почему. |
10 | Это как красивый белый круизный лайнер в бескрайних океанских просторах, плыви куда хочешь. А вы попробуйте на нем в финских шхерах порулить))). Или вдевать нитку в иголку среди ночи. Причем черную нитку. Конечно, мы тоже имеем наборы кристаллов и выбираем их перед разработкой с большей дотошностью, чем жених невесту, и гадаем на кофейной гуще и прочих подручных средствах, а хватит ли? Но если выбор сделан... Назад ходу, как правило, нет. |
… |
Комментарии
Однажды растаман, да и вообще супер-мега гуру, который любит "полетать" программируя, впервые узнал о стэке и использовал его. Естественно, не заладилось и его основательно торкнуло:
Пошел искать поддержки у друга. Оказалось, тот уже "собрал всех кого мог" и вместе покурив "три дня" над кодом, постановили: ничего не понятно, но красиво:
После чего растаман-гуру рассказал о проблеме бабушке. Бабушка не курила, была в здравом уме и твердой памяти, и быстро все разъяснила. Но под дурманом все сразу не зашло:
После угощения чаем дурман сошел и стало понятно, как все сделать не через задницу.
И вывод: все благодаря любви.
Краткое содержание:
0. Обманчивое начало.
1. "Все твои кодЫ идеальны, правда я не могу ничего понять, но там нет ни одной ошибки!!!)))".
2. Бессмысленная наркомания с бабкой.
5 отрывок. «Особенно если приходиться решать задачи…» - ААУАУААУАУААУЭУУААА, серьезно? «ться» вместо «тся» - ошибка на уровне звОнит.
6 отрывок. «Вы думаете это все?» - та же самая ошибка, что и в четвертом отрывке. После «думаете» пропущена запятая.
Тот же 6 отрывок. «Это когда, напротив каждой крохотной процедурки моего кода нужно подcчитать и проставить время ее исполнения в миллисекундах». – Тут практически точно такая же ошибка, но только на этот раз уже лишняя запятая после слова «когда».
Конец 6 отрывка. «…иначе я прозеваю нажатие кнопки или дисплей станет неприятно мерцать, меняя яркость.» - опять то же самое. Потерялась запятая после «Нажатие кнопки».
Нет, все, хватит. Не могу больше печатать это.
"Глубина програмного стека ограничена." - програММного. Тут это слово почему-то с одной М