Учебное пособие -> Глава 3. Многоуровневая
компьютерная организация
Глава 3. Многоуровневая компьютерная организация
Языки, уровни и виртуальные машины
Для эффективной работы человека с компьютером необходимо
разработать какой-либо язык, на котором человеку было удобно задавать команды
для выполнения компьютеру.
Данную проблему можно решить двумя способами. Оба способа
подразумевают разработку новых команд, более удобных для человека, чем
встроенные машинные команды.
Новые команды в совокупности формируют язык, который
обозначим как Я1. Встроенные машинные команды тоже формируют язык, котороый
обозначим как Я0.
Компьютер может выполнять только программы, написанные на
его машинном языке Я0. Два способа решения проблемы различаются тем, каким
образом компьютер будет выполнять программы, написанные на языке Я1, так как
компьютеру доступен только машинный язык Я0.
Трансляция
Первый способ выполнения программы, написанной на языке Я
1, подразумевает замену каждой команды эквивалентным набором команд на языке Я
0. В этом случае компьютер выполняет новую программу, написанную на языке Я 0,
вместо старой программы, написанной на Я 1.
Интерпретация
Второй способ означает создание программы на языке Я0,
получающей в качестве входных данных программы, написанные на языке Я1. При этом
каждая команда языка Я1 обрабатывается поочередно, после чего сразу выполняется
эквивалентный ей набор команд языка Я0. Эта технология не требует составления
новой программы на Я0. Программа, которая осуществляет интерпретацию, называется
интерпретатором.
Общее:
-В обоих подходах компьютер в конечном итоге
выполняет набор команд на языке Я0, эквивалентных командам Я1.
Различие:
-При трансляции вся программа Я1 переделывается в
программу Я0, программа Я1 отбрасывается, а новая программа на Я0 загружается в
память компьютера и затем выполняется.
-При интерпретации каждая команда программы на Я 1
перекодируется в Я 0 и сразу же выполняется. В отличие от трансляции, здесь не
создается новая программа на Я 0, а происходит последовательная перекодировка и
выполнение команд. С точки зрения интерпретатора, программа на Я 1 есть не что
иное, как «сырые» входные данные.
Оба подхода широко используются как вместе, так и по
отдельности.
Построим гипотетический компьютера или виртуальную машину,
для которой машинным языком является язык Я1. Назовем такую виртуальную машину
М1, а виртуальную машину для работы с языком Я0 — М0. Если бы такую машину М1
можно было бы сконструировать без больших денежных затрат, язык Я0, да и машина,
которая выполняет программы на языке Я0, были бы не нужны. Можно было бы просто
писать программы на языке Я1, а компьютер сразу бы их выполнял.
Даже с учетом того, что создать виртуальную машину,
возможно, не удастся, люди вполне могут писать ориентированные на нее программы.
Эти программы будут транслироваться или интерпретироваться программой,
написанной на языке Я0, а сама она могла бы выполняться существующим
компьютером. Другими словами, можно писать программы для виртуальных машин так,
как будто эти машины реально существуют.
Трансляция и интерпретация целесообразны лишь в том случае,
если языки Я0 и Я1 не слишком отличаются друг от друга. Это значит, что язык Я1
хотя и лучше, чем Я 0, но все же далек от идеала.
Решение проблемы — создание еще одного набора команд,
которые в большей степени, чем Я 1 ориентированы на человека и в меньшей степени
на компьютер. Этот третий набор команд также формирует язык, который обозначим
как Я 2, а соответствующую виртуальную машину - М2.
Человек может писать программы на языке Я 2, как будто
виртуальная машина для работы с машинным языком Я 2 действительно существует.
Такие программы могут либо транслироваться на язык Я 1, либо выполняться
интерпретатором, написанным на языке Я 1.
Рисунок 1 - Многоуровневая машина
Изобретение целого ряда языков, каждый из которых более
удобен для человека, чем предыдущий, может продолжаться до тех пор, пока не
будет получен подходящий язык. Каждый такой язык использует своего
предшественника как основу, поэтому можно рассматривать компьютер в виде ряда
уровней.
Язык, находящийся в самом низу иерархической структуры, —
самый примитивный, а тот, что расположен на ее вершине — самый сложный.
Современные многоуровневые машины
Большинство современных компьютеров состоит
из двух и более уровней.
Рисунок 2 - Шестиуровневый компьютер
Уровень 0 — это аппаратное обеспечение машины.
Электронные схемы на уровне 1 выполняют машинно-зависимые
программы.
Следующий уровень (2-й) называется уровнем
микроархитектуры. На этом уровне находятся совокупности 8 или 32 регистров,
которые формируют локальную память и схему, называемую АЛУ
(арифметико-логическое устройство). АЛУ выполняет простые арифметические
операции. Регистры вместе с АЛУ формируют тракт данных, по которому поступают
данные.
При построении уровня 3 возможно больше вариантов, чем при
построении уровней 1 и 2. Новые средства, появившиеся на уровне 3, выполняются
интерпретатором, который работает на втором уровне. Этот интерпретатор был
когда-то назван операционной системой. Команды уровня 3, идентичные командам
уровня 2, выполняются микропрограммой или аппаратным обеспечением, но не
операционной системой. Другими словами, одна часть команд уровня 3
интерпретируется операционной системой, а другая часть — микропрограммой.
Поэтому этот уровень считается гибридным. Обозначим этот уровень уровнем
операционной системы.
Между уровнями 3 и 4 есть существенная разница. Нижние три
уровня задуманы не для того, чтобы с ними работал обычный программист. Они
изначально ориентированы на интерпретаторы и трансляторы, поддерживающие более
высокие уровни. Эти трансляторы и интерпретаторы составляются так называемыми
системными программистами, которые специализируются на разработке новых
виртуальных машин. Уровни с четвертого и выше предназначены для прикладных
программистов, решающих конкретные задачи.
Еще одно изменение, появившееся на уровне 4, — механизм
поддержки более высоких уровней. Уровни 2 и 3 обычно интерпретируются, а уровни
4, 5 и выше обычно транслируются.
Другое отличие между уровнями 1, 2, 3 и уровнями 4, 5 и
выше — особенность языка. Машинные языки уровней 1, 2 и 3 — цифровые. Программы,
написанные на этих языках, состоят из длинных рядов цифр, которые воспринимаются
компьютерами, но малопонятны для людей. Начиная с уровня 4, языки содержат слова
и сокращения, понятные человеку.
Уровень 4 представляет собой символическую форму одного из
языков более низкого уровня. На этом уровне можно писать программы в приемлемой
для человека форме. Эти программы сначала транслируются на язык уровня 1, 2 или
3, а затем интерпретируются соответствующей виртуальной или фактически
существующей машиной. Программа, которая выполняет трансляцию, называется
ассемблером.
Уровень 5 обычно состоит из языков, разработанных для
прикладных программистов. Такие языки называются языками высокого уровня.
Существуют сотни языков высокого уровня. Наиболее известные среди них — С, C++,
Java, LISP и Prolog. Программы, написанные на этих языках, обычно транслируются
на уровень 3 или 4. Трансляторы, которые обрабатывают эти программы, называются
компиляторами. Отметим, что иногда также имеет место интерпретация.
Например, программы на языке Java сначала транслируются на
язык, напоминающий ISA и называемый байт-кодом Java, который затем
интерпретируется.
В некоторых случаях уровень 5 состоит из интерпретатора для
конкретной прикладной области, например символической логики. Он предусматривает
данные и операции для решения задач в этой области, выраженные при помощи
специальной терминологии.
Таким образом, компьютер проектируется как иерархическая
структура уровней, которые надстраиваются друг над другом. Каждый уровень
представляет собой определенную абстракцию различных объектов и операций.
Рассматривая компьютер подобным образом, можно не принимать
во внимание ненужные детали и, таким образом, сделать сложный предмет более
простым для понимания.
Набор типов данных, операций и характеристик каждого
отдельно взятого уровня называется архитектурой. Архитектура связана с
программными аспектами. Например, сведения о том, сколько памяти можно
использовать при написании программы, — часть архитектуры. Аспекты реализации
(например, технология, применяемая при реализации памяти) не являются частью
архитектуры. На практике термины «компьютерная архитектура» и «компьютерная
организация» употребляются как синонимы.
Развитие многоуровневых машин
Программы, написанные на машинном языке (уровень 1), могут
сразу без применения интерпретаторов и трансляторов выполняться электронными
схемами компьютера (уровень 0). Эти электронные схемы вместе с памятью и
средствами ввода-вывода формируют аппаратное обеспечение.
Аппаратное обеспечение состоит из осязаемых объектов —
интегральных схем, печатных плат, кабелей, источников электропитания, модулей
памяти и принтеров. Понятия, алгоритмы и команды к аппаратному обеспечению не
относятся.
Программное обеспечение, напротив, состоит из алгоритмов
(подробных последовательностей команд, которые описывают, как решить задачу) и
их компьютерных представлений, то есть программ. Программы могут храниться на
жестком диске, гибком диске, компакт-диске или других носителях.
Программное обеспечение — это набор команд, составляющих
программы, а не физические носители, на которых эти программы записаны.
В самых первых компьютерах граница между аппаратным и
программным обеспечением была очевидна. Со временем, однако, произошло
значительное размывание этой границы, в первую очередь благодаря тому, что в
процессе развития компьютеров уровни добавлялись, убирались и сливались друг с
другом. В настоящее время очень сложно отделить их друг от друга.
Аппаратное и
программное обеспечение логически эквивалентны
Любая операция, выполняемая программным обеспечением, может
быть реализована аппаратным обеспечением.
Любая команда, выполняемая аппаратным обеспечением, может
быть смоделирована программно.
Решение разделить функции аппаратного и программного
обеспечения основано на таких факторах, как стоимость, быстродействие,
надежность, частота ожидаемых изменений.
Существует несколько жестких правил, сводящихся к тому, что
операция X должна быть реализована в аппаратном обеспечении, а операцию
Y нужно
программировать. Эти решения меняются в зависимости от тенденций экономического
и технологического развития.
Изобретение
микропрограммирования
У первых цифровых компьютеров в 40-х годах было только два
уровня:
-уровень архитектуры набора команд, на котором
осуществлялось программирование,
Схемы цифрового логического уровня были ненадежны, сложны
для производства и понимания. В 1951 году Морис Уилкс предложил идею разработки
трехуровневого компьютера, призванную упростить аппаратное обеспечение.
Предлагаемая машина должна была иметь встроенный неизменяемый интерпретатор
(микропрограмму), функция которого заключалась в выполнении программ уровня ISA
посредством интерпретации. Так как аппаратное обеспечение должно было теперь
вместо программ уровня ISA выполнять только микропрограммы с ограниченным
набором команд, требовалось меньшее количество электронных схем. Поскольку
электронные схемы тогда делались из электронных ламп, данное упрощение призвано
было сократить количество ламп и, следовательно, повысить надежность (которая в
то время выражалась числом поломок за день).
В 50-е годы было построено несколько трехуровневых машин.
В 60-х годах число таких машин значительно увеличилось.
К 70-м годам идея о том, что написанная программа сначала
должна интерпретироваться микропрограммой, а не выполняться непосредственно
электроникой, стала преобладающей.
Изобретение
операционной системы
В времена появления первых компьютеров принципы работы с
ними сильно отличались от современных.
Одним компьютером пользовалось большое количество людей.
Рядом с машиной лежал листок бумаги, и если программист хотел запустить свою
программу, он записывался на какое-то определенное время. В назначенное время
программист направлялся в комнату, где стояла машина, с пачкой перфокарт
(которые тогда служили средством ввода). Каждая перфокарта содержала 80 колонок;
на ней в определенных местах пробивались отверстия. Если он хотел запустить
программу на языке FORTRAN, ему необходимо было пройти следующие этапы:
1. Брал стопку перфокарт с надписью «Компилятор FORTRAN»,
помещал их в считывающее устройство и нажимал кнопку «Пуск».
2. Он помещал стопку карточек со своей программой,
написанной на языке FORTRAN, в считывающее устройство и нажимал кнопку
«Продолжить». Программа считывалась.
3. Когда компьютер прекращал работу, программист считывал
свою программу во второй раз. Некоторые компиляторы требовали только одного
считывания перфокарт, но в большинстве случаев необходимо было выполнять эту
процедуру несколько раз. Каждый раз требовалось считать большую стопку
перфокарт.
4. В конце концов трансляция завершалась. Если ошибок не
было, компилятор выдавал в виде перфокарт программу на машинном языке.
5. Тогда программист помещал эту программу на машинном
языке в устройство считывания вместе с пачкой перфокарт из библиотеки
подпрограмм и загружал обе эти программы.
6. Начиналось выполнение программы. В случае неудачи
программист делал распечатку содержания памяти, что называлось разгрузкой
оперативного запоминающего устройства, и брал эту распечатку домой для изучения.
Эта процедура была обычной на протяжении многих лет.
Программистам приходилось учиться, как работать с машиной и что нужно делать,
если она выходила из строя, а происходило это довольно часто. Машина постоянно
стаивала без работы, пока люди носили перфокарты по комнате или ломали головы
над тем, почему программа не работает.
В 60-е годы человек попытался ускорить дело,
автоматизировав работу оператора. Программа под названием операционная система
загружалась в компьютер на все время его работы. Программист приносил пачку
перфокарт со специализированной программой, которая выполнялась операционной
системой.
Операционная система была придумана для того, чтобы
автоматизировать работу оператора (отсюда и название), но это — не единственное
ее преимущество.