Главная » Basic » МАШИННЫЙ КОД И КОМПИЛЯТОРЫ

0

(При первом чтении этот раздел лучше пропустить)

Команды, которые способна распознать и  выполнить аппаратура ЭВМ, называются  машинными кодами. Они соответствуют элементарным действиям, на выполнение которых рассчитана машина, и представляются  ее  центральному  процессору  как  двоичные  данные,  состоящие  из  одного  или нескольких байтов. Каждый производитель разрабатывает собственную модель ЭВМ, и в результате многие модели имеют свои  уникальные  машинные  коды. В  левом столбце табл.  9.1  приведено несколько примеров машинных кодов для микропроцессора 8080 фирмы Intel.

Таблица 9.1. Примеры машинных кодов и кодов на языке ассемблера для микропроцессора Intel 8080

Машинный код в двоичном

виде

Код ассемблера

Интерпретация

Первый байт       Второй байт

0011  1110            1111  1111

1000 0110

MVI А,11111111 В

ADD M

Очищает аккумулятор   (называемый

А) и заносит в него двоичное значение 1111  1111, на что в языке ассемблера  указывает   буква В. Аккумулятор    содержит   восемь битов и  служит для выполнения арифметических и логических операций. Команда занимает два байта Добавляет содержимое ячейки памяти  (восемь битов) к значению, находящемуся  в   аккумуляторе. Адрес ячейки памяти находится в регистре по имени М. Команда занимает один байт

Таблица 9.1 (окончание) Машинный код в двоичном виде

Код ассемблера

Интерпретация

Первый байт Второй байт 1101

0011             0000 0001

]

OUT 00000001 В

Копирует находящееся в аккумуляторе    значение в    определенные выводящие проводники, называемые шиной данных. Число 0000

0001  определяет требуемое устройство вывода и выдается на набор проводников, называемый шиной адреса. После этого за выполнение вывода данных принимаются другие  компоненты ЭВМ. Команда занимает два байта

Как нетрудно видеть, машинный код очень трудно записать правильно, потому что при работе  с двоичными числами легко сделать ошибку. На самом деле для набора на клавиатуре двоичные числа можно записывать в гораздо более компактной форме — в виде шестнадцатеричных чисел, но это не снимает  всех  проблем,  связанных  с  программированием в  машинных  кодах.  Чтобы  исключить некоторые из этих проблем, придумано более простое представление команд, в  котором двоичные коды заменены мнемоническими, более легкими для чтения и запоминания.  Последние вместе с несколькими другими полезными средствами программирования образуют  то, что называется языком ассемблера. Центральный столбец табл. 9.1 иллюстрирует некоторые команды языка ассемблера. Благодаря  тесной  связи  между  языком  ассемблера  и  машинными  кодами  нетрудно  разработать программу, воспринимающую текст на языке ассемблера в качестве входных данных и выдающую машинные коды. Такая программа называется ассемблером. Она работает следующим образом: вопервых, должна быть  написана программа,  состоящая из  команд на  языке  ассемблера, которые вводятся  в  ЭВМ;  во-вторых,  ассемблер  проверяет  вводимые  данные  и  выполняет  трансляцию (перевод),  дающую  на  выходе  машинные  коды.  Наконец,  эти  машинные  коды  загружаются  в подходящую часть памяти ЭВМ и исполняются.

Хотя  на  языке  ассемблера  написано  много  программ,  программирование  на  нем  имеет   ряд недостатков:  программы  получаются  довольно  длинными,  их   разработка  требует   известного мастерства и тесно связана с особенностями функционирования аппаратной части конкретной ЭВМ. Например, для выполнения действий, описываемых Фрагментом программы на Бейсике

10   INPUT А,В

20   LETC=A*B

30   PRINT С

а  именно  для  перемножения  двух  чисел,  потребуется  по  меньшей  мере  100  команд  на  языке ассемблера для микропроцессора 8080 фирмы Intel.

Хотя при трансляции в машинные коды программы, написанной на языке высокого Уровня  типа Бейсика, действия компилятора аналогичны действиям ассемблера, тем не менее дистанция  между входными   языками   настолько   велика,   что   компилятор   оказывается   гораздо   более   сложной программой.

