Кодеры за работой. Размышления о ремесле программиста - Питер Сейбел
Шрифт:
Интервал:
Закладка:
Моей специальностью была физика, но я все больше занимался программированием, мне нравились занятия по математике и компьютерным наукам, нравилось изучать теорию автоматов и формальные языки. В те времена была настоящая гонка за разработку лучшего восходящего парсера - тогда это делал уасс, затем были созданы и другие системы. Очевидно, что формальная чистота ведет к чистому коду, что всегда было заметно во внешнем интерфейсе компилятора. Внутренний же код был тогда мешаниной из тайных знаний и эвристики, а мне действительно нравились теория формальных языков, теория регулярных языков и все такое.
Сейбел: На каких языках и в каких средах вы тогда программировали? Для целей физики использовался Фортран?
Айк: Это очень занятно. Я был увлечен чистой физикой и не ходил на инженерные занятия, чтобы не иметь дела с пачками перфокарт, которые можно рассыпать - и тогда придется использовать раскладочную машину. Фортран к тому времени меня уже не устраивал. Тогда был очень важен Паскаль, и мы уже начинали осваивать Си. И ассемблер. Я писал низкоуровневый код, делал хеш-таблицы и тому подобное. И это было полезно: так лучше понятны компромиссы, к которым вынуждены прибегать разработчики. Сразу видно, кто работал на уровне битов, а кто всю жизнь работал в защищенной среде.
Меня также интересовали язык Си и UNIX, но с нашим старым железом, то есть DEC, мы только начинали их осваивать. У нас было что-то на основе Portable С Compiler и уасс, мы едва-едва начали генерировать код и занялись портированием программ в UNIX. Физики не получали летней работы, так что я много программировал, был ассистентом в лаборатории, а в последний год сменил специализацию на “математика/компьютерные науки”, и именно это значилось в моем дипломе бакалавра.
Сейбел: Помните ли вы свою первую интересную программу?
Айк: Непростой вопрос... Там был жуткий графический терминал от DEC - видимо, усовершенствованный VT100, поскольку он понимал escape-последовательности. Совершенно убогая глубина цвета и разрешение на уровне начала 1980-х. Я начал делать для него копии игр: Рас-Man, Donkey Kong. Эти игры я писал на Паскале, и они использовали escape-последовательности. Это было что-то вроде хобби, которым я занимался все больше и больше. Думаю, это был первый для меня случай нестандартного программирования, когда пришлось задуматься о модульности и защите от самого себя.
Это было тогда, когда я еще специализировался по физике, - наверное, на третьем курсе. На четвертом курсе я сменил специализацию, стал изучать формальные языки и писать генераторы парсеров. Вот так я занимался одновременно вещами серьезными и несерьезными - играми и умными программами. Потом я обратился к компиляторам, стал писать копии макрообработчиков вроде т4 и СРР, все в таком духе. Помню, как мы достали исходник какой-то версии UNIX, как читали по-настоящему заумный код на Си! Препроцессор Си Джона Райзера - возможно, настоящий - был довольно забавной смесью всякой всячины. Он был очень эффективным - использовал глобальный буфер, там было много указателей, и еще он пытался избегать копирования. Я подумал: “Чтобы делать это, должен быть способ получше”.
Так я бросил физику и обратился к компьютерным наукам и программированию. До этого я по-настоящему не занимался программированием - только математикой и компьютерной теорией. Родители не хотели покупать мне Apple П. Я заикнулся об этом однажды. Выпрашивать не стал, но сказал, что с помощью компьютера смогу выучить иностранный язык - это была своего рода маскировка. “Нет, ты будешь тратить время на свои игры”, - ответили родители и были правы. Вот так они уберегли меня от игр.
Сейбел: Программисту легче найти летнюю подработку, чем физику. А что еще для вас было в этом привлекательного?
Айк: Связь теории и практики, особенно на пользовательской стороне процесса написания компиляторов. В численные методы я погружался не слишком глубоко. Не так уж интересно ломать голову над тем, как представить действительные числа в виде чисел с плавающей запятой с конечной точностью. Адский кошмар. Пользователи JavaScript до сих пор обжигаются на этом - мы выбрали этот стандарт 1980-х, но он не всегда работает так, как ожидалось.
Сейбел: Тут как с испанской инквизицией - никто не ждет плавающую запятую.[43]
Айк: Никто не ожидает встретить получаемые ошибки округления - в пятой степени невообразимые. Округление плохо выполняется в двоичной системе. Поэтому в JavaScript, там, где речь идет о долларах и центах, суммах и разностях, встречаются странные нули с девяткой после них. В одном блоге критиковали Safari и Мак за неправильные математические вычисления. Это стандарт двойной точности IEEE - он встречается везде, и в Java, и в Си.
Кроме того, физика мне казалась чем-то застывшим. Что-то есть в этом нездоровое - люди протирают штаны, открывая что-нибудь вроде темной энергии, то, что принципиально нефальсифицируемо. Меня притягивали более практические вещи, которые тем не менее прочно опираются на математику и логику.
Затем я перешел в Иллинойский университет в Урбана-Шампейне, чтобы наконец получить степень магистра. Я думал, что все уже позади, когда оказался в проекте, для которого IBM набирала специалистов. У них была странная машина 68020, купленная у какой-то компании из Дэнбери (Коннектикут). На этот компьютер они портировали Xenix. Работал он так плохо, что они наняли нашу исследовательскую группу, сделав из нее группу контроля качества. Каждый понедельник появлялся человек в синем костюме и произносил напутственные слова. Преподавателям было, в общем, все равно. Может, я и научился бы чему-нибудь новому, но слышал, о чем говорил в кампусе Джим Кларк, и решил, что хочу работать в Silicon Graphics.
Сейбел: Над чем вы работали в SGI?
Айк: В основном над ядром и сетевым кодом. Я постепенно совершенствовался в языках, так как мы решили создать собственный уровень для управления сетью и анализа пакетов. Я написал язык выражений для сравнения полей и пакетов, и еще транслятор, который уменьшал и оптимизировал все это до небольшого числа фильтрующих масок для первых 36 байт пакета.
В конце концов я создал другую реализацию языка - компилятор, который генерировал Си-код на основе описания протокола. Кто-то захотел, чтобы наш анализатор пакетов поддерживал AppleTalk. Это было большое и сложное собрание протокольного синтаксиса для последовательностей и полей разных размеров и зависимых типов... в основном массивов, всякие штуки в этом роде. Это было занятно - трудная задача, которую нужно решить. В итоге мне пригодились некоторые знания о компиляторах из старой “Книги Дракона” Ахо и Ульмана[44]. Думаю, я сделал клон утилиты unifdef. Дэйв Йост уже сделал до меня что-то подобное, но его программа не работала с выражениями #if и не делала минимизацию выражений в том случае, если одни выражения определялись как U, а другие не определялись. Моя программа до сих пор используется и даже, кажется, применяется в Linux.
(adsbygoogle = window.adsbygoogle || []).push({});