ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 31.03.2021
Просмотров: 6798
Скачиваний: 51
211
Контрольные вопросы
1. Какие события и когда стали толчком для начала работ по программированию?
2. Каковы основные вехи на пути развития программирования?
3. Какие основные направления существуют в современном программировании?
§2. ЯЗЫКИ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ
2.1. ПОНЯТИЕ О ЯЗЫКАХ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ
Языки программирования - это формальные языки специально созданные для общения че-
ловека с компьютером. Каждый язык программирования, равно как и «естественный» язык (рус-
ский, английский и т.д.), имеет алфавит, словарный запас, свои грамматику и синтаксис, а также
семантику.
Алфавит
- фиксированный для данного языка набор основных символов, допускаемых для
составления текста программы на этом языке.
Синтаксис
- система правил, определяющих допустимые конструкции языка программи-
рования из букв алфавита.
Семантика
- система правил однозначного толкования отдельных языковых
конструкций,
позволяющих воспроизвести процесс обработки данных.
При описании языка и его применении используют понятия языка.
Понятие
подразумевает
некоторую синтаксическую конструкцию и определяемые ею свойства программных объектов или
процесса обработки данных.
Взаимодействие синтаксических и семантических правил определяют те или иные понятия
языка, например, операторы, идентификаторы, переменные, функции и процедуры, модули и т.д.
В отличие от естественных языков правила грамматики и семантики для языков программирова-
ния, как и для всех формальных языков, должны быть явно, однозначно и четко сформулированы.
Языки программирования, имитирующие естественные языки, обладающие укрупненными
командами, ориентированными на решение прикладных содержательных задач, называют языка-
ми «высокого уровня». В настоящее время насчитывается несколько сотен таких языков, а если
считать и их диалекты, то это число возрастет до нескольких тысяч. Языки программирования вы-
сокого уровня существенно отличаются от машинно-ориентированных (низкого уровня) языков.
Во-первых, машинная программа в конечном счете записывается с помощью лишь двух символов
0 и 1. Во-вторых, каждая ЭВМ имеет ограниченный набор машинных операций, ориентированных
на структуру процессора. Как правило, этот набор состоит из сравнительно небольшого числа
простейших операций, типа: переслать число в ячейку; считать число из ячейки; увеличить содер-
жимое ячейки на +1 и т.п. Команда на машинном языке содержит очень ограниченный объем ин-
формации, поэтому она обычно определяет простейший обмен содержимого ячеек памяти, эле-
ментарные арифметические и логические операции. Команда содержит код и адреса ячеек, с со-
держимым которой выполняется закодированное действие.
Языки программирования высокого уровня имеют следующие достоинства:
• алфавит языка значительно шире машинного, что делает его гораздо более выразитель-
ным и существенно повышает наглядность и понятность текста;
• набор операций, допустимых для использования, не зависит от набора машинных опера-
ций, а выбирается из соображений удобства формулирования алгоритмов решения задач опреде-
ленного класса;
• конструкции команд (операторов) отражают содержательные виды обработки данных и
задаются в удобном для человека виде;
• используется аппарат переменных и действия с
ними;
• поддерживается широкий набор типов данных.
Таким образом, языки программирования высокого уровня являются машинно-
независимыми и требуют использования соответствующих программ-переводчиков (транслято-
ров) для представления программы на языке машины, на которой она будет исполняться.
212
2.2. МЕТАЯЗЫКИ ОПИСАНИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
Интерпретация конструкций языка программирования должна быть абсолютно однознач-
ной, ибо фраза на языке программирования превращается в машинный код автоматически, с по-
мощью программы-транслятора, и любой намек на неоднозначность либо делает эту фразу непе-
реводимой, либо приводит к ошибке. В этом отношении языки программирования значительно
отличаются от естественных языков, допускающих неоднозначно интерпретируемые фразы, рас-
считанные на здравый смысл и жизненный опыт человека - слушателя и исполнителя, способного
додумать содержание фразы. «Додумывание» не входит в способности компьютеров, поэтому не-
обходимы приемы описания конструкций языков программирования типа: «Оператором присваи-
вания называется ...», причем продолжение подобной фразы на естественном языке чаще всего
оказывается либо слишком громоздким, либо неоднозначным, либо и тем, и другим одновремен-
но.
Для строгого и точного описания синтаксиса языка
программирования, как правило, ис-
пользуют специальные
метаязыки
(языки для описания других языков). Наиболее распростра-
ненными метаязыками являются
металингвистические формулы Бэкуса - Наура
(язык БНФ) и
синтаксические диаграммы Вирта.
Язык БНФ
(называемый также языком нормальных форм) представляет компактную фор-
му в виде некоторых формул, похожих на математические. Для каждого понятия языка существует
единственная метаформула (нормальная форма). Она состоит из левой и правой частей. В левой
части указывается определяемое понятие, а в правой - задается множество допустимых конструк-
ций языка, которые объединяются в это понятие. В формуле используют специальные метасимво-
лы в виде угловых скобок, в которых заключено определяемое понятие (в левой части формулы)
или ранее определенное понятие (в ее правой части), а разделение левой и правой частей указыва-
ется метасимволом
«::=»,
смысл которого эквивалентен словам «по определению есть».
Например, метаформулы
<переменная>::=А]В
<выражение>::=<переменная>|<переменная>+<переменная>|<переменная><переменная>-
<переменная>
означают, что в том (сугубо модельном) языке, на который эта метаформула распространяется,
под термином <переменная> понимается любая из букв А или В, а под термином <выражение> -
любая из следующих десяти записей: А; В; А+А; А+В; В+А; В+В; А-А; А-В: В-А; В-В Знак 1 сле-
дует читать «или».
Правая часть метаформулы может содержать правило построения допустимых последова-
тельностей. Допускаются рекурсивные определения терминов и понятий, т.е. когда в правой части
формулы участвует понятие, определяемое левой частью. Например, пусть необходимо ввести по-
нятие <двоичный код>, под которым понимался любая непустая последовательность цифр 0 и 1.
Тогда простое и компактное рекурсивное определение с помощью метаформул выглядит так:
<двоичная цифра>::= 0|1
<двоичный код>::=<двоичная цифра>|<двоичный код> <двоичная цифра>
Рекурсия здесь не мешает конструктивному построению понятия <двоичный код>, так как
по принятым правилам при первом обращении к рекурсивно определяемому понятию следует ог-
раничиться нерекурсивной частью формулы, т.е. под двоичным кодом понимать двоичную цифру
- 0 или 1. Но при втором обращении к метаформуле, определяющей двоичный код, мы имеем ва-
рианты (конечно, неполные) понятия <двоичный код>, и можем применить рекурсию, которая
даст нам следующие варианты этого понятия: 0 1 00 01 10 11, т.е. все возможные одно- и двух-
цифровые двоичные коды. Очевидно, что при следующих применениях рекурсии мы получим лю-
бой возможный двоичный код.
Для задания синтаксических конструкций произвольной длины часто используют фигурные
скобки как метасимволы. Фигурные скобки означают, что конструкция может повторяться нуль
или более раз. В частности, термин <двоичный код> можно определить по другому, а именно:
213
<двоичный код>::=<двоичная цифра><двоичная цифра>
И еще, для полноты множества синтаксических конструкций, необходимо определить кон-
струкцию <пусто>:
<пусто>::=.
В большинстве учебных пособий по программированию, технических описаний языков,
метаформулы рассматриваемого языка представлены полностью.
Синтаксическая диаграмма
является графическим представлением значения ме-
тапеременной метаязыка. Диаграмма состоит из основных символов или понятий языка.
Каждая диаграмма имеет входящую и выходящую стрелки, означающие начало и конец
синтаксической конструкции и отражающие процесс ее чтения и анализа . Из каждого элемента
выходит одна или несколько стрелок, оказывающих на те элементы, которые могут следовать не-
посредственно за данным элементом.
Для сравнения с метаформулами приведем несколько примеров.
Синтаксическая диаграмма
<переменная>:: =
цсвивалентна метаформуле <переменная>::= А\В.
Еще примеры:
Читатель может поупражняться в составлении синтаксических диаграмм для известных ему
языков программирования.
Металингвистические формулы в некотором виде заложены в трансляторы; с их помощью
ведется проверка конструкций, используемых программистом, на формальное соответствие какой-
нибудь
из конструкций, синтаксически допустимых в этом языке (синтаксический контроль).
23. ГРАММАТИКА ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
Описанию грамматики языка предшествует описание его алфавита. Алфавит любого языка
состоит из фиксированного набора символов, однозначно трактуемых. Алфавит языков програм-
мирования, как правило, связан с литерами клавиатуры печатной машинки. Клавиатуры персо-
нальных компьютеров близки к ним по наличию литер.
Алфавиты большинства языков программирования близки друг другу и основываются на
буквах латинского алфавита, арабских цифрах и общепринятых спецсимволах, таких как знаки
препинания, математических операций, сравнений и обозначений. Большинство популярных язы-
ков программирования в своем алфавите содержат следующие элементы:
<буква> : : = AaBbCcDdEeFf и т.д.
<цифра> ::=0123456789
<знак арифметической операции >::=*/+-
<разделитель> ::=.,;:()[]{}':=
<служебное слово> :: = begin end if then else for next и т.д.
<спецсимвол> :: = <знак арифметической операции> | <разделитель> |
<служебное слово>
<основной символ>::=<буква> | <цифра> | <спецсимвол>
214
<комментарий>::=<любая последовательность символов>
Несмотря на значительные различия между языками программирования, ряд фундамен-
тальных понятий в большинстве из них схожи. Приведем часть этих понятии.
Оператор
- одно из ведущих понятий всех языков программирования (теоретически, за ис-
ключением чисто декларативных; но в действительности и они используют родственное понятие).
Каждый оператор представляет собой законченную фразу языка и определяет однозначно трак-
туемый этап обработки данных В соответствии с теорией алгоритмов выделяют основные (базис-
ные) операторы языка: присвоения, условный и безусловный переход, пустой
оператор. К произ-
водным, не основным, относят составной оператор, оператор выбора, оператор цикла и оператор
присоединения.
Все операторы языка в тексте программы отделяются друг от друга явными или неявными
разделителями, например:
Sl;S2;...;Sn
Операторы выполняются в порядке их следования в тексте программы. Лишь с помощью
операторов перехода этот естественный порядок может быть нарушен.
Большая часть операторов ведет обработку величин.
Величины
могут быть
постоянными
и переменными.
Значения постоянных величин не изменяются в ходе выполнения программы.
Величина характеризуется
типом, именем и значением.
Наиболее распространенные типы вели-
чин - числовые (целые и вещественные), символьные, логические. Тип величины определяется ее
значением.
Другая важная классификация величин - простые и структурированные. Простая величина
в каждый момент может иметь не более одного значения. Ей соответствует одна ячейка памяти
(поскольку термин «ячейка» несколько устарел, часто говорят «машинное слово») или ее эквива-
лент во внешней памяти компьютера. Структурированная величина, имея одно имя, может иметь
разом несколько значений. Эти значения представляют собой элементы (компоненты) величины.
Самый широкоизвестный пример - массив, у которого элементы различаются по индексам (номе-
рам). Вопрос о структурировании величин - входных, выходных и промежуточных - для успеха
решения прикладной задачи не менее важен, чем вопрос о правильном написании последователь-
ности операторов.
Важнейшие характеристики структурированной величины таковы:
упорядоченность
(да
или нет),
однородность
(да или нет),
способ доступа
к элементам,
фиксированность числа эле-
ментов
(да или нет). Так, массив является упорядоченной однородной структурой с прямым дос-
тупом к элементам и фиксированным их количеством.
Всем программным объектам в языках даются индивидуальные
имена.
Имя программного
объекта называют
идентификатором
(от слова «идентифицировать»). Чаще всего идентификато-
ром является любая конечная последовательность букв к цифр, начинающаяся с буквы:
<идентификатор>::=<буква> | <идентификатор> | <буква>
<идентификатор><цифра>
Как правило, в большинстве языков программирования
в качестве идентификатора запре-
щается использовать служебные слова языка.
Многим слово «идентификатор» не нравится, и в настоящее время чаще употребляют слово
«имя», поскольку
<имя>::=<идентификатор>.
Программисты выбирают имена по своему усмотрению. Принципы выбора и назначения
имен программным объектам естественны. Следует избегать мало выразительных обозначений, не
гоняться за краткими именами. Имена должны быть понятны, наглядны, отражать суть обозначае-
мого объекта. Например,
Summa, Time, i, j, integral, init и т. п.
215
Некоторым идентификаторам заранее предписан определенный смысл и их называют стан-
тартными, например, Sin - это имя известной математической функции.
Описания
или объявления программных объектов связаны с правилами обработки данных.
Данные бывают разные и необходимо для каждого из них определить его свойства. Например, ес-
ли в качестве данных выступает массив, то необходимо задать его размерность, границы индексов,
тип элементов массива. Описательная часть языка программирования является необходимой как
для системных программистов - разработчиков трансляторов, которые должны, в частности, про-
водить синтаксическую и семантическую диагностику программ, - так и для «прикладного» про-
граммиста, которому объявления программных
объектов часто
облегчают процесс разработки и
отладки программ.
В некоторых языках стандартные описания простых числовых и символьных данных опус-
кают (описания по умолчанию), или в них задаются правила описания по имени объекта. Напри-
мер, в Фортране переменные, имена которых начинаются с букв I, J, К, L, M, N, могут принимать
целые значения (при отсутствии явного описания типа, которое возможно), т.е. определены как
числовые данные целого типа. В Бейсике-MSX данные строкового типа присваиваются перемен-
ным, имена которых заканчиваются специальным символом $: A$, S1$.
Особый интерес представляют в языках программирования описания нестандартных струк-
тур данных, таких как запись, файл, объект, список, дерево и т.п.
Приведем список наиболее употребительных обозначений типов данных, используемых в
описаниях:
Целый
- Integer
Вещественный
- Real
Логический
- Boolean
Символьный
- Char
Строковый
- String
Массив
- Array
Множество
-Set
Файл
- File
Запись
- Record
Объект
- Object
Переменные
играют важнейшую роль в системах программирования. Понятие «перемен-
ная» в языках программирования отличается от общепринятого в математике. Переменная - это
программный объект, способный принимать некоторое значение с помощью оператора присваи-
вания. В ходе выполнения программы значения переменной могут неоднократно изменяться. Ка-
ждая переменная после ее описания отождествляется с некоторой ячейкой памяти, содержимое
которой является ее значением. Синтаксис переменной, точнее, ее идентификатора, как правило,
имеет вид:
<имя переменной>::=
——><буква>
———
>
—
><буква>
———
>
—
><цифра>
——
>
—
><спецсимвол>
Семантический смысл переменной заключается в хранении некоторого значения. соответ-
ствующего ее типу (например, переменная целого типа может принимать значение произвольного
целого числа), а также в выполнении
с ней операций пересылки в нее и извлечения из нее этого
значения.
Функция
- это программный объект, задающий вычислительную процедуру определения
значения, зависимого от некоторых аргументов. Вводится в языки программирования для задания
программистом необходимых ему функциональных зависимостей. В каждом языке высокого
уровня имеется в наличии библиотека стандартных функций: арифметических, логических, сим-