Существует много вариантов написания компилятора. Сущностью диалогового языка,  подобного Бейсику, является способность легкого редактирования программ, распечатывания программ по мере необходимости и исполнения программ по команде Все эти операции могут выполняться в любом порядке; обычно они многократно повторяются при разработке и модификации программы.

Один из подходов, называемый чистой компиляцией, состоит в преобразовании машинные  коды каждой  строки  программы на  Бейсике  по  мере  ее  получения.  По  окончанию ввода  программы результирующие машинные коды полностью готовы к исполнению. Однако для  выполнения такой построчной трансляции требуются большие таблицы и  списки, в  которых  хранятся сведения об исходных  именах  переменных  и  номерах  операторов,  позволяющие  компилятору  гарантировать выдачу полной программы. Например, вплоть до набора строки 510 должна храниться информация о том  что  ранее  была  введена  строка  10  GO  TO  510.  Предыдущие строки  соответственно могут изменяться или удаляться вплоть до завершения  программы. Этот подход обеспечивает создание машинных кодов, готовых к исполнению, но из-за требования, чтобы процесс компиляции проходил в режиме диалога, приходится занимать в памяти много места для хранения очень больших таблиц. Другой подход, называемый чистой  интерпретацией, состоит в хранении программы на Бейсике в том виде, в котором она была введена в ЭВМ, и в построчной трансляции программы в момент ее исполнения.   Таким    образом,    если   встретился   цикл,   то   его   операторы   будут   повторно транслироваться   при   каждом  проходе  цикла,  так  как  система  транслирует  каждый  очередной оператор и не  сохраняет полученные машинные коды (которые, скорее всего, и не образуются). В этом  случае   за  удобство  редактирования  и  распечатывания  введенной  программы  приходится расплачиваться очень малой скоростью исполнения. В то время как компиляторы могут проверить каждый оператор по мере его ввода и немедленно сообщить об ошибке, интерпретаторы могут делать это только во время исполнения программы, что является серьезным недостатком.

Поставляемые системы трансляции находятся где-то между двумя описанными выше системами. На рис. 9.2 показаны основные действия подобной системы, которая в литературе может  называться компилятором   или    интерпретатором.   В    ней    используются   некоторые   типы    внутреннего представления  программы,  обеспечивающего построчную  обработку  программы  на  Бейсике,  но содержащего много приготовлений, необходимых для последующего исполнения программы. Ниже показано несколько строк программы на Бейсике вместе с ее внутренним форматом, используемым в ЭВМ ICL 2904. Исходная программа имеет вид

10   REM ПРОСТОЙ ПРИМЕР

20   Р =3.14159

30   INPUT R

40   A=P*R*R

50   C=2.0*P*R

60   PRINT R,A,C

70   END а ее внутренняя форма такова:

К! ПРОСТОЙ ПРИМЕР Р’3.14159К =

L!R’ A’P’R’*R’*K= C’2.0P’*R’*K = P!R’,A’,C’!

E!

Рис. 9.2. Стадии процесса трансляции и исполнения программы

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

Компилятор состоит из нескольких различных частей. Первой и самой большой из них  является система трансляции операторов Бейсика во внутренний формат. Вторая вступает в действие, когда дана  команда  RUN,  и  приводит  в  порядок  ссылки  и  прочие  ‘недоделки",  оставленные  первой системой, работающей по принципу построчной обработки. Она называется системой подготовки к исполнению. Третьей частью является система времени исполнения, интерпретирующая внутренний формат  во  время  исполнения  программы.  Другие  части   компилятора  занимаются  обратным преобразованием внутреннего формата в  операторы  Бейсика при  выполнении команд  LIST  или SAVE,  интерпретацией  немедленно  исполняемых   операторов  Бейсика  и  выполнением  команд Бейсика. Таким образом, из простого транслятора  операторов Бейсика вырастает цельная система, обеспечивающая работу в режиме диалога.

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

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

Источник: Уолш Б.    Программирование на Бейсике: Пер. с англ. М.: Радио и связь, 1988. 336 с: ил.

По теме:

  • Комментарии