Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
17.04.2015
Размер:
32.85 Кб
Скачать

2.Императивное программирование

Эта лекция должна показать, что "парадигмы разные нужны, парадигмы разные важны". Все они - всего лишь различные инструменты, которые можно использовать при программирова-нии. Каждый из этих инструментов по-своему хорош. Все описанные в статье модели вычислений эквивалентны. Но это не значит, что они "эффективно универсальны". То есть, на самом деле, различные методики программирования дают разный выигрыш для решения задач разных классов. Этот выигрыш можно мерять по двум параметрам:

– эффективность программного обеспечения на современных ЭВМ

– общие затраты на разработку программного обеспечения

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

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

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

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

A B - последовательно А, за тем В.

A | B - альтернатива. Читается: "A или B".

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

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

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