Металингвистические формулы заложены в трансляторы; с их помощью ведется проверка используемых программистом конструкций на формальное соответствие какой-нибудь из конструкций, синтаксически допустимых в этом языке (синтаксический контроль).
Пользуясь средствами форм Бэкуса – Наура и синтаксическими диаграммами, опишем грамматику языков программирования.
Алфавиты большинства языков программирования близки друг другу и основываются на буквах латинского алфавита, арабских цифрах и общепринятых специальных символах, таких как знаки препинания, математических операций, сравнений и обозначений. Большинство популярных языков программирования в алфавите содержат следующие элементы:
< буква > : : = A | a | B | b | C | c | D | d | E | e | и т. д.
< цифра > : : = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
< знак арифметической операции > : : = + | - | * | /
< разделитель > : : = . | , | : | ; | ( | ) | [ | ] | { | } | ‘
< символ отношения > : : = < | > | = | <= | >= | <>
< служебное слово > : := begin | end | if | then | else | for и т.д.
< основной символ > : : = < буква > | < цифра >|< спецсимвол >
< комментарий > : : ={ любая последовательность символов }.
Несмотря на существенные различия между языками программирования, ряд фундаментальных понятий в большинстве из них схожи.
Оператор – одно из главных понятий всех языков программирования. Каждый оператор – это законченная фраза языка, однозначно определяющая некоторое действие над данными. В соответствии с теорией алгоритмов выделяют основные (базовые) операторы языка:
– присваивания;
– условного и безусловного перехода;
– пустой оператор.
К производным операторам относят:
– составной оператор;
– оператор выбора;
– оператор цикла;
– оператор присоединения.
Все операторы в тексте программы отделяются друг от друга явными или неявными разделителями, например: s1; s2; . . . ; sn.
Операторы выполняются в порядке их следования в тексте программы. Этот естественный порядок может быть изменен с помощью операторов перехода.
Большая часть операторов ведет обработку величин. Величины могут быть постоянными (constant) и переменными (variable). Значения постоянных величин не меняются в процессе выполнения программы. Величина характеризуется типом, именем и значением. Наиболее распространенные типы величин – числовые (целые и вещественные), символьные, логические. Тип величины определяется ее значением.
Другая важная классификация величин – простые и составные. Простая величина имеет одно значение. Ей соответствует одна ячейка памяти (точнее, «машинное слово») или ее эквивалент во внешней памяти компьютера. Составной величине может соответствовать сразу много значений, объединенных под одним именем. Эти значения представляют собой элементы (компоненты) этой величины. Самый известный пример – массив, у которого элементы различаются по индексам (номерам).
Вопрос о выборе и описании структур данных – входных, выходных и промежуточных – не менее важен для успеха решения прикладной задачи, чем вопрос о правильности последовательности операторов программы.
Важнейшие характеристики структурированной величины – упорядоченность, однородность, способ доступа к элементам, постоянство числа элементов. Так, массив является упорядоченной однородной структурой с прямым доступом к элементам и постоянным их количеством.
Всем объектам данных в языках программирования даются индивидуальные имена. Имя программного объекта называют идентификатором – это любая конечная последовательность букв и цифр, начинающаяся с буквы:
< идентификатор > : : = < буква >
< идентификатор > : : = < идентификатор > ( < буква >| < цифра > )
В качестве идентификатора запрещается использовать служебные слова. Имена (идентификаторы) выбираются по усмотрению программиста. Следует избегать маловыразительных обозначений, а также очень кратких имен, так как они должны быть понятны, наглядны, отражать суть обозначаемого объекта. Например,
Summa, Max, Time, i, j, Radius.
Некоторым идентификаторам заранее предписан определенный смысл и их называют стандартными, например, sin, cos, ln – это имена известных математических функций.
Описания объектов данных связаны с правилами обработки данных.
Для каждого данного необходимо определить его свойства. Например, если в качестве данных выступает массив, следует задать его размерность, границы изменения индексов, тип элементов массива. Описательная (декларативная) часть программы является необходимой как для системных программистов – разработчиков трансляторов, которые должны, в частности, проводить синтаксическую и семантическую диагностику программ, так и для «прикладного» программиста, которому объявления объектов данных облегчают процесс разработки и отладки программ.
Особый интерес в языках программирования представляют описания нестандартных структур данных, таких как запись, файл, объект, список, дерево и т.п.
Приведем список наиболее употребительных обозначений типов данных, используемых в описаниях:
Целый – Integer
Вещественный – Real
Логический – Boolean
Символьный – Char
Строковый – String
Массив – Array
Множество – Set
Файл – File
Запись – Record
Объект – Object
Переменные играют важнейшую роль в системах программирования. Понятие «переменная» в алгоритмических языках отличается от общепринятого в математике. В информатике переменная – это программный объект, способный принимать некоторое значение с помощью оператора присваивания. В процессе выполнения программы значения переменных могут изменяться. Синтаксически переменная представляется своим идентификатором (именем).
Семантический смысл переменной заключается в хранении некоторого значения, соответствующего её типу, а также в выполнении с ней операций пересылки в неё и извлечения из неё этого значения.
Функция – программный объект, задающий вычислительную процедуру определения значения, зависимого от некоторых аргументов. В каждом языке высокого уровня имеется библиотека стандартных функций: арифметических, логических, символьных, файловых и т. п. Функции – стандартные и созданные программистом – могут использоваться в составе выражений.
Выражения конструируются из постоянных величин, имен переменных, функций, скобок, знаков операций и т.д. Выражение имеет определенный тип, определяемый типом значений, получаемых в результате его вычисления. Выражения могут быть арифметическими, логическими, символьными, строковыми и т.д.
Процедура – программный объект, представляющий некоторый самостоятельный этап обработки данных. При своём описании процедура имеет входные и выходные параметры, называемые формальными. Формальные параметры, получившие при использовании процедуры конкретные значения, становятся фактическими.
Модуль (Unit) – это специальная программная единица, предназначенная для создания библиотек и разделения больших программ на логически связанные блоки. По сути, модуль – набор констант, типов данных, переменных, процедур и функций. В состав модуля входят разделы: заголовок, интерфейс, реализация, инициализация.
Заголовок необходим для ссылок на модуль.
Интерфейс содержит объявления, включая процедуры и функции.
Раздел реализации содержит тела процедур и функций, перечисленных в интерфейсной части.
Раздел инициализации содержит операторы, необходимые для инициализации модуля.
Каждый модуль компилируется отдельно, а каждый элемент модуля можно использовать в программе без дополнительного объявления.
Контрольные вопросы и упражнения
1. Какие преимущества имеют ЯВУ по сравнению с машинно–ориентированными языками? Какие достоинства есть у машинно–ориентированных языков?
2. Каковы основные составляющие ЯВУ?
3. В чем отличие понятий языков программирования и естественного языка?
4. С какой целью используются и что представляют собой металингвистические формулы Бэкуса – Наура?
5. Что представляет собой синтаксическая диаграмма Вирта?
6. В чем различие между постоянными и переменными величинами?
7. В чем отличие между величинами простыми и структурированными?
8. Для чего служит описание величин в программе? Какие стандартные типы данных используют ЯВУ?
9. Для чего служат операторы?
10. В чем состоит назначение функций? процедур? модулей?
11. Кому больше нужны БНФ и диаграммы Вирта: прикладным программистам или разработчикам компиляторов?
Язык Паскаль был создан Н. Виртом в 1971 г. как язык обучения программированию и записи алгоритмов. Паскаль стал первым языком, с которым знакомится большинство будущих программистов в мире. Он оказался настолько удачным, что до сих пор играет особую роль и в практическом программировании, и в его изучении. В нем реализованы принципы структурного программирования и полного описания данных, повышающие устойчивость программного кода, позволяющие найти и устранить большинство ошибок ещё на стадии трансляции программы.
Трансляторы для программ, написанных на Паскале, разработаны для различных компьютеров и в настоящее время имеют множество разновидностей. Существует много версий языка Паскаль, различие которых между собой весьма велико. Базовая версия языка, созданная Н. Виртом, в более поздних версиях существенно расширена и дополнена, что позволило из языка обучения получить эффективный инструмент для профессиональных разработчиков программного обеспечения.
Тем не менее, это версии одного языка, что подтверждается, в частности, их совместимостью «сверху вниз», то есть любая программа, написанная на «младшей» версии языка, останется работоспособной и при переходе к «старшей» версии (преемственность версий). Приведенные далее тексты программ и примеры соответствуют практически всем версиям Паскаля.
Любая программа на Паскале является текстовым файлом с собственным именем и расширением .pas. Схематически программа представляется в виде последовательности восьми разделов:
заголовок программы;
описание внешних модулей, процедур и функций;
описание меток;
описание констант;
описание типов переменных;
описание переменных;
описание функций и процедур;
раздел операторов.
Разумеется, не в каждой программе обязательно присутствуют все восемь разделов, в простейших программах, например, могут быть только 5-й и 8-й разделы.
Каждый раздел начинается со служебного слова, назначение которого зафиксировано в Паскале и его нельзя употреблять для других целей (таблица).
Таблица
Список зарезервированных слов языка Паскаль
в версии для персонального компьютера (ПК)
Написание слова |
Значение слова |
|
Написание слова |
Значение слова |
аbsolute |
абсолютный |
label |
метка |
|
and |
логическое И |
library |
библиотека |
|
array |
массив |
mod |
остаток от деления |
|
asm |
ассемблер |
nil |
отсутствие |
|
begin |
начало блока |
not |
логическое НЕ |
|
case |
вариант |
or |
логическое ИЛИ |
|
const |
константа |
of |
из |
|
constructor |
конструктор |
оbject |
объект |
|
div |
деление нацело |
packed |
упакованный |
|
do |
выполнять |
procedure |
процедура |
|
downto |
уменьшить до |
program |
программа |
|
destructor |
разрушитель |
record |
запись |
|
else |
иначе |
repeat |
повторять |
|
end |
конец блока |
set |
множество |
|
exports |
экспорт |
string |
строка |
|
external |
внешний |
then |
то (тогда) |
|
file |
файл |
to |
увеличить до |
|
for |
для |
type |
тип |
|
forward |
опережающий |
unit |
модуль |
|
function |
функция |
until |
до |
|
goto |
переход на |
uses |
использовать |
|
implementation |
реализация |
var |
переменная |
|
in |
в (входить в …) |
while |
пока |
|
inline |
основной |
with |
c |
|
interrupt |
прерывание |
xor |
исключающее ИЛИ |