Многоуровневая компьютерная организация

 

Цифровой компьютер — это машина, которая может решать задачи, выполняя данные ей команды. Последовательность команд, описывающих решение опре­деленной задачи, называется программой. Электронные схемы каждого компью­тера могут распознавать и выполнять ограниченный набор простых команд. Все программы перед выполнением должны быть превращены в последовательность таких команд, которые обычно не сложнее, чем, например:

♦ сложить 2 числа;

♦ проверить, не является ли число нулем;

♦ скопировать блок данных из одной части памяти компьютера в другую.

Эти примитивные команды в совокупности составляют язык, на котором лю­ди могут общаться с компьютером. Такой язык называется машинным. Разработ­чик при создании нового компьютера должен решить, какие команды включить в машинный язык этого компьютера. Это зависит от назначения компьютера и от задач, которые он должен решать. Обычно стараются сделать машинные ко­манды как можно проще, чтобы избежать сложностей при разработке компьюте­ра и снизить затраты на необходимую электронику. Большинство машинных языков крайне примитивны, из-за чего писать на них и трудно, и утомительно.

Это простое наблюдение с течением времени привело к построению ряда уровней абстракций, каждая из которых надстраивается над абстракцией более низкого уровня. Именно таким образом можно преодолеть сложности при обще­нии с компьютером. Мы называем этот подход многоуровневой компьютерной организацией. В следующем разделе мы поясним, что этот термин значит. Затем мы расскажем об истории развития проблемы и положении дел в настоящий мо­мент, а также рассмотрим некоторые важные примеры.

Как мы уже сказали, существует огромная разница между тем, что удобно лю­дям, и тем, что могут компьютеры. Люди хотят сделать X, но компьютеры могут сделать только Y. Из-за этого возникает проблема. Цель данной книги — объяс­нить, как решить эту проблему.

Языки, уровни и виртуальные машины

Вышеупомянутую проблему можно решить двумя способами. Оба способа подра­зумевают разработку новых команд, более удобных для человека, чем встроенные машинные команды. Эти новые команды в совокупности формируют язык, кото­рый мы будем называть Я 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 — освободить программи­ста от бремени написания программ на языке, понятном компьютеру, но мало­приспособленном для человека. Однако ситуация не так безнадежна.

Очевидное решение проблемы — создание еще одного набора команд, кото­рые в большей степени, чем Я 1 ориентированы на человека и в меньшей степе­ни на компьютер. Этот третий набор команд также формирует язык, который мы будем называть Я 2, а соответствующую виртуальную машину — М 2. Человек может писать программы на языке Я 2, как будто виртуальная машина для рабо­ты с машинным языком Я 2 действительно существует. Такие программы могут либо транслироваться на язык Я 1, либо выполняться интерпретатором, напи­санным на языке Я 1.

Изобретение целого ряда языков, каждый из которых более удобен для чело­века, чем предыдущий, может продолжаться до тех пор, пока мы не дойдем до подходящего нам языка. Каждый такой язык использует своего предшественни­ка как основу, поэтому мы можем рассматривать компьютер в виде ряда уров­ней, изображенных на рис. 1.1. Язык, находящийся в самом низу иерархической структуры, — самый примитивный, а тот, что расположен на ее вершине — са­мый сложный.

clip_image002

Между языком и виртуальной машиной существует важная зависимость. Ка­ждая машина поддерживает какой-то определенный машинный язык, состоящий из всех команд, которые эта машина может выполнять. В сущности, машина определяет язык. Сходным образом язык определяет машину, которая может выполнять все программы, написанные на этом языке. Машину, определяемую тем или иным языком, очень сложно и дорого конструировать из электронных схем, однако представить себе такую машину мы можем. Компьютер для работы с машинным языком С или С++ был бы слишком сложным, но в принципе его можно разработать, учитывая высокий уровень современных технологий. Одна­ко существуют веские причины не создавать такой компьютер — это крайне не­эффективное, по сравнению с другими, решение. Действительно, технология должна быть не только осуществимой, но и рациональной.

Компьютер с п уровнями можно рассматривать как п разных виртуальных машин, у каждой из которых есть свой машинный язык. Термины «уровень» и «виртуальная машина» мы будем использовать как синонимы. Только про­граммы, написанные на Я 0, могут выполняться компьютером без трансляции или интерпретации. Программы, написанные на Я 1, Я 2, Я п, должны прохо­дить через интерпретатор более низкого уровня или транслироваться на язык, соответствующий более низкому уровню.

Человеку, который пишет программы для виртуальной машины уровня п, не обязательно знать о трансляторах и интерпретаторах более низких уровней. Ма­шина выполнит эти программы, и не важно, будут они поэтапно выполняться интерпретатором или же их обработает сама машина. В обоих случаях результат один и тот же — это выполнение программы.

Большинству программистов, использующих машину уровня п, интересен только самый верхний уровень, который меньше всего сходен с машинным язы­ком. Однако те, кто хочет понять, как в действительности работает компьютер, должны изучить все уровни. Также должны быть знакомы со всеми уровнями разработчики новых компьютеров или новых уровней (то есть новых виртуаль­ных машин). Понятия и технические приемы разработки машин как системы уровней, а также подробное описание этих самых уровней, составляют главный предмет данной книги.

Таненбаум Э. Архитектура компьютера. 5-е изд. (+CD). — СПб.: Питер, 2007. 844 с: ил.

Предлагаю ознакомиться с аналогичными статьями: