Алгоритмизация и программирование. Языки программирования высокого уровня.

Алгоритмизация и программирование. Языки программирования высокого уровня.

План: 2 часа
1.Алгоритмизация.
1.1 Понятие алгоритма.
1.2. Свойства алгоритма.
1.3 Способы описания алгоритмов.
1.4 Основные типы алгоритмов
2.Эволюция языков программирования.
3.Структура и способы описания языков программирования высокого уровня.






СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ


Голицина О.Л., Попов И.И. Основы алгоритмизации и программирования. – М.: Форум – Инфра - М, 2002.
2.Семакин И.Г. , Шестаков А.П. Основы программирования. – М.: Мастерство, 2002.

1.Алгоритмизация.
1.1 Понятие алгоритма.
Наша цель научить компьютер решать те задачи, которые он самостоятельно и изначально решать не умеет. Что же для этого нужно?
А что, например, следует сделать, если нужно привлечь к решению задачи человека (назовем его исполнитель), не знакомого с ее решением? В общем виде последовательность действий здесь следующая:
а) выбрать способ (метод) решения задачи и изучить его во всех подробностях;
б) сообщить исполнителю выбранный метод в абсолютно понятном для него виде.
Первый этап этого процесса обычно не вызывает затруднений, так как для большинства встречающихся задач метод решения либо известен из практики, либо подсказывается здравым смыслом, либо описан в литературе. Главная трудность этого этапа выбрать из нескольких методов более подходящий для решения данной задачи: наименее трудоемкий, максимально эффективный и т.д.
Второй этап значительно сложнее. Дело в том, что если способ (метод) решения задачи описан произвольно, то нет гарантии, что он будет верно понят исполнителем.
Попробуйте, например, небольшую игру. Попросите товарища на время забыть все, что он знает, например, о процессе варки картофеля. Если же выбранный вами помощник еще никогда не варил картошку, то эксперимент будет максимально «чистым». Опишите ему процесс приготовления этого нехитрого блюда и попросите его приготовить, точно следуя вашим инструкциям. После чего удалитесь с кухни и подождите результата в другой комнате. Ну как картошечка? Надеюсь, вы не забыли сказать вашему другу, чтобы он предварительно почистил ее?..
Именно поэтому описание метода следует выполнять в соответствии с определенными правилами, а именно: - выделить величины, являющиеся исходными для задачи;
- разбить процесс решения задачи на такие этапы, которые известны исполнителю и которые он может выполнить однозначно без всяких пояснений;
указать порядок выполнения этапов;
указать признак окончания процесса решения задачи;
указать во всех случаях, что является результатом решения задачи.
Описание метода, выполненное в соответствии с этими правилами, называется алгоритмом решения задачи.
Составить такое описание обычно нелегко, но, следуя ему, механически выполняя все указанные в нем этапы в требуемом порядке, исполнитель может всегда правильно решить задачу.
Итак, мы подошли к центральному понятию информатики алгоритму. Более строго это понятие можно дать следующим образом.
Алгоритм это метод (способ) решения задачи, записанный по определенным правилам, обеспечивающим однозначность его понимания и механического исполнения при всех значениях исходных данных (из некоторого множества значений).
Или более коротко: алгоритм это строго определенная последовательность действий, необходимых для решения данной задачи.
Примером алгоритма может служить уже упоминавшийся кулинарный рецепт алгоритм варки картофеля:
Подготовить исходные величины воду, картофель, соль, посуду (кастрюлю с крышкой для варки), нож.
С помощью ножа очистить картофель и промыть его водой.
Нарезать картофель для варки.
Поместить картофель в кастрюлю.
Залить содержимое кастрюли водой.
Посолить.
Довести воду до кипения.
Убавить огонь.
Варить картофель до готовности (приблизительно в течение 2030 минут).
Снять кастрюлю с огня и слить воду.
Картофель готов. Процесс прекратить.

1.2 Свойства алгоритма.
Для углубления понятия алгоритма выделим и раскроем его основные свойства, вытекающие из определения.
Дискретность алгоритма. Это свойство означает,
что решение задачи, записанное в виде алгоритма, разбито на отдельные простейшие команды, которые расположены в порядке их выполнения.
Определенность алгоритма. Это свойство означает, что каждая команда алгоритма должна быть понятна исполнителю, не оставлять места для ее неоднозначного толкования и неопределенного исполнения.
Результативность алгоритма. Свойство алгоритма, состоящее в том, что он всегда приводит к результату через конечное число шагов.
Массовость алгоритма. Это свойство заключается в том, что каждый алгоритм, разработанный для решения некоторой задачи, должен быть применим для решения задач этого типа при всех допустимых значениях исходных данных.
Действительно, рассмотрим приведенный выше алгоритм варки картофеля с точки зрения его свойств.
Данный алгоритм дискретен, т.к. весь процесс разбит на отдельные шаги, которых у нас оказалось 11.
Алгоритм определен, т.к. каждая команда описана просто, коротко и достаточно понятно для исполнителя. Более того, команды даны именно в той последовательности, которая необходима для решения данной задачи. Действительно, попробуйте, например, поменять местами пункты 5 и 7 алгоритма. Вряд ли в этом случае вы получите нужный результат.
Алгоритм результативен, т.к. при его точном механическом исполнении вы сможете отведать вполне приемлемый вареный картофель.
Ну и наконец алгоритм обладает свойством массовости, т.к. применим при любых исходных данных: для любого сорта и величины картофеля и для любых кастрюль, ножей и т.п.
1.3 Способы описания алгоритмов. Существует несколько способов описания алгоритмов.
Словесно-формульное описание алгоритма, т.е. описание алгоритма с помощью слов и формул.
Графическое, описание алгоритма, т.е. описание с помощью специальных графических схем алгоритмов - блок-схем.
Способ, использующий псевдокоды. Псевдокоды - это интерпретация шагов алгоритма на обычном языке, которая описывает действие команды. Псевдокод используется в листингах, чтобы показать общую структуру программы, не применяя реальных операторов языка программирования.
Запись алгоритма на одном из языков программирования (Pascal, Basic и т.п.)
Рассмотрим два способа описания алгоритмов для следующего примера.
Пример.
Составить алгоритм начисления зарплаты согласно следующему правилу: «Если стаж работы сотрудника менее 5 лет, то зарплата 130 руб., при стаже работы от 5 до 15 лет - 180 руб., при стаже свыше 15 лет зарплата повышается с каждым годом на 10 рублей».
Сформулируем задачу в математическом виде:
Вычислить:
13 EMBED Equation.3 1415

где ZP - зарплата; ST - стаж работы.
A. Словесно-формульное, описание алгоритма решения задачи:
Ввести ST, перейти к п.2.
Если SТ<5,то ZP:=130, перейти к п. 4, иначе - перейти к п.З.
Если 5
·SТ
·15, то ZP:=180, перейти к и. 4, иначе ZP:-=180+(ST-15)10, перейти к п. 4.
Вывести значение ZP, перейти к п. 5.
Конец работы.
B. Графическое описание алгоритма.

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

Каждый из описанных блоков № 2 и № 3 имеет один вход и один выход. Блок проверки некоторого условия (4) имеет два выхода Да и Нет.
Например:

Если условие выполняется выходим из блока по выходу Да, если не выполняется по выходу Нет.
1.4 Основные типы алгоритмов
Типы Алгоритмов
В зависимости от особенностей своего построения алгоритмы делятся на три основные группы:
линейные;
разветвляющиеся:
циклические.
Разнообразие алгоритмов определятся тем, что любой алгоритм распадается на части, фрагменты и каждый фрагмент представляет собой алгоритм одного из трех указанных видов. Поэтому важно знать структуру каждого из алгоритмов и принципы их составления.
Линейные алгоритмы
Линейным называется алгоритм, в котором все этапы решения задачи выполняются строго последовательно, т.е. линейный алгоритм выполняется в естественном порядке его написания и не содержит разветвлений и повторений.

Рассмотрим составление схем линейных алгоритмов на конкретных примерах.
Структура такого алгоритма показана на рисунке.
Мы получили запись алгоритма решения данной задачи с помощью блок-схемы. Рассмотрим теперь запись этого алгоритма с помощью псевдокода.
Пример.
Даны переменные А и В. Требуется обменять их значения, т.е. переменная А должна получить значение В, а В значение А.
Решение:
Исходные данные: А, В. Вспомогательная перемен ная ВОР. Результат: А, В.
Метод решения задачи: в ЭВМ каждая величина хранится в отдельном участке памяти (переменной). По этому задача заключается в том, чтобы поменять местами содержимое двух ячеек.
Давайте решим следующую задачу: имеется два стакана: в одном из них вода, в другом молоко. Требуется поменять содержимое стаканов. Житейский опыт подсказывает, что нам для решения данной проблемы потребуется еще один стакан. В него мы перельем воду из первого, затем в первый стакан (из второго) нальем молоко, а из вспомогательного стакана во второй нальем воду.
Аналогично решается и задача обмена значениями двух переменных. Введем в рассмотрение еще одну величину, например С (вспомогательный стакан). Решение задачи распадается на три этапа. Соответствующие им блоки и порядок их выполнения изображены на схеме алгоритма.

Мы получили запись алгоритма решения данной задачи с помощью блок-схемы. Рассмотрим теперь запись этого алгоритма с помощью псевдокода.
Напомню, что псевдокоды это интерпретация шагов алгоритма на обычном языке, которая описывает действие команды.
При записи алгоритма с использованием псевдокодов знаки арифметических операций будем обозначать так:
+ - / *.
Знак := (двоеточие и равно) означает операцию присвоения выбранной переменной некоторого значения.
К инструкциям линейных алгоритмов относятся инструкции ввода-вывода информации и инструкция присваивания. На языке псевдокода эти инструкции обозначаются следующим образом.
- Инструкция ввода Ввод (х, у, z)*.
Здесь в скобках перечислены имена элементов, которые надо ввести.
- Инструкция вывода Вывод (х, у).
- Инструкция присваивания х := 32*.
Читается: «х присвоить значение 32». Алгоритм Перемещение; {заголовок алгоритма]
Переменные А, В, Dop: целые числа; {описательный блок}
Начало
Ввод (А, В);
Dop:=A;
А:=В;
B:=Dop;
Вывод(А, В);
Конец.
Проверим составленный алгоритм. Для этого нужно выполнить действия, предусмотренные в алгоритме в том порядке, в каком они записаны. Для того чтобы было легче контролировать значения переменных, исполняя алгоритм, будем составлять трассировочную (тестирующую) таблицу; такую таблицу также называют таблицей значений.
Пусть переменным А и В задаются значения 3 и 6 соответственно. В итоге переменная А должна содержать 6, а В 3. Проверим работу нашего алгоритма:

А
В
DOB

1
3
6
0

2
3
6
3

3
6
6
3

4
6
3
3


Результат работы алгоритма совпадает с ожидаемым. Значит, алгоритм составлен верно.
Логические выражения.
Прежде чем перейти к рассмотрению ветвящихся и циклических алгоритмов, рассмотрим понятие логического выражения.
В некоторых случаях выбор варианта действий в программе должен зависеть от того, как соотносятся между собой значения каких-то переменных.
Например, расчет корней квадратного уравнения производится по-разному в зависимости от знака дискриминанта (вспомните школьную математику).
В результате сравнения значений двух выражений возможны два варианта ответа: сравнение истинно или ложно?
Например:
2+3 > 3+1 да (истинно);
О < -7? нет (ложно).
Выражения такого вида мы будем называть логическими выражениями.
Нам известны 6 операций сравнения:

Знак Операция
< Меньше
> Больше
<= Меньше или равно >= Больше или равно
= Равно
<> Не равно

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

Часто встречаются задачи, в которых используются не отдельные условия, а совокупность связанных между собой условий (отношений). Например, в магазине вам нужно выбрать туфли, размер которых г=45, цвет соl=белый, цена price не более 400 руб.
Другой пример: школьник выяснил, что сможет купить шоколадку, если она стоит 3 руб. или 3 руб. 50 коп.
В первом примере мы имеем дело с тремя отношениями, связанными между собой союзом «и» и частицей «не», во втором с двумя отношениями, связанными союзом «или». Подобные условия назовем составными, и для их обозначения в алгоритме договоримся использовать союзы «и», «или», частицу «не», которые будем выделять жирным шрифтом и рассматривать как знаки логических операций, позволяющих из простых условий создавать составные, подобно тому, как из простых переменных и констант с помощью знаков +, - и т.д. можно создавать алгебраические выражения.
Так, условия наших примеров в алгоритме могут выглядеть таким образом:
первое: (г=45) и (соl=белый) и (не (price>400));
второе: (цена=3) или (цена=3,5).
Алгоритмы ветвящейся структуры
Алгоритмом ветвящейся структуры будем называть такой алгоритм, котором выбирается один из нескольких возможных путей (вариантов) вычислительного процесса.
Каждый подобный путь называется ветвью алгоритма.
Признаком разветвляющегося алгоритма является наличие операций условного перехода, когда происходит проверка истинности некоторого логического выражения (проверяемое условие) и в зависимости от истинности или ложности проверяемого условия для выполнения выбирается та или иная ветвь алгоритма. Алгоритм предполагает выполнение Действия 1, если записанное условие истинно (выполняется), и выполнение Действия 2, если условие ложно (не выполняется).
В частном случае может отсутствовать один из блоков «Действие 1» или «Действие 2».
Пусть, например, В проверяемое условие, a SI, S2 некоторые выполняемые инструкции (действия). Тогда: Если условие В выполняется (истинно), то
выбрать для исполнения S1,
иначе
выбрать для исполнения S2
Запишем ветвящийся алгоритм на псевдокоде и графически:

Существуют задачи, связанные с вычислением функций, заданных несколькими арифметическими выражениями (формулами). Приведем пример такой задачи.
Пример.
Вычислить значение Y по одной из формул:

Решение:
Исходные данные: х.
Результат: Y.
Метод решения задачи: необходимо выявить область, которой принадлежит значение х, для этого достаточно проверить заданные условия по порядку. Запишем алгоритм в псевдокодах:
Алгоритм Bemel;
Переменные х, у .-вещественные;
Начало
Ввод (х);
Если х<10 тогда у:=х+2
иначе у:=х-2;
Вывод (у);
Конец.
К задачам рассмотренного выше вида очень часто сводятся вполне реальные задачи. Например, расчет стипендии, если известно среднее арифметическое оценок студента за месяц. Стипендия отличника равна 100 рублям, хорошиста (5 < SRJ4) 80 рублей, остальные стипендию не получают.
Математическая формула:
13 EMBED Equation.3 1415
т.е. мы пришли к задаче вычисления функции по разветвляющемуся алгоритму.
Еще один распространенный вид задач логические задачи. К ним относятся задачи определения минимума, максимума некоторого числа величин, задачи упорядочивания и сортировки данных и др. Это достаточно сложные задачи, однако в простейших случаях при небольшом числе данных они приводят к построению несложных алгоритмов разветвляющейся структуры. Рассмотрим примеры подобных задач.
Пример.
Определить: Найти максимальное из двух чисел X, Z: У = max{X,Z}.
Решение:
Исходные данные: X, Z.
Результат: Мах.
Метод решения задачи: нужно сравнить два числа и сделать вывод. Блок-схема алгоритма решения этой задачи выглядит следующим образом:


Циклический Алгоритм
Реализует повторение некоторых действий. Иными словами, циклические алгоритмы включают в себя циклы.
Циклом называется последовательность действий, выполняемых многократно, каждый раз при новых значениях параметров.
Примером циклических алгоритмов может служить алгоритм покраски забора. Действительно, рассмотрим этот алгоритм в словесно-формульном виде:
Шаг I. Подготовить исходные данные (забор, краску, кисть).
Шаг II. Подойти к забору.
Шаг III. Обмакнуть кисть в краску.
Шаг IV. Нанести краску кистью на поверхность забора.
Шаг V. Если забор еще не весь окрашен, то повторить алгоритм, начиная с пункта (Шаг III).
Существует несколько видов циклических инструкций, с помощью которых можно организовать циклы.
1. Инструкция «цикл с параметром» (цикл с заданным количеством повторений).
Обозначим:
х параметр цикла (является счетчиком количества повторений);
a, b соответственно начальные и конечные значения параметра цикла;
h шаг, с которым изменяется параметр цикла;
S оператор (инструкция), повторяемый в цикле.
Общий вид структуры цикла с параметром будет:
Для х := а до b с шагом h повторять
S
Инструкция «цикл с предусловием» (цикл-«пока»):
Обозначим:
В некоторое проверяемое логическое условие;
S оператор (инструкция), повторяемый в цикле.
Тогда инструкция в псевдокоде примет вид:
Повторять
S
Блок-схема такого цикла имеет вид:

3. Инструкция «цикл с постусловием» (цикл-«до»):
Пока В повторять
S
Блок-схема такого цикла имеет вид:

2.Эволюция языков программирования.
Язык программирования это способ записи программ решения различных задач на ЭВМ в понятной для компьютера форме. Процессор компьютера непосредственно понимает язык машинных команд (ЯМК). Программы на ЯМК программисты писали лишь для самых первых ламповых машин ЭВМ первого поколения. Программирование на ЯМК дело непростое. Программист должен знать числовые коды всех машинных команд, должен сам распределять память под команды программы и данные.
В 1950-х гг. появляются первые средства автоматизации программирования языки Автокоды. Позднее для языков этого уровня стало применяться название «Ассемблеры». Появление языков типа Автокод-Ассемблер облегчило участь программистов. Переменные величины стали изображаться символическими именами. Числовые коды операций заменились на мнемонические (словесные) обозначения, которые легче запомнить. Язык программирования стал понятнее для человека, но при этом удалился от языка машинных команд. Чтобы компьютер мог исполнять программы на Автокоде, потребовался специальный переводчик транслятор. Транслятор это системная программа, переводящая текст программы на Автокоде в текст эквивалентной программы на ЯМК.
Компьютер, оснащенный транслятором с Автокода, понимает Автокод. В этом случае можно говорить о псевдо-ЭВМ (аппаратура плюс транслятор с Автокода), языком которой является Автокод. Языки типа Автокод-Ассемблер являются машинно-ориентированными, т.е. они настроены на структуру машинных команд конкретного компьютера. Разные компьютеры с разными типами процессоров имеют разный Ассемблер. Языки программирования высокого уровня (ЯПВУ) являются машинно-независимыми языками. Одна и та же программа на таком языке может быть выполнена на ЭВМ разных типов, оснащенных соответствующим транслятором. Форма записи программ на ЯПВУ по сравнению с Автокодом еще ближе к традиционной математической форме, к естественному языку. Очень скоро вы увидите, что, например, на языке Паскаль она почти такая же, как на школьном Алгоритмическом языке. ЯПВУ легко изучаются, хорошо поддерживают структурную методику программирования.
Первыми популярными языками высокого уровня, появившимися в 1950-х гг., были Фортран, Кобол (в США) и Алгол (в Европе). Языки Фортран и Алгол были ориентированы на научно-технические расчеты математического характера. Кобол язык для программирования экономических задач. В Коболе по сравнению с двумя другими названными языками слабее развиты математические средства, но зато хорошо развиты средства обработки текстов, организация вывода данных в форме требуемого документа. Для первых ЯПВУ предметная ориентация языков была характерной чертой.
Большое количество языков программирования появилось в 1960 1970-х гг. А за всю историю ЭВМ их было создано более тысячи. Но распространились, выдержали испытание временем немногие. В 1965 г. в Дартмутском университете был разработан язык Бейсик. По замыслу авторов это простой язык, легко изучаемый, предназначенный для программирования несложных расчетных задач. Наибольшее распространение Бейсик получил на микроЭВМ и персональных компьютерах. На некоторых моделях школьных компьютеров программировать можно только на Бейсике. Однако Бейсик неструктурный язык, и потому он плохо подходит для обучения качественному программированию. Справедливости ради следует заметить, что последние версии Бейсика для ПК (например, QBasic) стали более структурными и по своим изобразительным возможностям приближаются к таким языкам, как Паскаль.
В эпоху ЭВМ третьего поколения получил большое распространение язык PL/1 (Program Language One), разработанный фирмой IBM. Это был первый язык, претендовавший на универсальность, т.е. на возможность решать любые задачи: вычислительные, обработки текстов, накопления и поиска информации. Однако PL/1 оказался слишком сложным языком. Для машин типа IBM 360/370 транслятор с него не мог считаться оптимальным, содержал ряд невыявленных ошибок. На ЭВМ класса мини и микро он вообще не получил распространения. Однако тенденция к универсализации языков оказалась перспективной. Старые языки были модернизированы в универсальные варианты Алгол-68, Фортран-77.
Значительным событием в истории языков программирования стало создание в 1971 г. языка Паскаль. Его автор швейцарский профессор Н.Вирт разрабатывал Паскаль как учебный язык структурного программирования.
Наибольший успех в распространении этого языка обеспечили персональные компьютеры. Фирма Borland International, Inc (США) разработала систему программирования Турбо Паскаль для ПК. Турбо Паскаль это не только язык и транслятор с него, но еще и операционная оболочка, обеспечивающая пользователю удобство работы. Турбо Паскаль вышел за рамки учебного предназначения и стал языком профессионального программирования с
универсальными возможностями. Транслятор с Турбо Паскаля по оптимальности создаваемых им программ близок наиболее удачному в этом отношении транслятору транслятору с Фортрана. В силу названных достоинств Паскаль стал основой многих современных языков программирования, например, таких как Ада, Модула-2 и др.
Язык программирования Си (английское название С) создавался как инструментальный язык для разработки операционных систем, трансляторов, баз данных и других системных и прикладных программ. Так же как и Паскаль, Си это язык структурного программирования, но, в отличие от Паскаля, в нем заложены возможности непосредственного обращения к некоторым машинным командам, к определенным участкам памяти компьютера. Дальнейшее развитие Си привело к созданию языка объектно-ориентированного программирования Си++.
Модула-2 это еще один язык, предложенный Н.Виртом, основанный на языке Паскаль и содержащий средства для создания больших программ.
ЭВМ будущего, пятого поколения называют машинами «искусственного интеллекта». Но прототипы языков для этих машин были созданы существенно раньше их физического появления. Это языки ЛИСП и Пролог.
ЛИСП появился в 1965 г. Язык ЛИСП основан на понятии рекурсивно определенных функций. А поскольку доказано, что любой алгоритм может быть описан с помощью некоторого набора рекурсивных функций, то ЛИСП, по сути, является универсальным языком. С его помощью на ЭВМ можно моделировать достаточно сложные процессы, в частности интеллектуальную деятельность людей.
Язык Пролог разработан во Франции в 1972 г. также для решения проблемы «искусственного интеллекта». Пролог позволяет в формальном виде описывать различные утверждения, логику рассуждений и заставляет ЭВМ давать ответы на заданные вопросы.
Реализовать тот или иной язык программирования на ЭВМ это значит создать транслятор с этого языка для данной ЭВМ. Существуют два принципиально различных метода трансляции. Они называются соответственно компиляция и интерпретация. Для объяснения их различия можно предложить следующую аналогию: лектор должен выступить перед аудиторией на незнакомом ей языке. Перевод можно организовать двумя способами:
полный предварительный перевод лектор заранее передает текст выступления переводчику, тот записывает перевод, размножает его и раздает слушателям (после чего лектор может и не выступать);
синхронный перевод лектор читает доклад, переводчик одновременно с ним слово в слово переводит выступление.
Компиляция является аналогом полного предварительного перевода; интерпретация аналогом синхронного перевода. Транслятор, работающий по принципу компиляции, называется компилятором; транслятор, работающий методом интерпретации, интерпретатором.
При компиляции в память ЭВМ загружается программа-компилятор. Она воспринимает текст программы на ЯПВУ как исходную информацию. После завершения компиляции получается программа на языке машинных команд. Затем в памяти остается только программа на ЯМК, которая выполняется, и получаются требуемые результаты.
Интерпретатор в течение всего времени работы программы находится во внутренней памяти. В ОЗУ помещается и программа на ЯПВУ. Интерпретатор в последовательности выполнения алгоритма «читает» очередной оператор программы, переводит его в команды и тут же выполняет эти команды. Затем переходит к переводу и выполнению следующего оператора. При этом результаты предыдущих переводов в памяти не сохраняются. При повторном выполнении одной и той же команды она снова будет транслироваться. При компиляции исполнение программы разбивается на два этапа: трансляцию и выполнение. При интерпретации, поскольку трансляция и выполнение совмещены, программа на ЭВМ проходит в один этап. Однако откомпилированная программа выполняется быстрее, чем интерпретируемая. Поэтому использование компиляторов удобнее для больших программ, требующих быстрого счета. Программы на Паскале, Си, Фортране всегда компилируются. Бейсик чаще всего реализован через интерпретатор.

Структура и способы описания языков программирования высокого уровня.
Язык программирования - это специальный язык, на котором пишут команды для управления компьютером. Языки программирования созданы для того, чтобы людям было проще читать и писать для компьютера, но они затем должны транслироваться (транслятором или интерпретатором) в машинный код, который только и может исполняться компьютером. Языки программирования можно разделить на языки высокого уровня и языки низкого уровня.
      Язык низкого уровня - это язык программирования предназначенный для определенного типа компьютера и отражающий его внутренний машинный код; языки низкого уровня часто называют машинно-ориентированными языками. Их сложно конвертировать  для использования на компьютерах с разными центральными процессорами, а также довольно сложно изучать, поскольку для этого требуется хорошо знать принципы внутренней работы компьютера.
       Язык высокого уровня - это язык программирования, предназначенный для удовлетворения требований программиста; он не зависит от внутренних машинных кодов компьютера любого типа. Языки высокого уровня используют для решения проблем и поэтому их часто называют проблемно-ориентированными языками. Каждая команда языка высокого уровня эквивалентна нескольким командам в машинных кодах, поэтому программы, написанные на языках высокого уровня, более компактны, чем аналогичные программы в машинных кодах.
Во всяком языке программирования определены способы организации данных и способы организации действий над данными. Кроме того, существует понятие «элементы языка», включающее в себя множество символов (алфавит), лексемы и другие изобразительные средства языка программирования. Несмотря на разнообразие указанных языков, их изучение происходит приблизительно по одной схеме. Это связано с общностью структуры различных языков программирования высокого уровня, которая схематически отражена на рис. 1.
Изложение языков Паскаль и Си в данном учебном пособии будет соответствовать этой схеме.
В изучении естественных языков и языков программирования есть сходные моменты. Во-первых, для того чтобы читать и писать на иностранном языке, нужно

