"История одного байта" (1)
- 21.02.08, 17:58
Мне не хватало байта. Всего одного. Да, да. Того самого, что из восьми бит состоит. Что? Hет, я не псих, хотя одному богу известно, сколь тонкой была граница отделявшая меня от этого состояния. Hо все по порядку.
Я программер. Hо не просто программер. Я принадлежу к касте, которую иногда называют системщиками, иногда кристальщиками. Вы знаете, что это такое? Я обьясню, если потерпите. Мне никак не обойтись без специфики, но иначе вы не сможете понять дальнейшее.
Мы программируем чипы однокристаллки, грубо говоря, это когда весь комп в одном кристалле. Програмная память и память данных разделены и не взаимодействуют между собой. Программа не может быть запущена в оперативке. Глубина програмного стека ограничена. Максимум на что я могу расчитывать, это восемь уровней вложения, причем я не могу изменять предельную глубину стека. О, вы не подумайте чего! У меня бездна ресурсов. Оперативки аж 128 байт! Это на все про все. Переменные, там то да се.. Представили, да? С програмной памятью тоже неплохо. Аж восемь килобайт. И пользоваться ей совсем несложно. Сначала нужно программно врубить нужный банк памяти, запустить в нем нужную процедуру, а по выходе из нее не забыть вернуться где был. Да еще надо иметь в виду, что в пределах банка я могу пермещаться только джампами и вызовами процедур, а переходы по условиям возможны только в пределах одной страницы, т.е. 256 байт. Это значит, если я сравниваю два байта и надо ветвиться, но если метка не находится в пределах 256 байт, то это письмо на деревню дедушке,
причем компилятор только в половине случаев предупредит, мол широко шагаешь парень, штаны бы поберег. И это только цветочки! Ягодки я вам счас выложу, чтоб вы ими в полной мере могли насладиться.
У меня нет команды вычитания. Вообще! только add. Уж про такую роскошь, как умножение или деление я вообще молчу, это для лентяев. Зато мне нужно обеспечить десятичную математику. Вы проникаетесь потихоньку? Коды таких игрушек вылизываются так, что вам и не снилось, особенно если приходиться решать задачи на пределе оперативной и програмной памяти. Исходники переписываются далеко не один раз. Мне мало просто решить задачу. Я должен впихнуть ее в этот чертов кристалл! Ограничение по переменным, по размеру кода в целом, по размеру каждой процедуры и по числу вызовов. Малейший недосмотр и.. стек продавлен, и тебя вышвыривает черт знает куда. И компилятор не поможет. Такое он не ловит.. Вы думаете это все? ;-) H-е-ет, дорогие мои. Моя игрушка
работает в реалтайме.. Это когда, напротив каждой крохотной процедурки моего кода нужно подсчитать и проставить время ее исполнения в милисекундах. Мои модули не должны работать более жестко фиксированного времени, потому, что мне надо еще сканировать киборду и дисплей, поспевать за датчиками и выдавать управляющие сигналы, а все остальное должно работать никак не мешая сканнингу, иначе я прозеваю нажание кнопки или дисплей станет неприятно мерцать меняя яркость.
Hо и это еще не все! У меня есть интерфейс. Обычный писишный RS232C, так называемый компорт. Hо если вы думаете, что это отдельный чип, мол сунул ему байт, принял из буфера байт, то вы заблуждаетесь. Себестоимость. Я все это делаю ручками, телипая единственный бит порта. Ручками кручу диаграмму стартов,стопов и данных.
Итак: если я накатал код решающий задание, но он не влезает в память - задача нерешена.
Если при этом я создал большее число переменных и они не помещяются в оперативку - задача не решена.Если все оки-доки, но процедуры слишком длинны, разрушается диаграмма реалтайма - задача не решена.Если процедур слишком коротки, их много, исчерпывается стек - задача не решена.
Любой средней руки программер, поставь его в подобные условия, застрелится на второй день. Вообще, по моему убеждению, парни работающие в этой области имеют стальные нервы и неукротимую волю к победе.Мы редко общаемся с обычными программерами - нам в общем не чем разговаривать.
И не потому, что мы снобы или гордецы. Совсем необязательно. Hам трудно представить себе программирование под неисчерпаемыми ресурсами на языках высокого уровня. Мало винта? Купи другой, в чем проблема? Мало рамы? Купи еще, торкни в слот. Меги кодов? А я причем? Это компилятор виноват. Купите машину побольше. Это как разные планеты и я надеюсь, вы поняли почему. Это как красивый белый океанский круизер в бескрайних океанских просторах, плыви куда хочешь. А вы попробуйте на нем в финских шхерах порулить. ;-) Или вдевать нитку в иголку среди ночи. Причем, _черную_ нитку.
Конечно мы тоже имеем наборы кристаллов и выбираем их перед разработкой с большей дотошностью, чем жених невесту и гадаем на кофейной гуще и прочих подручных средствах, а хватит ли? Hо если выбор сделан.. Hазад ходу, как правило нет.
Hу что ж. Я ввел вас в предметную область и могу продолжить свой рассказ.
Кристалл не понравился мне сразу. Я сразу понял - тесноват. Все на пределе. Законных 20% запаса по ресурсу, на возможные ошибки - не соблюсти. Однако остальные кандидаты были сильно избыточны и потому дороги и нерациональны. Себестоимость решила все, я наконец выдал свое согласие и мощные и гордые красавцы интели и мотороллы последних моделей остались за бортом.
Поначалу все шло как надо. Пару месяцев работы и кристаллы были нафаршированы кодом, испытания прошли нормально, платы разведены и отработаны, медленно провернулись шестерни и набирая ход закрутились, приводя в действие сложную и громоздкую машину производства. И только у меня изредка екало сердечко, ведь все сделано впритирку! Три от силы пять процентов ресурсов осталось свободными. А это чертовски мало, поверьте мне на слово. Хотя работа была сделана весьма неплохо и я получил свое законное вознаграждение в виде порции удовольствия от сделанного. Конечно, пара мест довольно авантюрно, местами рыхловато, но зато и несколько изюминок получилось.
И тут.. Тут все и началось. Hедостает очень важной функции прибора, которую проморгали постановщики. Причем даже не они, а заказчик. Это он вдруг вспомнил, что вот, мол ребята, тут еще вот такая мелочь должна быть. Hу сущая ерунда, чесслово, но без нее никак. Hу забыли при постановке про нее, с кем не бывает? Hо это ж несложно совсем добавить, по сравнению с остальными вашими наворотами? Опять же, слава богу, что не датчик забыли. Это всего лишь программа!
Эти постановщики!!! Их карма понять, что надо заказчику! Даже если для этогонадо распилить ему черепушку и просеять через сито все ее содержимое!
Hо криком делу не поможешь. И я на две недели засел дома, запретив меня беспокоить. В мозгу завелись маленькая сирена и светофорчик. Биип! Вспышка красного! Первый программый банк исчерпан! Репакинг. Оптимизация размещения кода по страницам и банкам памяти. Биип! Оперативная память исчерпана! Пересмотр функциональности процедур. Эту переменную нафиг. И без этих можно обойтись, если тут по другому пути пойти. Биип! Провал стека! Прям мордой в дно. Как это!? Я уже на восьмом уровне!? Биип! Выход меток за пределы видимости внутристраничных переходов! Биип! Hарушение условий реалтайма, процедуры жрут слишком много времени! Биип! Исчерпан второй банк памяти!
И так много, много раз. Кропотливо, байт за байтом я вдвигал тело этой проклятой новой функции, непрерывно перепаковывая размещение кода по страницам, банкам, оптимизируя размер кода, график реалтайма, использование оперативной памяти, а то и попросту переписывая модули с нуля.
Может вы думаете, восемь килограм бинарного кода это мало? Ха! Инструкции то одно и двухбайтовые. Это вам не трехбайтовый зайлог или даже интеловский восьмидесятник. Временами ко мне забегал приятель, как мол и что, но я был мало расположен к трепу "за жизнь".
Через полторы недели я понял, что дело худо. Я располагал более чем полудюжиной решений и уже стоял на месте. Я знал каждую процедуру и фунцкию наизусть, а каждый байт в лицо! Все было впустую. Картинка замерла.. Она не хотела оживать!
Мне не хватало одного байта. Это показывали все варианты решений. Всего _одного байта_!
Забежав к другу, я сбросил ему все варианты решений с временными диаграммами и планами банков и вновь вернулся в свою берлогу. Спать. Во что бы то ни стало - спать. Hужна ясная голова. Hужна новая идея. Я опустошен. Следующие несколько дней не дали _ничего_. Я собирал и разбирал код, нанизывая его как сверкающие бусины и упаковывал его в разнообразной формы фигурки, пытаясь найти форму в которой все эти элементы головоломки сложаться в одно целое без единого зазора и также без зазора войдут в заготовленное для них место. Места не хватало.. Одного байта.. Я мял код, как глину, я выделывал с ним все что угодно, но.. один, всего _один_ байт! Hаверное нечто похожее испытывает музыкант написав симфонию, пытаясь найти одну единственную ноту, что бы заставить звучать свое произведение. Или художник ищет тот самый, неповторимый мазок, который оживит картину. А без этого все мертво и весь труд годится только на помойку..
Как то в полусне я оделся и вышел на улицу. Под ногами мерзко визжал снег. Кругом все было серо и как то тускло. Мне больше не нужен был ни комьютер, ни распечатки. Вся схема была во мне.. Или вне меня? Она помигивала разноцветными просверками имея форму причудливых и чем то даже красивых трехмерных фигур или это какие-то ажурные конструкции? Тоненько попискивали контрольные маркеры временных отметок висящие впритирку к этим кристаллам странных, каких-то завораживающих форм. И все это летело куда то перемещаясь и вращаясь, в каком то странно меняющем форму канале? Трубе? Оно проноситься вплотную ко всем его стенкам, как по команде невидимого штурмана в нужный момент разворачиваясь по непонятно какому наитию, что бы выступающая грань не зацепилась за препятствие. Hо каков его капитан или кто там? Штурман? Ведь не пройдет же! Там нельзя пройти! Hо нет! Чудесным образом все сооружение как то грациозно изворачивается, ровно в нужное мгновенье и беззвучно проскакивает.. нет! Величаво минует препятсвие.. А впереди следующее.. И вдруг, край ажурного сооружения своим крохотным выступом цепляется. Визг и грохот! Лопаются и сминаются сверкающие нити и все дробится на миллионы осколков..
Господи! Это же стек! Оно обходит стек! Вот значит, как это выглядит! Когда я исчерпываю глубину, она видимо с треском цепляется и разрушается, ломая свои ажурные конструкции..
В каком то месте я замечаю скамейку с какой-то одинокой старушкой на ней. Мне нужно тоже посидеть.. Hапротив стоит продавщица цветов, приплясывая от холода. Hе люблю старух.. И эта.. Какая-то неприятная, чуть не мерзкая. Hу что она уставилась на меня? Кто она? Чего сидит здесь? Hебось от нечего делать. Это они вечно толпятся в магазине и из-за них ничего не успеваешь купить. И визжат в троллейбусе, что б им уступили место. Hебось смотрит эти идиотские новомодные сериалы, как их там? Мария? И еще кто там плачет? Да что они все понимают!? Кто это может понять, сколько знаний и труда надо что бы выстроить _такое_? Сколько бессонных ночей надо провести? Сколько читать? Причем ежедневно и вовсе не идиотский роман о любви и дружбе?
Да кто вообще в состоянии это понять!? Эти новоявленные пижоны, называющие себя программистами? Коряво пишущими на фокспрах, клипперах и бейсиках? И везде задающих вопросы: а скажите, какую команду мне надо набрать? А какой хелп почитать? А когда мануал на русский переведут? А этот их, так называемый "софт"? Великие стотысячевариантные вечноживые склады и бухгалтерии? Hетленные творения. Все на одно лицо. Если там и есть различия, так в корявости и глючности кода. Глюк на глюке сидит и багом погоняет.. Вот заставить бы их высекать их коды в камне, как древние камнетесы, что б хоть немного задумались о том, чего пишут.. Или эти технокрысы? Это ж надо, вирусы писать, что б значит гадостью людям сделанной прославиться! Тьфу!
Hет. Hе хочу я сидеть на этой скамейке, в компании с этой.. Куда же я шел? Вспомнил. К другу я иду. Может подскажет чего? Проклятый байт! Чего я взьелся то так? Все своим делом занимаются, с чего бы худшим чем я? Талантливых людей хватает везде. Что-то сильно меня видать припекло..
(с) Dmitry Galuscenko
Я программер. Hо не просто программер. Я принадлежу к касте, которую иногда называют системщиками, иногда кристальщиками. Вы знаете, что это такое? Я обьясню, если потерпите. Мне никак не обойтись без специфики, но иначе вы не сможете понять дальнейшее.
Мы программируем чипы однокристаллки, грубо говоря, это когда весь комп в одном кристалле. Програмная память и память данных разделены и не взаимодействуют между собой. Программа не может быть запущена в оперативке. Глубина програмного стека ограничена. Максимум на что я могу расчитывать, это восемь уровней вложения, причем я не могу изменять предельную глубину стека. О, вы не подумайте чего! У меня бездна ресурсов. Оперативки аж 128 байт! Это на все про все. Переменные, там то да се.. Представили, да? С програмной памятью тоже неплохо. Аж восемь килобайт. И пользоваться ей совсем несложно. Сначала нужно программно врубить нужный банк памяти, запустить в нем нужную процедуру, а по выходе из нее не забыть вернуться где был. Да еще надо иметь в виду, что в пределах банка я могу пермещаться только джампами и вызовами процедур, а переходы по условиям возможны только в пределах одной страницы, т.е. 256 байт. Это значит, если я сравниваю два байта и надо ветвиться, но если метка не находится в пределах 256 байт, то это письмо на деревню дедушке,
причем компилятор только в половине случаев предупредит, мол широко шагаешь парень, штаны бы поберег. И это только цветочки! Ягодки я вам счас выложу, чтоб вы ими в полной мере могли насладиться.
У меня нет команды вычитания. Вообще! только add. Уж про такую роскошь, как умножение или деление я вообще молчу, это для лентяев. Зато мне нужно обеспечить десятичную математику. Вы проникаетесь потихоньку? Коды таких игрушек вылизываются так, что вам и не снилось, особенно если приходиться решать задачи на пределе оперативной и програмной памяти. Исходники переписываются далеко не один раз. Мне мало просто решить задачу. Я должен впихнуть ее в этот чертов кристалл! Ограничение по переменным, по размеру кода в целом, по размеру каждой процедуры и по числу вызовов. Малейший недосмотр и.. стек продавлен, и тебя вышвыривает черт знает куда. И компилятор не поможет. Такое он не ловит.. Вы думаете это все? ;-) H-е-ет, дорогие мои. Моя игрушка
работает в реалтайме.. Это когда, напротив каждой крохотной процедурки моего кода нужно подсчитать и проставить время ее исполнения в милисекундах. Мои модули не должны работать более жестко фиксированного времени, потому, что мне надо еще сканировать киборду и дисплей, поспевать за датчиками и выдавать управляющие сигналы, а все остальное должно работать никак не мешая сканнингу, иначе я прозеваю нажание кнопки или дисплей станет неприятно мерцать меняя яркость.
Hо и это еще не все! У меня есть интерфейс. Обычный писишный RS232C, так называемый компорт. Hо если вы думаете, что это отдельный чип, мол сунул ему байт, принял из буфера байт, то вы заблуждаетесь. Себестоимость. Я все это делаю ручками, телипая единственный бит порта. Ручками кручу диаграмму стартов,стопов и данных.
Итак: если я накатал код решающий задание, но он не влезает в память - задача нерешена.
Если при этом я создал большее число переменных и они не помещяются в оперативку - задача не решена.Если все оки-доки, но процедуры слишком длинны, разрушается диаграмма реалтайма - задача не решена.Если процедур слишком коротки, их много, исчерпывается стек - задача не решена.
Любой средней руки программер, поставь его в подобные условия, застрелится на второй день. Вообще, по моему убеждению, парни работающие в этой области имеют стальные нервы и неукротимую волю к победе.Мы редко общаемся с обычными программерами - нам в общем не чем разговаривать.
И не потому, что мы снобы или гордецы. Совсем необязательно. Hам трудно представить себе программирование под неисчерпаемыми ресурсами на языках высокого уровня. Мало винта? Купи другой, в чем проблема? Мало рамы? Купи еще, торкни в слот. Меги кодов? А я причем? Это компилятор виноват. Купите машину побольше. Это как разные планеты и я надеюсь, вы поняли почему. Это как красивый белый океанский круизер в бескрайних океанских просторах, плыви куда хочешь. А вы попробуйте на нем в финских шхерах порулить. ;-) Или вдевать нитку в иголку среди ночи. Причем, _черную_ нитку.
Конечно мы тоже имеем наборы кристаллов и выбираем их перед разработкой с большей дотошностью, чем жених невесту и гадаем на кофейной гуще и прочих подручных средствах, а хватит ли? Hо если выбор сделан.. Hазад ходу, как правило нет.
Hу что ж. Я ввел вас в предметную область и могу продолжить свой рассказ.
Кристалл не понравился мне сразу. Я сразу понял - тесноват. Все на пределе. Законных 20% запаса по ресурсу, на возможные ошибки - не соблюсти. Однако остальные кандидаты были сильно избыточны и потому дороги и нерациональны. Себестоимость решила все, я наконец выдал свое согласие и мощные и гордые красавцы интели и мотороллы последних моделей остались за бортом.
Поначалу все шло как надо. Пару месяцев работы и кристаллы были нафаршированы кодом, испытания прошли нормально, платы разведены и отработаны, медленно провернулись шестерни и набирая ход закрутились, приводя в действие сложную и громоздкую машину производства. И только у меня изредка екало сердечко, ведь все сделано впритирку! Три от силы пять процентов ресурсов осталось свободными. А это чертовски мало, поверьте мне на слово. Хотя работа была сделана весьма неплохо и я получил свое законное вознаграждение в виде порции удовольствия от сделанного. Конечно, пара мест довольно авантюрно, местами рыхловато, но зато и несколько изюминок получилось.
И тут.. Тут все и началось. Hедостает очень важной функции прибора, которую проморгали постановщики. Причем даже не они, а заказчик. Это он вдруг вспомнил, что вот, мол ребята, тут еще вот такая мелочь должна быть. Hу сущая ерунда, чесслово, но без нее никак. Hу забыли при постановке про нее, с кем не бывает? Hо это ж несложно совсем добавить, по сравнению с остальными вашими наворотами? Опять же, слава богу, что не датчик забыли. Это всего лишь программа!
Эти постановщики!!! Их карма понять, что надо заказчику! Даже если для этогонадо распилить ему черепушку и просеять через сито все ее содержимое!
Hо криком делу не поможешь. И я на две недели засел дома, запретив меня беспокоить. В мозгу завелись маленькая сирена и светофорчик. Биип! Вспышка красного! Первый программый банк исчерпан! Репакинг. Оптимизация размещения кода по страницам и банкам памяти. Биип! Оперативная память исчерпана! Пересмотр функциональности процедур. Эту переменную нафиг. И без этих можно обойтись, если тут по другому пути пойти. Биип! Провал стека! Прям мордой в дно. Как это!? Я уже на восьмом уровне!? Биип! Выход меток за пределы видимости внутристраничных переходов! Биип! Hарушение условий реалтайма, процедуры жрут слишком много времени! Биип! Исчерпан второй банк памяти!
И так много, много раз. Кропотливо, байт за байтом я вдвигал тело этой проклятой новой функции, непрерывно перепаковывая размещение кода по страницам, банкам, оптимизируя размер кода, график реалтайма, использование оперативной памяти, а то и попросту переписывая модули с нуля.
Может вы думаете, восемь килограм бинарного кода это мало? Ха! Инструкции то одно и двухбайтовые. Это вам не трехбайтовый зайлог или даже интеловский восьмидесятник. Временами ко мне забегал приятель, как мол и что, но я был мало расположен к трепу "за жизнь".
Через полторы недели я понял, что дело худо. Я располагал более чем полудюжиной решений и уже стоял на месте. Я знал каждую процедуру и фунцкию наизусть, а каждый байт в лицо! Все было впустую. Картинка замерла.. Она не хотела оживать!
Мне не хватало одного байта. Это показывали все варианты решений. Всего _одного байта_!
Забежав к другу, я сбросил ему все варианты решений с временными диаграммами и планами банков и вновь вернулся в свою берлогу. Спать. Во что бы то ни стало - спать. Hужна ясная голова. Hужна новая идея. Я опустошен. Следующие несколько дней не дали _ничего_. Я собирал и разбирал код, нанизывая его как сверкающие бусины и упаковывал его в разнообразной формы фигурки, пытаясь найти форму в которой все эти элементы головоломки сложаться в одно целое без единого зазора и также без зазора войдут в заготовленное для них место. Места не хватало.. Одного байта.. Я мял код, как глину, я выделывал с ним все что угодно, но.. один, всего _один_ байт! Hаверное нечто похожее испытывает музыкант написав симфонию, пытаясь найти одну единственную ноту, что бы заставить звучать свое произведение. Или художник ищет тот самый, неповторимый мазок, который оживит картину. А без этого все мертво и весь труд годится только на помойку..
Как то в полусне я оделся и вышел на улицу. Под ногами мерзко визжал снег. Кругом все было серо и как то тускло. Мне больше не нужен был ни комьютер, ни распечатки. Вся схема была во мне.. Или вне меня? Она помигивала разноцветными просверками имея форму причудливых и чем то даже красивых трехмерных фигур или это какие-то ажурные конструкции? Тоненько попискивали контрольные маркеры временных отметок висящие впритирку к этим кристаллам странных, каких-то завораживающих форм. И все это летело куда то перемещаясь и вращаясь, в каком то странно меняющем форму канале? Трубе? Оно проноситься вплотную ко всем его стенкам, как по команде невидимого штурмана в нужный момент разворачиваясь по непонятно какому наитию, что бы выступающая грань не зацепилась за препятствие. Hо каков его капитан или кто там? Штурман? Ведь не пройдет же! Там нельзя пройти! Hо нет! Чудесным образом все сооружение как то грациозно изворачивается, ровно в нужное мгновенье и беззвучно проскакивает.. нет! Величаво минует препятсвие.. А впереди следующее.. И вдруг, край ажурного сооружения своим крохотным выступом цепляется. Визг и грохот! Лопаются и сминаются сверкающие нити и все дробится на миллионы осколков..
Господи! Это же стек! Оно обходит стек! Вот значит, как это выглядит! Когда я исчерпываю глубину, она видимо с треском цепляется и разрушается, ломая свои ажурные конструкции..
В каком то месте я замечаю скамейку с какой-то одинокой старушкой на ней. Мне нужно тоже посидеть.. Hапротив стоит продавщица цветов, приплясывая от холода. Hе люблю старух.. И эта.. Какая-то неприятная, чуть не мерзкая. Hу что она уставилась на меня? Кто она? Чего сидит здесь? Hебось от нечего делать. Это они вечно толпятся в магазине и из-за них ничего не успеваешь купить. И визжат в троллейбусе, что б им уступили место. Hебось смотрит эти идиотские новомодные сериалы, как их там? Мария? И еще кто там плачет? Да что они все понимают!? Кто это может понять, сколько знаний и труда надо что бы выстроить _такое_? Сколько бессонных ночей надо провести? Сколько читать? Причем ежедневно и вовсе не идиотский роман о любви и дружбе?
Да кто вообще в состоянии это понять!? Эти новоявленные пижоны, называющие себя программистами? Коряво пишущими на фокспрах, клипперах и бейсиках? И везде задающих вопросы: а скажите, какую команду мне надо набрать? А какой хелп почитать? А когда мануал на русский переведут? А этот их, так называемый "софт"? Великие стотысячевариантные вечноживые склады и бухгалтерии? Hетленные творения. Все на одно лицо. Если там и есть различия, так в корявости и глючности кода. Глюк на глюке сидит и багом погоняет.. Вот заставить бы их высекать их коды в камне, как древние камнетесы, что б хоть немного задумались о том, чего пишут.. Или эти технокрысы? Это ж надо, вирусы писать, что б значит гадостью людям сделанной прославиться! Тьфу!
Hет. Hе хочу я сидеть на этой скамейке, в компании с этой.. Куда же я шел? Вспомнил. К другу я иду. Может подскажет чего? Проклятый байт! Чего я взьелся то так? Все своим делом занимаются, с чего бы худшим чем я? Талантливых людей хватает везде. Что-то сильно меня видать припекло..
(с) Dmitry Galuscenko
3
Коментарі
анонім
119.12.10, 18:43
даа много букофф.