Рубрика:
Разработка /
Истоки программирования
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
АЛЕКСЕЙ ВТОРНИКОВ, ЗАО КБ «Ростовский Универсальный», ведущий программист, pdp8dec@gmail.com
Скромный гений из 50-х
Мы досадно небрежны и часто забываем тех, чьи труды создали сегодняшний мир. Мой рассказ – об английском ученом и инженере Морисе Винсенте Уилксе и некоторых событиях более чем полувековой давности
Сейчас мы будем форматировать тебе мозг. Циркулем.
«Шматрица» Д. Пучков (Гоблин)
Книга
В 1951 году издательство MIT Press выпустило в свет книгу «The Preparation of Programs for an Electronic Digital Computer». Ее авторами были Морис Уилкс, Дэвид Уилер и Стенли Гилл. Она занимает в необозримой компьютерной литературе совершенно особенное место: это самая первая книга по программированию. Не документация, не отчет, недиссертация, не журнальная статья – а именно книга.
Грязная служанка капитализма
Прежде чем начать рассказ, позвольте мне привести обширную цитату из «Краткого философского словаря» (Госполитиздат, 1954):
КИБЕРНЕТИКА (от др. греч. слова, означающего рулевой, управляющий) – реакционная лженаука, возникшая в США после Второй мировой войны и получившая широкое распространение и в других капиталистических странах; форма современного механицизма.
…кибернетика рассматривает психофизиологические и социальные явления по аналогии не с простейшими механизмами, а с электронными машинами и приборами, отождествляя работу головного мозга с работой счетной машины...
Кибернетика ярко выражает одну из основных черт буржуазного мировоззрения – его бесчеловечность, стремление превратить трудящихся в придаток машины, в орудие производства и орудие войны... Поджигатели новой мировой войны используют кибернетику в своих грязных практических делах... происходит привлечение ученых самых различных специальностей для разработки новых приемов массового истребления людей... Кибернетика является, таким образом, не только идеологическим оружием империалистической реакции, но и средством осуществления ее агрессивных военных планов.
Вот так: «массовое истребление людей», ни больше, ни меньше. Рискнули бы вы, живя в СССР в те времена, заниматься кибернетикой?
Перевод
В 1953 году (всего через два года после оригинального издания, но до цитируемой статьи из философского словаря) книга М.Уилкса, Д.Уилера и С.Гилла была переведена и издана вСоветском Союзе под названием «Составление программ для электронных счетных машин».
|
Обложка книги М.Уилкса, Д.Уилера и С.Гилла «Составление программ для электронных счетных машин» |
Оцените смелость и прозорливость тех, кто рекомендовал ее, переводил и редактировал. Ведь книга имела самое непосредственное отношение к кибернетике.
Спасло книгу, несомненно, то, что в Советском Союзе уже велись работы по созданию собственных вычислительных машин, и целесообразность издания книги оказалась выше идеологических ярлыков. Ученые, конструкторы, а также военные прекрасно понимали, что без вычислительных машин они никуда не продвинутся – времена счетных линеек, арифмометров и пухлых таблиц тригонометрических функций, корней и логарифмов стремительно заканчивались. Все больше и больше расчетов не могло быть выполнено вручную; требовались совершенно иные инструменты. Ракетная техника, ядерное оружие, системы наведения, реактивная авиация, ПВО, космос – да мало ли было задач, где требовались скорость, точность, надежность! Кроме того, вычислительный эксперимент несравнимо дешевле натурных испытаний и совершенно безопасен.
Книга стала по-настоящему ценным открытием для первого поколения программистов. Первые программисты, как и следовало ожидать, были в основном математиками. Многие, кто до этого ничего не знал о вычислительных машинах, прочтя книгу, стали переключаться на новую и захватывающую тематику. К началу 60-х годов прошлого века нападки накибернетику практически прекратились – она из грязной служанки капитализма превратилась в респектабельную и, что важнее, очень полезную науку.
Создавались лаборатории, институты, конструкторские бюро, вычислительные центры, кафедры, проводились конференции. Разворачивалось производство, формировались коллективы и организации по разработке программного обеспечения.
Несмотря на то что прошло больше 60 лет с момента издания, книга читается легко и интересно. Так всегда бывает, когда читаешь работы первопроходцев. Разумеется, сразу же после выхода в свет книга стала очень востребованной и быстро превратилась в библиографическую редкость. Если вам посчастливится найти ее, не откажите себе в удовольствии ипочитайте.
В этой книге впервые во всей полноте и точности была представлена концепция библиотек программ. Уилкс (а именно ему и принадлежит основная идея) понял, что необходимо иметь стандартные программные «заготовки», которые должны решать часто встречающиеся задачи: извлечение корней, табулирование функций, численное интегрирование, транспонирование матриц, сортировка, преобразование данных и т.д.
Он понял, что программиста, решающего конкретную проблему, необходимо освободить от постоянного кодирования и отладки этих часто встречающихся задач. Эти заранее подготовленные и отлаженные заготовки должны быть всегда под рукой и использоваться по требованию. Такие решения, всегда готовые к использованию, следует объединять вбиблиотеки (тогда часто говорили о пакетах прикладных программ), являющиеся частью стандартного программного обеспечения.
Эта концепция, можно сказать, пережила десятилетия и продолжает оставаться и сегодня основой большинства систем программирования. В самом деле – чего стоит язык программирования без соответствующего окружения! А благодарить за это мы должны Уилкса.
Историческое отступление
Вплоть до катастрофического решения Государственного комитета по науке и технике, Академии наук и Министерства радиопромышленности СССР в январе 1967 года (окончательно закрепленного в 1969-м) о копировании западных образцов вычислительной техники (главным образом, машин серии IBM-360) отечественные наука и производство если и отставали от последних, то не очень сильно. Этому решению предшествовало несколько совещаний. Мнения участников разделились. К сожалению, победила точка зрения тех, кто ратовал за отказ от собственных разработок. Возможно, некоторую роль в этом сыграло мнение тогдашнего президента Академии наук М.В. Келдыша. Трудно сказать, почему блестящий ученый, к тому же математик, принял такую точку зрения. И это притом что по некоторым направлениям (касавшимся прежде всего архитектуры компьютеров) мы опережали западных конкурентов.
Но что сделано, то сделано. Через несколько лет после решения о копировании западных образцов самостоятельные разработки были свернуты; только для некоторых оборонных проектов работы продолжались, но они (понятно почему) не имели выхода в гражданскую промышленность, управление и образование. Разумеется, что никакой помощи от IBM ждать не приходилось. Всякими (и часто не слишком законными) способами «заимствовались» фирменная документация и программное обеспечение. Все это нуждалось в изучении и переработке, что влекло за собой многочисленные ошибки и хроническое отставание. Неслучайно менее чем через 10 лет Эдсгер В. Дейкстра назвал это решение 1967 года величайшей победой Америки в холодной войне («the greatest American victory in the cold war»); даже если он несколько и переоценил масштабы катастрофы, все равно Советский Союз уже безнадежно отстал: как известно, ломать – не строить. Программистов, и программистов превосходных, хватало, но вот в остальном... Увы, последствия этого решения продолжают ощущаться и сейчас.
Инженер, исследователь, ученый
После этого грустного исторического экскурса давайте вернемся к первому из авторов книги – Морису Винсенту Уилксу. Морис Уилкс прожил долгую жизнь (1913-2010 гг.). Еготворческие достижения были по достоинству оценены: мало кто может похвастать сравнимым списком премий и наград, среди которых главная – премия Тьюринга (1967 г).
Вкратце биография Уилкса такова. В 1934 году он закончил Кембриджский университет (Великобритания), защитил диссертацию по распространению радиоволн. С 1939 по 1945год служил в армии, занимаясь преимущественно радарами. С 1945-го Уилкс – директор математической лаборатории университета (впоследствии переименованной вкомпьютерную лабораторию). Уилкс был знаком с Аланом Тьюрингом и Джоном фон Нейманом – создателями и главными действующими лицами computer science той поры. В 1946году Уилкса пригласили прослушать курс лекций, который вели создатели компьютера ENIAC (США) Джон Мочли и Проспер Экерт. По словам Уилкса, этот курс произвел на него чрезвычайное впечатление, и он решил: его дальнейшая карьера будет посвящена компьютерам.
Тогда же Уилкс возглавил в Кембриджском университете работы по созданию компьютера (запущен в 1949 году), который получил имя EDSAC (от Electronic Delay Storage Automatic Computer). EDSAC стал выдающейся разработкой, т.к., во-первых, это был действительно программируемый компьютер (тот же ENIAC программировался установкой накоммутационных панелях перемычек и штекеров, т.е. фактически программа была частью схемы компьютера). Во-вторых, программа для EDSAC хранилась в памяти компьютера (архитектура фон Неймана). В-третьих, использовалась двоичная система счисления (куда более простая и удобная, чем привычная десятичная).
|
Морис В.Уилкс и компьютер EDSAC |
Машина размещалась в шкафах, занимавших площадь 20 кв.м и насчитывала около трех тысяч электронных ламп. Такое количество ламп требовало солидных энергозатрат: потребляемая мощность машины составляла 12 кВт. Объем памяти на ртутных ультразвуковых линиях задержки поначалу составлял 1024 слова по 32 бита каждое. Была предусмотрена (и чуть позже реализована) возможность подключения дополнительной памяти. Скорость вычислений достигала 15 тысяч операций в секунду. В 1953 году началась доработка машины (а фактически полное ее перепроектирование): ртутная память была заменена на ферритовую, появилось постоянное запоминающее устройство. Машина получила имя EDSAC-2 и проработала с 1957 по 1965 год.
Но самое главное, что было в новой модификации машины, – принцип микропрограммного управления (часто используются термины «микропрограммирование», «микрокод», и мы будем употреблять их как равнозначные). Если сама машина EDSAC была технологическим прорывом, то микропрограммное управление стало настоящей революцией. Революцией тихой, почти невидимой, но имеющей фундаментальные последствия. Об этом я расскажу чуть ниже.
Уилкс одним из первых ввел концепцию мнемоник команд, символических имен (меток) и макросов в языках низкого уровня. Именно Уилкс ввел в оборот священное для многих слово «ассемблер». Он был среди тех, кто впервые начал заниматься системами разделения времени – предтечей многозадачных операционных систем и написал по этому вопросу книгу (была переведена на русский язык).
Морис Уилкс – основатель и первый президент Британского компьютерного общества (1957-1960 гг.). Он был членом Королевского общества – британской Академии наук.
В 2000 году за научные и технические достижения Морис В. Уилкс был произведен в рыцарское достоинство, и с тех пор перед его именем обязательным стало обращение «сэр».
Микропрограммирование
Микропрограммирование относится к довольно сложным темам; его можно описать точно и строго на уровне электрических сигналов, триггеров, т.е. всего того, что относится кцифровой электронике. Можно же выбрать иной путь – описать его функционально, т.е. как совокупность взаимодействующих элементов, но без углубления в технические детали. Именно этим путем я и решил последовать.
Некоторым аналогом микрокода является механическое пианино, в котором нажатия клавиш управляются путем считывания сигналов, записанных на перфорированной ленте илибарабане. Пианино выступает исполнителем программы, записанной на ленте или барабане. Изменяя последние, мы изменяем программу механического пианино и, следовательно, извлекаемые им звуки.
Сама идея микрокода витала, что называется, в воздухе. Еще в 1947 году при проектировании компьютера MIT Whirlwind была предложена управляющая контрольная матрица: двумерная диодная решетка, синхронизируемая импульсами от внутренних часов ЦПУ. Однако это была лишь начальная и робкая попытка, не доведенная до логического завершения. Кроме того, развитию этой идеи препятствовал недостаточный уровень развития электроники. В июле 1951-го Уилкс сделал первое сообщение на конференции вМанчестерском университете, а окончательное решение было оформлено им в статье (в соавторстве с Дж. Стрингером), опубликованной в апреле 1953 года. Еще через несколько лет микропрограммное управление было наконец реализовано.
Микрокод занимает промежуточное положение между аппаратурой (hardware) и программным обеспечением (software). Часто микрокод называют «прошивкой» (firmware); этообъясняется тем, что микрокод тем или иным образом фиксируют (прошивают) в микросхемах энергонезависимых ПЗУ.
Для начала давайте выясним, а зачем вообще нужен микрокод, неужели без него нельзя обойтись? Можно, конечно, но все не так просто.
В первых компьютерах каждой выполняемой ими операции соответствовал отдельный компонент электронной схемы. Если на исполнение поступала какая-то команда, топроисходило примерно следующее:
- Выделялся код операции (например, сложение, переход, сдвиг и т.д.).
- По выделенному коду операции выбиралась та часть электронной схемы, которая отвечала именно этой операции (т.е. для сложения выбиралась часть схемы, ответственная засложение, для перехода – часть схемы, ответственная за переход и проч.).
- Операция осуществлялась, и компьютер переходил к обработке следующей операции.
Мы опускаем такие «мелочи», как выборка и запись операндов из памяти и в память, обращение к внешним устройствам, обработка прерываний, синхронизация импульсов и т.д.
Таким образом, каждой операции соответствовала какая-то часть электронной схемы, которая активировалась при исполнении операции. Для добавления новых операций илиизменения существующих в компьютер требовалось внести большие изменения: доработать (или полностью переработать) электрическую схему, изготовить новые платы, напаять компоненты, протестировать систему в целом. Если конструкторы где-то ошибались (а это, как понимаете, было нетрудно), то все приходилось переделывать. Схемы управления, управляющие потоками сигналов, были жесткими и трудно поддающимися изменениям.
Легко видеть, что при таком подходе компьютеры просто не могли не быть дорогими, громоздкими и ненадежными. Неудивительно, что компьютеры занимали целые шкафы: где же еще можно было разместить такое количество плат и соединительных проводов! Каждому из них требовались специальное помещение и целый штат обслуживающего персонала. Нужно было что-то делать. Решение, предложенное Уилксом, оказалось выходом из технологического тупика.
Прежде всего конструкторы (а еще раньше – математики) обнаружили, что все возможные операции, исполняемые компьютерами, можно свести (редуцировать) к относительно небольшому числу базовых элементарных операций. Вот несколько примеров:
Сложение двух положительных чисел x+y можно представить как прибавление к числу x стольких единиц, сколько их содержится в числе y:
while (y != 0) {
x++;
y--
}
Так, относительно сложная операция сложения сводится к более простым – инкременту и декременту.
Вычитание x-y, это уже знакомая операция сложения, в которой операнд y берется с противоположным знаком.
Само изменение знака числа достигается совсем просто:
y = (~y) + 1
где «~»– логическая операция отрицания (замена 0 на 1 и обратно).
Копирование данных из одной ячейки памяти (x) в другую (y) очень похоже на сложение:
x = 0
while (y != 0) {
x++;
y--;
}
Здесь видно, что нужна еще одна элементарная операция – обнуление (стирание) содержимого ячейки памяти.
Переход (условный или безусловный), а также вызов подпрограммы сводятся к изменению содержимого счетчика команд.
Правильно комбинируя такие элементарные (базовые) операции, можно было существенно упростить процессор. Оставалось придумать, как именно автоматизировать процесс комбинирования, как организовать правильное функционирование базовых компонентов так, чтобы они могли реализовать любую из команд компьютера. Как решить проблему ихкоммутации?
Вот тут на сцене и появляется микрокод.
В сущности, микрокод – это управляющая программа, которая описывает, как, в каком порядке и с какими параметрами следует вызывать базовые операции. Изменяя микрокод, мы изменяем и систему команд компьютера. Если нужно изменить архитектуру машины, не меняя основных составляющих, то достаточно изменить эту управляющую программу.
Практически все сколько-нибудь сложные устройства (компьютеры, внешние устройства, фотоаппараты, сотовые телефоны и т.д.) оснащены процессорами, действующими попринципу микропрограммирования.
Любая операция процессора – это набор (совокупность) нескольких микрокоманд, прошитых в ПЗУ процессора. Для того чтобы изменить «поведение» процессора, нужно изменить его микропрограмму.
М.Уилкс предложил рассматривать микрокод как двумерную таблицу (матрицу). Столбцы матрицы соединятся проводниками с линиями управления процессором, а строки представляют собой микрокоманды (микроинструкции), т.е. битовые (двоичные) последовательности, описывающие исполнение той или иной операции. Каждая микрокоманда исполняется за один такт. Единица, как обычно, означает, что данный бит включен, а нуль – то, что этот бит выключен. Таким образом, процессор – это автомат, управляемый микрокодом (сравните с механическим пианино, о котором мы говорили ранее). Логика управления реализуется не в виде электронной схемы, а в виде хранимых в ПЗУ микрокоманд (предписаний).
Если вы смотрели старые фильмы, то, возможно, видели, как на старинных телефонных станциях операторы коммутировали абонентов с помощью штекеров между собой. Микропрограммирование до определенной степени напоминает эту коммутацию, только вместо операторов-барышень используются специальные микросхемы, выделяющие изинструкций, подлежащих исполнению, всю необходимую информацию (код, операнды, режимы адресации и проч.).
Каждой обычной операции процессора (такой, например, как сложение двух чисел, сдвиг, очистка ячейки памяти, переход и т.д.) соответствует определенная комбинация сигналов, передаваемых в процессор по линиям управления.
Сами микрокоманды выглядят весьма непривычно. Их большая часть – это указания о том, как нужно соединить или разорвать соединение тех или иных частей электронной схемы процессора, пересылка данных, запись констант и логические операции. Это и неудивительно, т.к., скажем, операция передачи управления по условию (условный переход) требует прежде всего анализа состояний определенных внутренних регистров и только потом присвоения счетчику команд определенного значения – адреса перехода.
Каждому из этих управляющих сигналов соответствует определенная последовательность двоичных разрядов (микрокоманда). Каждый из разрядов в микрокоманде может быть 0или 1. Их комбинации управляют схемами внутри процессора. Эти схемы внутри процессора и образуют те самые базовые (элементарные) операции, о которых мы говорили ранее. Все операции выборки микрокоманды, передачи управляющих сигналов в процессор, работа схем процессора строго синхронизированы, но это уже область компетенции специалистов по электронике.
Набор микрокоманд образует микропрограмму. Итак, микропрограмма, состоящая из микрокоманд, эмулирует на «железе» процессора операции, составляющие его систему команд.
Довольно долгое время после того, как М.Уилкс обосновал и ввел в практику микропрограммирование, последнее рассматривалось как теоретически интересный, но практически мало осуществимый способ построения компьютеров. Основная причина – недостаточный уровень элементной базы тех лет.
Но к началу 60-х годов прошлого века ситуация кардинально изменилась: транзисторы стали так дешевы и надежны, что появилась возможность полной перестройки элементной базы компьютеров (т.н. третье поколение компьютеров). Корпорация IBM приняла решение о создании новой линейки программно-совместимых (от младших моделей к старшим) компьютеров – той самой IBM-360. И вот тут микропрограммирование оказалось решающим фактором. Хотя отдельные модели линейки имели отличающиеся центральные процессоры, все они были способны исполнять один и тот же набор операций.
Эта совместимость различных процессоров была достигнута именно благодаря микропрограммированию, и с тех пор (т.е. уже более 50 лет) история развития процессоров – этоистория микрокодов.
Библиография
Как я уже говорил, микропрограммирование – весьма сложное направление, и желательно понимание схемотехники компьютеров. Для начинающих имеется прекрасный учебный курс:
Р.Токхейм. Основы цифровой электроники. – М.: «Мир», 1988, включающий не только теоретический материал, но и ряд лабораторных работ, выполнив которые вы определенно будете понимать процессы, происходящие в электрических цепях компьютера. На русском языке имеется несколько книг, специально посвященных микропрограммированию. Они изданы довольно давно, но это нисколько не снижает их ценности:
Г.Булей. Микропрограммирование. – М.: «Мир», 1973. Обзорный курс для начинающих.
Я.Чу. Организация ЭВМ и микропрограммирование. – М.: «Мир», 1975. Весьма громоздкое, но фундаментальное руководство, в котором описаны все аспекты микропрограммирования и архитектуры компьютеров. Много примеров и упражнений.
Кроме того, я рекомендую прочесть популярную статью Д.Паттерсона «Микропрограммирование», опубликованную в пятом выпуске журнала «В мире науки» за 1983 год (русскоязычное издание журнала Scientific American).
Чтобы ощутить атмосферу первых лет программирования, обратите внимание на интереснейшую книгу одного из первых отечественных первопроходцев: А.С.Кронрод. Беседы опрограммировании. – М.: УРРС, 2004.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|