Читать «Архитектура компьютера» онлайн - страница 60

Эндрю Таненбаум

PC=starting_address;

while (run_bit) {

instr=memory[PC]; // Вызывает следующую команду в instr

PC=PC+1; // Увеличивает значение счетчика команд

instr_type=get_instr_type(instr); // Определяет тип команды data_loc=find_data(instr, instr_type); // Находит данные (-1, // если данных нет)

if(data_loc>=0) // Если data_loc=-1, значит, операнда нет data=memory[data_loc]; // Вызов данных

execute(instr_type,data); // Выполнение команды

}

}

private static int get_instr_type(int addr) {...}

private static int find_data(int instr, int type) {...}

private static void execute(int type, int data) {...}

}

Сам факт того, что можно написать программу, имитирующую работу центрального процессора, показывает, что программа не обязательно должна выполняться реальным процессором (устройством). Напротив, вызывать из памяти, определять тип команд и выполнять эти команды может другая программа. Такая программа называется интерпретатором. Об интерпретаторах мы говорили в главе 1.

Эквивалентность аппаратных процессоров и интерпретаторов имеет важные последствия для организации компьютера и проектирования компьютерных систем. После того как разработчик выбрал машинный язык (Я) для нового компьютера, он должен решить, разрабатывать ли ему процессор, который будет выполнять программы на языке Я, или написать специальную программу для интерпретации программ на том же языке. Если он решит написать интерпретатор, ему потребуется разработать аппаратное обеспечение для исполнения этого интерпретатора. Возможны также гибридные конструкции, когда часть команд выполняется аппаратным обеспечением, а часть интерпретируется.

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

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