(72 часа)
Вадим Валериевич Монахов, доцент кафедры вычислительной физики СпбГУ
Введение
1.1. Основной принцип структурного программирования
Структурное программирование — это метод программирования, опирающийся на структурную организацию программы.
Основной принципструктурного программирования - обеспечить максимальное соответствие структуры текста программы логике решаемой проблемы.
Способы реализации основного принципа структурного программирования:
1) Структурируемости и читаемости текста программы –отступы, обозначения, группировка частей текста.
2) Отлаживаемость программы – пригодность конструкций языка к отладке. В значительной степени связана с особенностямитипизации данных. Наличие жесткого контроля типов с диагностикой ошибок при трансляции программы. Другая важная часть – наличие интегрированной среды разработки.
3) Инкапсуляция данных — наличие структурных типов данных (массивы, записи, строки, множества, файловые типы, потоки и т.п.) с возможностью оперирования переменной структурного типа как единым целым.
4) Инкапсуляция программного кода -блоки разных уровней, модули, пакеты и т.п. с особыми правилами прозрачности и интерфейсами между ними.
5) Инкапсуляция программного кода и данных во время выполнения программы, со специальными ограничениями доступа, правилами прозрачности, интерфейсами, диагностикой ошибок во время выполнения программы. Примеры: обработка исключительных ситуаций во время выполнения, обработки событий, подпроцессы.
Примеры неструктурных языков:
Ассемблер — не удовлетворяет:
1. "Читаемость" — из-за плохой читаемости программы, отсутствия структурируемости текста;
2. "Отлаживаемость" — полное отсутствие;
3. "Структурные типы" — полное отсутствие;
4. "Инкапсуляция кода" — полное отсутствие;
5. "Инкапсуляция времени выполнения" — полное отсутствие.
FORTRAN — не удовлетворяет:
1. "Читаемость" — из-за необходимости часто использовать оператор goto, неразвитости блочной организации текста программы, позиционной зависимости кода;
2. "Отлаживаемость" — из-за отсутствия пользовательских типов и, что более критично — слабого контроля типов. С этим связано существование недиагностируемых ошибок типа DO7I=1.10, когда в операторе цикла вместо "," поставили ".", в результате чего "Voyager" пролетел мимо Венеры;
3. "Структурные типы" — отсутствие структурных типов данных (кроме массивов);
4. "Инкапсуляция кода" — почти отсутствует, так как нет модулей, вложенности блоков программного кода (подпрограммы не могут быть вложены друг в друга) и крайне плохо организованных интерфейсов между блоками кода (операторы block data и т.д.);
5. "Инкапсуляция времени выполнения" — полное отсутствие.
В FORTRAN-77 появились возможности, преодолевающие ряд перечисленных недостатков. FORTRAN-99 пошел еще дальше, однако многие недостатки сохранялись, а новые возможности сделали его достаточно сложным и непоследовательным.
Примеры структурных языков:
С:
1. "Читаемость" — удовлетворительно (не очень хорошая читаемость из-за наличия макросов машинной ориентации языка с выражениями типа y+=x );
2. "Отлаживаемость" —удовлетворительно не очень хороший синтаксис языка, поэтому много ошибок не отслеживается при компиляции (например, "," вместо ";" в функции "for", а также ошибки, возникающие из-за правил автоматического приведения типов). Наличие указателей с соответствующими правилами присваивания часто приводит к фатальным ошибкам.
3. "Структурные типы" —хорошо;
4. "Инкапсуляция кода" —хорошо. Не очень удачно организована модульность;
5. "Инкапсуляция во время выполнения" — полное отсутствие.
C++:
То же, что C, 2) несколько усовершенствован (однако переусложнен). Имеется объектная модель, расширяющая 1), 2), 3), 4). Правда, имеется дефект в ограничении правила видимости объектов (правила видимости могут быть несанкционированно изменены).
5)"Инкапсуляция времени выполнения" — наличие обработки исключительных ситуаций (exceptions).
PASCAL:
1. "Читаемость" — хорошо;
2. "Отлаживаемость" — хорошо. Проблемы: правила автоматического приведения типов, работа с указателями, явное приведение типов, вариантная запись;
3. "Структурные типы" — хрошо;
4. "Инкапсуляция кода” —удовлетворительно: отсутствуют модули (в стандарте языка) и пакеты; Turbo Pascal лучше удовлетворяет "4)", хоть и имеет не очень продуманные интерфейсы и правила видимости между модулями;
5. "Инкапсуляция времени выполнения" — полное отсутствие.
Object Pascal (начиная с Delphi 2.0) (без явного применения объектов):
Имеется объектная модель, расширяющая 1), 2), 3), 4). Кроме того, начиная с Delphi 3.0 появились пакеты.
5)"Инкапсуляция времени выполнения" —
а) наличие обработки исключительных ситуаций (exceptions);
b) работа с подпроцессами (threads).
Java:
1. "Читаемость" — удовлетворительно. Недостатки: переусложненность ряда простых в принципе действий из-за чрезмерного увлечения объектным подходом (например, при действиях с файлами и строками); "рецидивы", ведущие происхождение от С (операнды типа y+=x, функции for,?: и т.п. Зато макросы отсутствуют!). Наличие большого числа маленьких подпрограмм (классов) без возможности их объединения в единое целое.
2. "Отлаживаемость" —отлично, за исключением правил автоматического приведения типов (указатели ликвидированы!);
3. "Структурные типы" —хорошо;
4. "Инкапсуляция кода" —хорошо. Сложность: отсутствие вложенных программ. В некоторой степени решено, начиная с Java 1.1 – вложенные классы;
5. "Инкапсуляция во время выполнения" — хорошо. Имеются:
a. обработка исключительных ситуаций;
b. работа с подпроцессами (threads).
JavaScript/Jscript
1)”Читаемость” – удовлетворительно ( С-образен);
2)”Отлаживаемость” – неудовлетворительно (свободная типизация и при этом слабая типизация), крайне плохая диагностика ошибок;
3)”Структурные типы” – хорошо (благодаря объектной модели);
4)”Инкапсуляция кода” – удовлетворительно (нет модулей, пакетов; вложенные функции появились только в JavaScript 1.2);
5)”Инкапсуляция времени выполнения” – удовлетворительно для JS в IE4 и последующих (есть обработка исключений), неудолетворительно – для других бразеров.
1.2. Основные задачи структурного программирования
Структурное программирование предназначено для решения трех основных задач:
1. Повышение эффективности разработки программ: а) увеличение скорости написания программ; б) увеличение качества их сопровождения (внесения усовершенствований, исправления ошибок); в) уменьшение стоимости разработки; г) обеспечение возможности групповой работы с проектом; д) обеспечение возможности проектирования ПО (software engineering).
2. Повышение надежности работы программ. Никому не нужна дешевая, мгновенно написанная и занимающая мало ресурсов программа, которая работает очень быстро, но с ошибками. Из программистского фольклора: “Беремся написать вам ПО : 1. Бысро 2.дешево 3.надежно. – Два из трех.
3. Повышение эффективности работы программ: увеличение скорости их выполнения, расширение функциональных и сервисных возможностей программ, а также уменьшение их ресурсоемкости (размеров программного кода, объема используемой оперативной и дисковой памяти).
Одним из важнейших критериев решения перечисленных задач является коэффициент повторного использования программного кода, т.е. многократного использования одного и того же куска программы. Преимущества процедур, функций и библиотек подпрограмм, и в особенности объектного программирования, в значительной степени связаны с увеличением коэффициента повторного использования кода.
1.3. Основные принципы объектно-ориентированного программирования (ООП)
ООП — это метод программирования, развивающий принципы структурного программирования и основанный на следующих абстракциях данных:
I. Инкапсуляция: объединение данных с процедурами и функциями в единый блок программного кода (данные и методы работы с ними рассматриваются как поля объекта).
II. Наследование (наличие экземпляров класса; потомки, прародители, иерархия).
III. Полиморфизм (единое имя для некого действия, которое по-разному осуществляется для объектов иерархии).
Компонентное программирование:
Реализация объектов в виде независимо распространяемых исполняемых модулей. Известны 2 типа компонентов:
А) Компоненты конкретного языка программирования (Visual BASIC, Object PASCAL, Java). Предназначены преимущественно для поддержки средств визуального проектирования
Б) Компоненты, поддерживаемые на уровне ОС (компоненты Activex, .NET).
Основы языка Object PASCAL.