В самых первых компьютерах граница между аппаратным и программным обеспечением была очевидна. Со временем, однако, произошло значительное размывание этой границы, в первую очередь благодаря тому, что в процессе развития компьютеров уровни добавлялись, убирались и сливались друг с другом. В настоящее время очень сложно отделить их друг от друга [213]. С этой проблемой связана центральная тема нашей книги:
Аппаратное и программное обеспечение логически эквивалентны
Любая операция, выполняемая программным обеспечением, может быть реализована аппаратным обеспечением (желательно после того, как она будет продумана). Карен Панетта Ленц (Karen Panetta Lentz) говорил: «Аппаратное обеспечение — это всего лишь окаменевшее программное обеспечение». Конечно, обратное тоже верно: любая команда, выполняемая аппаратным обеспечением, может быть смоделирована программно. Решение разделить функции аппаратного и программного обеспечения основано на таких факторах, как стоимость, быстродействие, надежность, частота ожидаемых изменений. Существует несколько жестких правил, сводящихся к тому, что операция X должна быть реализована в аппаратном обеспечении, а операцию У нужно программировать. Эти решения меняются в зависимости от тенденций экономического и технологического развития.
Изобретение микропрограммирования
У первых цифровых компьютеров в 40-х годах было только два уровня: уровень архитектуры набора команд, на котором осуществлялось программирование, и цифровой логический уровень, выполнявший программы. Схемы цифрового логического уровня были ненадежны, сложны для производства и понимания.
В 1951 году Морис Уилкс (Maurice Wilkes), исследователь Кембриджского Университета, предложил идею разработки трехуровневого компьютера, призванную упростить аппаратное обеспечение [219]. Эта машина должна была иметь встроенный неизменяемый интерпретатор (микропрограмму), функция которого заключалась в выполнении программ уровня ISA посредством интерпретации. Так как аппаратное обеспечение должно было теперь вместо программ уровня ISA выполнять только микропрограммы с ограниченным набором команд, требовалось меньшее количество электронных схем. Поскольку электронные схемы тогда делались из электронных ламп, данное упрощение призвано было сократить количество ламп и, следовательно, повысить надежность (которая в то время выражалась числом поломок за день).
В 50-е годы было построено несколько трехуровневых машин. В 60-х годах число таких машин значительно увеличилось. К 70-м годам идея о том, что написанная программа сначала должна интерпретироваться микропрограммой, а не выполняться непосредственно электроникой, стала преобладающей.
Изобретение операционной системы
В те времена, когда компьютеры только появились, принципы работы с ними сильно отличались от современных. Одним компьютером пользовалось большое количество людей. Рядом с машиной лежал листок бумаги, и если программист хотел запустить свою программу, он записывался на какое-то определенное время, скажем, на среду с трех часов ночи до пяти утра (многие программисты любили работать в тишине). В назначенное время программист направлялся в комнату, где стояла машина, с пачкой перфокарт (которые тогда служили средством ввода) в одной руке и хорошо заточенным карандашом в другой. Каждая перфокарта содержала 80 колонок; на ней в определенных местах пробивались отверстия. Войдя в комнату, программист вежливо просил предыдущего программиста освободить место и приступал к работе.