Рис.1
знать алфавит этого языка. Во-вторых, следует знать правописание слов и правила записи предложений, т.е. то, что называется синтаксисом языка. В-третьих, важно понимать смысл слов и фраз, чтобы адекватно реагировать на них: ведь из грамотно написанных слов можно составить абсолютно бессмысленную фразу. Например, в салоне самолета засветилось табло; на котором написано: Fasten belts! (Пристегните ремни!). Зная правила чтения английского языка, вы, к зависти соседа, правильно прочитаете эту фразу. Однако смысл ее вам может быть непонятен, и поэтому соответствующих действий вы не предпримете, за что получите замечание от стюардессы. Смысловое содержание языковой конструкции называется семантикой.
Всякий язык программирования имеет три основные составляющие: алфавит, синтаксис и семантику.
Соблюдение правил в языке программирования должно быть более строгим, чем в разговорном языке. Человеческая речь содержит значительное количество избыточной информации. Не расслышав какое-то слово, можно понять смысл фразы в целом. Слушающий или читающий человек может додумать, дополнить, исправить ошибки в воспринимаемом тексте.
Компьютер же автомат, воспринимающий все «всерьез». В текстах программ нет избыточности, компьютер сам не исправит даже очевидной (с точки зрения человека) ошибки. Он может лишь указать на место, которое «не понял», и вывести замечание о предполагаемом характере ошибки. Исправить же ошибку должен программист.
Для описания синтаксиса языка программирования тоже нужен какой-то язык. В этом случае речь идет о метаязыке («надъязыке»), предназначенном для описания других языков. Наиболее распространенными метаязыками в литературе по программированию являются металингвистические формулы Бекуса Наура (язык БНФ) и синтаксические диаграммы. В дальнейшем мы чаще всего будем использовать язык синтаксических диаграмм. Они более наглядны, легче воспринимаются. В некоторых случаях для удобства мы будем обращаться к отдельным элементам языка БНФ.
В БНФ всякое синтаксическое понятие описывается в виде формулы, состоящей из правой и левой части, соединенных знаком ::=, смысл которого эквивалентен словам «по определению есть». Слева от знака := записывается имя определяемого понятия (метапеременная), которое заключается в угловые скобки < >, а в правой части записывается формула или диаграмма, определяющая все множество значений, которые может принимать метапеременная.
Синтаксис языка описывается путем последовательного усложнения понятий: сначала определяются простейшие (базовые), затем все более сложные, включающие в себя предыдущие понятия в качестве составляющих.
В такой последовательности, очевидно, конечным определяемым понятием должно быть понятие программы.
В записях метаформул приняты определенные соглашения. Например, формула БНФ, определяющая понятие «двоичная цифра», выглядит следующим образом:
<двоичная цифра>::=0|1
Значок | эквивалентен слову «или». Это определение можно представить на языке синтаксических диаграмм (рис. 2).

Рис.2
В диаграммах стрелки указывают на последовательность расположения элементов синтаксической конструкции; кружками обводятся символы, присутствующие в конструкции.
Понятие «двоичный код» как непустую последовательность двоичных цифр БНФ описывает так:
<двоичный код>::=<дзоичная цифра>I<двоичный код<двоичная цифра>
Определение, в котором некоторое понятие определяется само через себя, называется рекурсивным. Рекурсивные определения характерны для БНФ.
Синтаксическая диаграмма двоичного кода представлена на рис. 3.

Рис.3
Возвратная стрелка обозначает возможность многократного повторения. Очевидно, что диаграмма более наглядна, чем БНФ.
Синтаксические диаграммы были введены Н. Виртом и использованы для описания созданного им языка Паскаль.










13PAGE 15






Root Entry