Нечаянные изгибы плат могли повредить места пайки. Риск ошибок и
поломок был огромен, а затраты для компании – слишком высоки.
Мой начальник Кен Файндер пришел ко мне и попросил что-
нибудь сделать. Нам был нужен способ замены микросхем,
который
бы не требовал замены всех остальных микросхем. Если вы читали
мои книги или слушали мои лекции, то вы знаете, что я много говорю
о возможности независимого развертывания. Именно тогда я впервые
усвоил этот урок.
Проблема заключалась в том, что программа представляла собой
единый скомпонованный исполняемый файл. Добавление новой
строки кода приводило к изменению адресов всех последующих строк.
Так как в каждой микросхеме попросту хранился один килобайт
адресного пространства, то изменялось содержимое практически всех
микросхем.
Решение было довольно простым.
Микросхемы нужно было
изолировать друг от друга. Содержимое каждой микросхемы
преобразовывалось в независимую единицу компиляции, которая
могла записываться независимо от всех остальных.
Я определил размеры всех функций в приложении и написал
простую программу, которая «укладывала» их,
словно фрагменты
головоломки, на микросхемах, оставляя 100 байт свободного
пространства для расширения. В начале каждой микросхемы
размещалась таблица указателей на все функции данной микросхемы.
Во время загрузки эти указатели перемещались в память. Весь код
системы был изменен таким образом,
чтобы функции никогда не
вызывались напрямую – только через векторы, хранящиеся в памяти.
Да, вы правильно поняли: микросхемы превратились в аналоги
объектов с v-таблицами, а функции вызывались полиморфно. Именно
так я узнал некоторые принципы объектно-ориентированного
программирования задолго до того, как познакомился с понятием
«объект».
Выгода от такого решения была огромной. Мы
получили
возможность не только ограничиться установкой отдельных
микросхем, но и вносить исправления «на месте», перенаправляя
векторы в оперативной памяти. Это значительно упростило отладку и
«горячие» исправления.
Но я отклоняюсь от темы. Когда Кен пришел ко мне с
предложением решить проблему, он предложил подумать об
указателях на функции. Я потратил
день-два на формальное
изложение идеи, а затем представил подробный план. Он спросил,
сколько времени займет работа; я сказал, что около месяца.
Мне понадобилось
три
месяца.
Я напивался только дважды в жизни и только один раз напился
основательно. Это произошло на праздновании Рождества в Teradyne в
1978 году. Мне тогда было 26 лет.
Праздник проводился в офисе Teradyne, который в основном
состоял из открытого лабораторного пространства. Все пришли рано,
а сильная снежная буря не позволила
оркестру и фирме выездного
обслуживания добраться до нас. К счастью, выпивки было достаточно.
Я не очень хорошо помню этот вечер, а то, что
помню
, предпочел бы
забыть. И все же я не могу не поделиться одним важным моментом.
Я сидел по-турецки на полу с Кеном (мой начальник – ему тогда
было 29 лет, и он был трезв), сетуя на то, сколько времени у меня
заняла векторизация. Алкоголь освободил мои скрытые страхи и
неуверенность по поводу исходной оценки. Надеюсь, я не клал голову
ему на плечо – впрочем, такие подробности не очень четко
отложились у меня в памяти.
Помню, я спросил, не сердится ли он на меня и не считает ли, что
работа заняла слишком много времени. И как бы смутно я ни помнил
тот вечер, его ответ четко отложился у меня в памяти на последующие
десятилетия. Он сказал: «Да, я думаю, что прошло много времени, но
я вижу, что ты прилежно трудишься, а работа не стоит на месте. И нам
это действительно нужно. Так что я не сержусь».
Do'stlaringiz bilan baham: