Поколения языков программирования

Машинный язык

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

Мнемокод

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

· Вместо двоичной записи операций использовать их обозначения, например, ADD для операции сложения, MOV - для операции пересылки и т.п.[1]

· Вместо номеров команд и ячеек данных использовать их мнемоничные имена.

Пример небольшой программы, использующей мнемокод

.MODEL SMALL

      .DATA

b    DW 5

c    DW 3

a    DW?

     .CODE

begin MOV AX,@DATA

     MOV DS,AX

     MOV AX,B

     ADD AX,C

     MOV A,AX

     MOV AH,4CH

     INT  21H

     END begin

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

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

Макро-ассемблер

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

Такие именованные последовательности называются макроопределениями или кратко макросами. Сама последовательность называется телом макроса, а изменяемые части макроса, называемые формальными параметрами макроса, либо нумеруются, либо именуются, чтобы различать их между собой. Естественно, что именование предпочтительнее нумерации с точки зрения понимаемости. Один и тот же формальный параметр может многократно использоваться в теле макроса - вместо всех использований будет подставляться один и тот же текст. Макроопределение может выглядеть, например, так:

MI MACRO C1,C2,CP,MP

MOV ax,C1 

MUL C2

MOV CP,dx

MOV MP,ax

ENDM

Здесь MI – имя макроса, C1, C2, CP, MP – имена параметров, а тело макроса состоит из четырёх команд: вплоть до команды ENDM, означающей конец макроса.

Место, где макрос используется, называется вызовом макроса,  а те фрагменты, которые следует подставить вместо вхождений формальных параметров, - фактическими параметрами. Например, два вызова макроса MI могут выглядеть как

MI DI,A,S1,S2

MI S,2,DI,SI

В первом вызове вместо формального параметра C1 подставляется текст DI, вместо С2 – A, вместо CP – S1, вместо MP – S2, а во втором вызове – вместо C1 – S, вместо С2 – 2, вместо CP – DI, вместо MP – SI. Если мы подставим тело макроса в место вызова, произведя замену формальных параметров на фактические, то мы получим последовательность из восьми команд:

MOV ax, DI

MUL A

MOV S1,dx

MOV S2,ax

MOV ax, S

MUL 2

MOV DI,dx

MOV SI,ax

Налицо существенное сокращение записи. Отметим, что макросредства задают по существу преобразование текста программы: выполнив все подстановки вызовов макросов, мы получим текст программы на мнемокоде, которая уже напрямую транслируется в машинную программу. Более того, работа макропроцессора – программы, осуществляющей преобразование программы с макро-определениями – не зависит от того, что именно записано в теле функции – мнемокод или любой другой текст. Для неё существенно только то, как оформляются макроопределения и вызовы макросов.

Отметим ещё несколько непосредственных следствий введения макросов:

· Мы можем изменять тело макроса, не меняя все его вызовы до тех пор, пока имя макроса и набор формальных параметров не изменились. Например, если макрос реализует вычисление корней квадратного уравнения по заданным коэффициентам, то мы можем улучшать эту реализацию, изменяя только тело макроса, и при этом это улучшение будет «автоматически» происходить во всех вызовах.

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

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

· Одни и те же макросы можно использовать при написании разных программ. Это открывает возможность создания библиотек макросов: не обязательно каждый раз выписывать все используемые макроопределения непосредственно в тексте программы. Можно собрать некоторый содержательный набор макросов в отдельном файле-библиотеке, а макропроцессору указать (например, специальной директивой в тексте программы) о необходимости использования этой библиотеки. Далее эта возможность способствует совместной разработке большой программной системы коллективом разработчиков.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: