29. Компилятор
Один, ноль, ноль, ноль, один, ноль, один, один. Ноль, один, один…
Это язык вычислительных устройств. Все умные вещи, которые выполняет компьютер — звонки, поиск в базах данных, игры, — сводятся к единицам и нулям. Вообще говоря, это не совсем точно: все сводится к наличию или отсутствию тока в крохотных транзисторах на полупроводниковой микросхеме. «Ноль» и «один» просто обозначают, включен ток или выключен.
К счастью, нет необходимости программировать компьютеры с помощью нулей и единиц. Только представьте себе, как это было бы сложно! Microsoft Windows, например, занимает у меня на жестком диске примерно 20 гигабайт. Это 170 миллиардов единиц и нулей. Если распечатать их, получится стопка листов формата A4 четыре километра высотой. Теперь представьте себе, что надо взять всю эту информацию и настроить каждый транзистор вручную. Если переключение каждого занимает секунду, то даже без учета времени, необходимого на эту кропотливую работу (длина транзистора всего одна миллиардная метра), установка Windows будет продолжаться пять тысячелетий.
Первые компьютеры действительно приходилось программировать примерно таким образом. Возьмем, например, Automatic Sequence Controlled Calculator, известный как Mark I. Он представлял собой сооружение пятнадцати метров в длину и двух с половиной в высоту, с цепочками ручек, рычагов, переключателей и передач. В нем было 850 километров проводов. Его жужжанием, как механическим пианино, дирижировала катушка перфорированной бумажной ленты. Для того чтобы решить новое уравнение, приходилось разбираться, какие переключатели включить и выключить, какие проводки подсоединить и куда. Затем следовало включить все переключатели, вставить нужные провода и пробить на бумажной ленте все отверстия. Программирование требовало недюжинного ума и математических способностей и было нудной, однообразной, подверженной ошибкам ручной работой.
Через четыре десятилетия после Mark I в школы поступили более компактные и удобные для пользователя машины, например Commodore 64. Мои сверстники, может быть, помнят детский восторг, когда печатаешь:
10 print ‘hello world’;
20 goto 10
И — вот! — экран заполняет грубоватый текст в низком разрешении: hello world, hello world, hello world… Вы написали инструкцию интуитивно понятными, человеческими словами, и компьютер ее принял. Это казалось маленьким чудом. Компьютеры совершили такой скачок после Mark I в том числе благодаря миниатюризации компонентов. Однако невозможно было бы представить подобную функциональность, если бы программисты не могли писать подобные Windows программы на близком человеческому языке и им приходилось бы переводить всё в нули и единицы — наличие и отсутствие тока, которое в итоге и делает всю работу.
Первым шагом к этому стало устройство, которое называлось компилятором, а его история начинается с женщины по имени Грейс Хоппер.
Сегодня много говорят о том, что женщин нужно привлекать в технические профессии. В 1906 году, когда родилась Грейс, равенство полов на рынке труда мало кого заботило. К счастью, среди немногих небезразличных был отец девочки, руководитель в страховой компании. Он не находил причин для того, чтобы его дочери получили худшее образование, чем сын. Грейс пошла в хорошую школу, где у нее проявились блестящие способности к математике. Ее дедушка дослужился до контр-адмирала, и в детстве она мечтала о флоте, но туда брали только мужчин. Тогда она решила стать профессором.
В 1941 году, после нападения на Перл-Харбор, Америка вступила во Вторую мировую войну. Талантливые мужчины были призваны, и флот начал принимать женщин. Грейс немедленно воспользовалась открывшимся шансом.
Если вы недоумеваете, какая польза флоту от математиков, подумайте о наведении ракет. Под каким углом и в каком направлении нужно стрелять? На траекторию влияет множество факторов: дальность, температура, влажность, скорость и направление ветра. Это несложные вычисления, но если «компьютер» — это ручка и листок бумаги, времени уходит много. Может быть, есть более быстрый способ? Когда младший лейтенант Хоппер в 1944 году окончила школу мичманов, на флоте живо заинтересовались потенциалом громоздкого устройства, недавно разработанного гарвардским профессором Говардом Эйкеном — тем самым Mark I. Хоппер направили помочь Эйкену разобраться, на что способна новинка.
Профессор поначалу не испытал восторга оттого, что в коллективе появилась женщина, но вскоре Хоппер так его поразила, что он поручил ей написать руководство по эксплуатации. Текст рождался методом проб и ошибок. Чаще всего Mark I глох вскоре после включения, к тому же не выдавал удобного сообщения об ошибке. Однажды сбой произошел из-за того, что в машину залетела моль, что подарило миру современный термин «баг» — жучок. Чаще «мошки» были не такие буквальные: неправильное положение переключателя, отверстие в бумажной ленте не в том месте. «Детективная» работа оказалась нудной и трудоемкой.
Хоппер и ее коллеги начали заполнять записные книжки фрагментами проверенного на практике кода, пригодного к повторному использованию. К 1951 году компьютеры усовершенствовались и научились хранить эти фрагменты — подпрограммы — в собственных системах памяти. Хоппер, в то время работавшая в компании Remington Rand, попыталась убедить начальство позволить программам вызывать эти подпрограммы знакомыми словами, например «вычти из зарплаты подоходный налог» вместо, как выражалась Хоппер, «попыток записать это восьмеричным кодом или всевозможными символами».
Позже Хоппер утверждала: «Раньше никто об этом не думал, потому что таких ленивых, как я, не нашлось». Хоппер, прославившаяся своим трудолюбием, лукавит, но зерно правды в ее заявлении есть. Идея, которую она назвала компилятором, подразумевала компромисс: само программирование шло быстрее, но получавшиеся в результате программы работали медленнее. По этой причине Remington Rand не проявила интереса к изобретению. У каждого клиента были свои, индивидуальные требования к блестящим новеньким вычислительным устройствам, поэтому лучше, полагали в компании, чтобы специалисты компании программировали их как можно эффективнее.
Но Хоппер не унывала и написала первый компилятор в свободное от работы время. Он помог пользователям мыслить яснее, и это на многих произвело большое впечатление. Одним из таких клиентов был инженер Карл Хаммер, который благодаря нововведению за день смог решить уравнение, над которым его коллеги бились месяцами: хватило всего двадцати строк. Программисты-единомышленники со всех Соединенных Штатов начали присылать Хоппер новые фрагменты кода. Она добавляла их в библиотеку для следующего выпуска и в итоге стала пионером программного обеспечения с открытым кодом.
Благодаря компилятору Хоппер сложился один из первых языков программирования — COBOL, но еще важнее было то, что он проложил путь к знакомому теперь разделению на «железо» и программное обеспечение. В уникальных изделиях вроде Mark I аппаратура и программное обеспечение были едины: схема переключателей работала только на данной машине, потому что каждая требовала совершенно иного подхода. А если компьютер способен запустить компилятор, он выполнит любую программу на его основе.
С тех пор людей, программистов, от базовых, физических микросхем отделяет все больше слоев абстракции, и каждый слой — это еще один шаг к освобождению умов программистов. Важность этого направления осознала именно Грейс Хоппер: надо думать о концепциях и алгоритмах, а не о переключателях и проводах.
Хоппер имела свое мнение о том, почему коллеги поначалу этому сопротивлялись. Дело было не в заботе о скорости работы программ. Нет. Они просто любили престиж, им нравилось осознавать себя единственными способными общаться с богоподобным компьютером от имени простых смертных, только что его купивших. Хоппер называла их «первосвященниками». Сама же она полагала, что возможность программировать должен иметь каждый. Теперь так оно и есть, и благодаря этому компьютеры стали намного полезнее.