Опорный конспект Форма ф со пгу 18. 2/05 Министерство образования и науки Республики Казахстан

Вид материалаКонспект

Содержание


Рис. 1 Классификация языков программирования
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   15

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




Сложный алгортм состоит из множества соединенных между собой базовых структур. Есть два способа соединения структурных элементов алгоритма: последовательный и вложенный.

Метод последовательной детализации- это построение алгоритма «сверху вниз». Сначала строится основной алгоритм и внем записываются обращения к вспомогательным алгоритмам I уровня, в котором могут быть поставлены обращения к вспомогательным алгоритмам II уровня. Этот метод применяется при любом конструировании сложных объектов и представляет собой естественную логическую последовательность мышления конструктора (постепенное углубление в детали).

В эту группу входят языки Algol, Fortran, Pascal, Basic.

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


В течение многих лет программное обеспечение строилось на основе алгоритмических и структурных языков, таких, как Fortran, Basic, Pascal. Классическое алгоритмическое и/или процедурное программирование требует от программиста детального описания того, как решать задачу, т.е. формулировки алгоритма и его специальной записи.

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

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

Так как современные компьютеры (персональные, как наиболее широко распространенные и, как ни странно, наиболее востребованные широким пользователем) практически все построены по принципам, заложенным еще Фон Нейманом в середине нашего века. То есть, есть процессор, есть память, есть внешние устройства, и все это работает под управлением последовательной выборки команд из памяти.

Читатель, сведущий в архитектурах ЭВМ, знает, что компьютеры, на самом деле, не далеко ушли по своему внутреннему устройству от гипотетических последовательных вычислительных моделей, использовавшихся в начале века пионерами исследования алгоритмов для доказательств базовых утверждений современной теории вычислимости. В самом деле, процессор - это система (да, очень большая) логических элементов. То есть, процессор - схема булевых элементов, реализующая функцию переходов некоторого автомата (почему некоторого? сам компьютер и есть этот автомат) на множестве состояний (вся память какая есть и будет этим самым состоянием). Поэтому современные компьютеры практически все ориентированы на последовательные вычисления. Со всеми замечаниями относительно разных уровней параллелизма согласен, но об этом будет отдельный разговор дальше. Следовательно, парадигмой, имеющей наиболее "естественную" реализацию семантики на нынешних компьютерах, является императивное программирование. Оно заведомо выигрывает любой другой методологии в эффективности реализации. Хорошие трансляторы, например, с чистых объектно-ориентированных языков - вещь достаточно редкая. По изложенным выше причинам не стоит осуждать отдельные парадигмы исключительно руководствуясь аргументом: "мала эффективность готовой программы", забывая о том, что практически все сложные программы работают не так быстро и требуют больших объемов памяти.

В следующих частях будут подробно рассмотрены отдельные методологии программирования. Это потребует описания традиционного синтаксиса некоторого языка программирования, поддерживающего эту методологию (да, между Паскалем и Си очень много разницы; в одном надо писать begin...end, а в другом {...}, и так далее). Будут описаны традиционные средства структурирования программ, принятые в этих языках. Естественно, будет рассказано о типичной семантике таких языков. И, что наиболее важно, будет рассмотрен класс задач, для которого эти методологии дают достаточно эффективные решения.

Практически любой язык программирования в наши дни - это язык определений. Программы представляют из себя множество определений программных объектов (типов данных, функций, ...), которые как-то взаимосвязаны. Методологии программирования, как правило, фокусируются на описании алгоритмической части определений, входящих в программу. Методология для работы с описательной частью всего одна: программа должна быть максимально структурирована. Это помогает переиспользовать единожды написанный код, да и просто облегчает понимание текста программы. Это знали и в середине ХХ века (когда уже по-программировали всласть), это знают и сейчас. Структурированность программы позволяет повысить уровень декларативности (то есть, еще сильнее оторваться от деталей архитектуры конкретного компьютера и программировать практически в терминах предметной области задачи) даже для программирования на языке ассемблера процессора Intel. В алгоритмической же части многие современные языки на самом деле поддерживают в явном виде несколько парадигм программирования.

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

A B - последовательно А, за тем В.
A | B - альтернатива. Читается: "A или B".
A* - произвольное количество повторений (в том числе - 0 раз) А. Читается: "последовательность А".
A # B - эквивалентно A ( B A )*. Читается: "последовательность А через В".

Терминальные символы выделяются подчеркиванием.