Языки моделирования и описания цифровой аппаратуры, страница 2

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

Основной синтаксической единицей языка является предложение. В естественных языках разделителем предложений служит точка «.», а в языках программирования эту роль чаще всего исполняет символ «;» - точка с запятой.

Раздел грамматики, изучающий структуру предложения (то есть его состав и связи), а также определяющий правила построения предложений из отдельных слов, называется синтаксисом.

Кроме грамматических правил язык характеризуется семантическими правилами истолкования (интерпретации) отдельных конструкций языка. Семантика – это смысловая сторона единиц языка.

Грамматически правильно построенное предложение не имеет никакой ценности, если вы не в состоянии извлечь из него никакой информации, никакого смысла. В качестве примера можно привести созерцание текста на незнакомом вам языке.

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

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

Рассмотрим кратко основные разновидности языков программирования (рис.1).

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

Чтобы хоть как-то облегчить работу, некоторые программисты машин первого поколения начали использовать сокращённый метод записи команд с помощью восьмеричной системы счисления. Как вспоминает звезда программирования того времени Грейс Хоппер, - все были убеждены, что это единственный способ писать эффективные программы.

Немного позже (в 1949 году) Морис Уилкс заменил двоичные коды команд символическими. Так как при этом использовалась ещё и библиотека подпрограмм, а также настройка адресов по месту размещения программы в памяти, то такую программу он назвал «собирающей» (от англ. assembly system). Эта разработка ввела в обиход машинно-зависимые языки, называемые теперь ассемблером (уровень 1).

Мнемокоды недалеко ушли от машинного языка. Символические аналоги двоичных кодов фактически повторяли структуру машинной команды, поэтому перевод их в двоичный эквивалент выполняется по правилу «один в один».

Макроязыки, наряду с символическими аналогами машинных команд, из которых состоит мнемокод, допускают также использование макрокоманд, не имеющих прямых аналогов в машинном языке (уровень 2). При трансляции каждая макрокоманда заменяется группой команд машинного языка по правилу «один в несколько». Макроязыки имеют и другие названия – автокоды или


макроассемблеры.

Рис.1. Классификация языков программирования

Первый машинно-независимый язык появился в 1957 году. Он был разработан Джоном Бэкусом из фирмы IBM в 1957 году. С него берут начало языки, называемые теперь процедурно-ориентированными (уровень 3). Название объясняется тем, что такие языки предназначены для описания алгоритмов (процедур) решения задач.

Процедурно-ориентированные языки относятся к языкам высокого уровня, пословный перевод здесь невозможен, поэтому трансляция в машинный код выполняется по правилу «несколько в несколько».