Структурное программирование
К концу 1960-х годов в связи с ростом сложности программ и дальнейшим развитием программных средств возникла необходимость увеличить производительность труда программистов, что привело к разработке структурного программирования. Основоположником данной методологии считается Эдсгер Дейкстра, который и описал основные принципы структурного программирования.
С развитием структурного программирования следующим достижением были процедуры и функции. То есть, если есть задача, которая выполняется несколько раз, то её можно объявить как функцию или как процедуру и в выполнении программы просто вызывать её. Общий код программы в данном случае становится меньше. Это способствовало созданию модульных программ.
Следующим достижением было объединение разнородных данных, которые используются в программе в связке, в структуры — это составные типы данных, построенные с использованием других типов данных.
Структурное программирование предполагает точно обозначенные управляющие структуры, программные блоки, отсутствие инструкций безусловного перехода (GOTO), автономные подпрограммы, поддержка рекурсии и локальных переменных. Суть такого подхода заключается в возможности разбиения программы на составляющие элементы с увеличением читабельности программного кода.
Также создавались функциональные (аппликативные) языки (Lisp) и логические языки (Prolog)
Хотя внедрение структурного программирования дало положительный результат, даже оно оказывалось несостоятельным тогда, когда программа достигала определённой длины. Для того чтобы написать более сложную и длинную программу, нужен был новый подход к программированию.
Объектно-ориентированное программирование (ООП)
При использовании структур данных в программе вырабатываются и соответствующие им функции для работы с ними. Это привело к мысли их объединить и использовать совместно, так появились классы.
Класс — это структура данных, содержащая в себе не только переменные, но и функции, которые работают с этими переменными.
Теперь программирование можно было разбить на классы и тестировать не всю программу, состоящую из 10 000 строк кода, а разбить программу на 100 классов, и тестировать каждый класс. Это существенно облегчило написание программного продукта.
В итоге в конце 1970-х и начале 1980-х были разработаны принципы объектно-ориентированного программирования.
Первым объектно-ориентированным языком программирования является Симула-67, в котором впервые появились классы. Концепции ООП получили дальнейшее развитие в языке Smalltalk, в котором также были заложены основы систем с оконным управлением. Более поздними примерами объектно-ориентированных языков являются Object Pascal, C++, Java, C# и др.
ООП позволяет оптимально организовывать программы, разбивая проблему на составные части, и работая с каждой по отдельности. Программа на объектно-ориентированном языке, решая некоторую задачу, по сути, описывает часть мира, относящуюся к этой задаче.
Билет 2.
Векторный язык программирования/прототипирования MatLab
MATLAB (Matrix Laboratory) — пакет прикладных программ для решения задач технических вычислений и одноимённый язык программирования, используемый в этом пакете.
Язык MATLAB был создан в конце 1970-ых годов; он предназначался для работы с библиотеками численных методов, написанными на Fortran, не зная самого языка. Язык быстро обрел популярность среди людей, занимающихся прикладной математикой.
MATLAB используют более 1 000 000 инженерных и научных работников, он работает на большинстве современных операционных системах, включая Linux, Mac OS, Solaris и Microsoft Windows.
Язык MATLAB является высокоуровневым интерпретируемым языком программирования, включающим основанные на матрицах структуры данных, широкий спектр функций, интегрированную среду разработки, объектно-ориентированные возможности и интерфейсы к программам, написанным на других языках программирования.
Программы, написанные на MATLAB, бывают двух типов — функции и скрипты. Функции имеют входные и выходные аргументы, а также собственное рабочее пространство для хранения промежуточных результатов вычислений и переменных. Скрипты же используют общее рабочее пространство. Как скрипты, так и функции не компилируются в машинный код и сохраняются в виде текстовых файлов. Существует также возможность сохранять так называемые pre-parsed программы — функции и скрипты, обработанные в вид, удобный для машинного исполнения. В общем случае такие программы выполняются быстрее обычных, особенно если функция содержит команды построения графиков.
Типичное использование MATLAB - это:
· математические вычисления (решение дифференциальный уравнений, вычисление собственных значений матрицы и пр.)
· создание алгоритмов
· моделирование
· анализ данных, исследования и визуализация
· научная и инженерная графика
· разработка приложений, включая создание графического интерфейса
Система MATLAB состоит из пяти основных частей.
· Язык MATLAB. Это язык матриц и массивов высокого уровня с управлением потоками, функциями, структурами данных, вводом-выводом и особенностями объектно-ориентированного программирования.
· Среда MATLAB. Это набор инструментов и приспособлений, с которыми работает пользователь или программист MATLAB. Она включает в себя средства для управления переменными в рабочем пространстве MATLAB, вводом и выводом данных, а также создания, контроля и отладки М-файлов и приложений MATLAB.
· Управляемая графика. Это графическая система MATLAB, которая включает в себя команды высокого уровня для визуализации двух- и трехмерных данных, обработки изображений, анимации и иллюстрированной графики. Она также включает в себя команды низкого уровня, позволяющие полностью редактировать внешний вид графики, также как при создании Графического Пользовательского Интерфейса (GUI) для MATLAB приложений.
· Библиотека математических функций. Это обширная коллекция вычислительных алгоритмов от элементарных функций, таких как сумма, синус, косинус, комплексная арифметика, до более сложных, таких как обращение матриц, нахождение собственных значений, функции Бесселя, быстрое преобразование Фурье.
· Программный интерфейс. Это библиотека, которая позволяет писать программы на Си и Фортране, которые взаимодействуют с MATLAB. Она включает средства для вызова программ из MATLAB (динамическая связь), вызывая MATLAB как вычислительный инструмент и для чтения-записи МАТ-файлов.
Оболочка Matlab состоит из командной строки, текстового редактора со встроенным отладчиком и окнами со списком файлов, списком видимых переменных и с историей введенных команд.
Matlab имеет большое число пакетов (toolboxes) — как собственных, так и распространяемых независимыми разработчиками часто на условиях открытого кода. В Matlab включен Simulink — визуальный редактор для моделирования динамических систем.
Билет 3.
Графический язык программирования «G» LabView
LabVIEW (англ. Laboratory Virtual Instrumentation Engineering Workbench) — это среда разработки и платформа для выполнения программ, созданных на графическом языке программирования «G» фирмы National Instruments. LabVIEW используется в системах сбора и обработки данных, а также для управления техническими объектами и технологическими процессами.
Компания National Instruments была создана в 1976 году тремя основателями — Джеффом Кодоски, Джеймсом Тручардом и Биллом Новлиным.
Первая версия LabVIEW была выпущена в 1986 году для Apple Macintosh, в настоящее время существуют версии для UNIX, Linux, Mac OS и пр., а наиболее развитыми и популярными являются версии для Microsoft Windows.
LabVIEW по своим возможностям приближается к системам программирования общего назначения, например к Delphi. Тем не менее, между ними существует ряд важных различий:
1. Система LabVIEW основана на принципах графического программирования.
2. Система LabVIEW основана на принципах объектно-ориентированного программирования
3. Система LabVIEW является проблемно-ориентированной;
Каждая программа LabVIEW представляет собой отдельный виртуальный прибор, то есть - программный аналог некоторого реально существующего или воображаемого устройства, состоящий из двух взаимосвязанных частей:
1. Первая часть – «лицевая панель», которая описывает внешний вид виртуального прибора и содержит множество средств ввода информации (кнопки, переключатели) – средств управления, а также множество средств визуализации информации – индикаторов.
2. Вторая часть – «блок-схема» (блочная диаграмма) описывает алгоритм работы виртуального прибора.
Каждый ВП, в свою очередь, может использовать в качестве составных частей другие ВП, подобно как любая программа, написанная на языке высокого уровня, использует свои подпрограммы. Такие ВП нижнего уровня обычно называются субВП.
Важными элементами блок-схемы являются функциональные узлы – встроенные субВП, являющиеся частью LabVIEW и выполняющие предопределенные операции над данными. Также компонентами «блок-схемы» являются терминалы («задние контакты» объектов лицевой панели) и управляющие структуры (являющиеся аналогами таких элементов текстовых языков программирования, как условный оператор «IF», операторы цикла «FOR» и «WHILE» и т. п.).
Данные от терминалов к функциональным узлам и между различными функциональными узлами передаются при помощи связей.
Обычному пользователю, как правило, приходится иметь дело с уже готовыми ВП, заранее разработанными другими специалистами. Ему доступна только лицевая панель ВП, в то время как блок-схема ВП скрыта от его глаз. Пользователь снимает какие-либо показания, следит за ходом выполнения какого-нибудь процесса или даже контролирует его ход, используя средства управления передней панели - ручки, тумблеры, кнопки и т.п.
Итак, с помощью программной среды LabView можно разрабатывать программно-аппаратные комплексы для тестирования, измерения, ввода данных, анализа и управления внешним оборудованием.
Билет 4.
Основы стандартизации на примере С++. Венгерская нотация.
C++ — компилируемый, статически типизированный язык программирования общего назначения.
В 1985 году вышло первое издание «Языка программирования С++», обеспечивающее первое описание этого языка, что было чрезвычайно важно из-за отсутствия официального стандарта.
В настоящее время имеется множество реализаций языка С++. В идеальном случае, написанная программа на одной реализации языка должна одинаковым образом выполняться и на любой другой реализации этого же языка. Для обеспечения этого условия существуют стандарты, описывающие основные конструкции С++ и правила их построения.
Общие требования:
1) На одной строке должно находиться не более одного оператора С++
2) Если вызов функции, операции, занимает более одной строки, то перенос должен следовать сразу после запятой.
3) Если выражение занимает несколько строк – переход на новую – после бинарной операции.
Документация к коду:
1) Документация к исходному коду, содержащаяся в комментариях должна быть достаточной для полного понимания кода его дальнейшего сопровождения как для разработчиков системы так и для программистов
2) Каждый файл исходного кода программы должен иметь вводную часть содержащую форме комментария информацию об авторе программы, имени файла и его содержание
3) Исходный код должен включать в себя заявление о защите авторских прав если программа разрабатывается в течение нескольких лет указывается каждый год
Имена:
1) Имена – имя должно соответствовать свойству или процессу, которые отображает. Имена осмысленны, понятны, на основе английских слов.
2) Имена констант следует задавать только заглавными буквами. Не должны совпадать, не зависимо от того, каким способом вы задали константы. Константы можно следующими операторами: const, enum, #define.
3) Стоит избегать использования имен переменных и функций, составленных целиком из больших букв.
Длина строк: Максимальная длина строк не должна превышать 70 символов. Хотя большие мониторы могут отображать и более длинные строки, печатающие устройства более ограничены в своих возможностях.
Стратегические и тактические комментарии:
1) Тактический комментариях одной строкой описывает операцию на следующей строке.
2) В стратегических комментариях описывается общие назначения функции или фрагментов кода и они вставляются в текст программы блоком из нескольких комментарных строк.
3) Слишком много тактических комментариев делает код программы нечитаемым, поэтому рекомендуется применять стратегическое комментирование.
Имя класса: Должно соответствовать тому объекту, который описывает данный класс.
Использование табуляции:
1) Для организации отступов использовать табуляцию вместо пробелов
2) На размер отступа не накладывается ограничений, но если размер отступа более 4 или 5 пробелов, то код может не уместиться по ширине страницы.
3) Комментарии должны находиться на уровне того оператора, которому они соответствуют
4) Комментарии справа от операторов должны быть выровнены с помощью пробелов, а не табуляции
Исходные файлы
1) Каждый исходный файл должен содержать реализацию только одного класса или группы функций, близких по своему назначению
2) Каждый файл должен иметь заголовок
3) Каждый .cpp файл дожжен включать в себя соответствующие заголовочные файлы, которые должны содержать: а) объявление типов и функций, которые используются функциями или методами класса, реализуемого в данном .cpp файле. б) объявление типов, переменных и методов классов, которые реализуются в данном .cpp файле.
Имена классов:
1) Имя класса должно начинаться с буквы «С», что означает «class».
2) Если имя класса состоит из нескольких слов, то каждое слово должно начинаться с заглавной буквы (Н-р: class СConnectionPointForMyOcx)
3) Имена, объединяющие в себе более 3 слов, использовать не рекомендуется. Длинные идентификаторы затрудняют чтение программы.
4) Имя класса должно начинаться с заглавной буквы. Если имя класса состоит из нескольких слов, то каждое должно начинаться с заглавной буквы, которая служит разделителем слов.
Венгерская нотация – соглашение об именовании переменных, констант и прочих идентификаторов в коде программ.
Имена идентификаторов предваряются заранее оговоренным префиксами, состоящими из одного или нескольких символов. При этом, как правило, ни само наличие префиксов, ни их написание не являются требованием языков программирования, и у каждого программиста (или коллектива программистов) они могут быть своими.
Примеры:
Префикс s (сокращение от string) обозначает строку.
Префикс a (сокращение от array) обозначает массив.
Префикс T (сокращение от type) обозначает тип.
Плюсы:
1) Если встроенного механизма типизации не хватает, венгерская нотация позволяет записывать подтип переменной
2) Удобно при именовании объектов, для которых тип очевиден — например, кнопку «OK» можно назвать btnOk.
3) Венгерская нотация удобна для написания больших программ в неполнофункциональных (по современным меркам) редакторах без автоматизированной навигации по тексту
Минусы:
1) Некоторые программисты считают, что использование префиксов делает имена переменных менее понятными и, таким образом, ухудшает читаемость кода
2) Если неизвестно имя переменной без префиксов, подчас трудно восстановить её префиксы.
3) При изменении типа потребуется изменять имя переменной (не все редакторы кода могут делать это автоматически).
Билет 5.
Жизненные циклы программных средств и их стандартизация
Под жизненным циклом ПС понимают весь период его разработки и эксплуатации (использования), начиная от момента возникновения замысла ПС и кончая прекращением всех видов его использования. Жизненный цикл охватывает довольно сложный процесс создания и использования ПС. Этот процесс может быть организован по-разному для разных классов ПС и в зависимости от особенностей коллектива разработчиков.
В настоящее время можно выделить 5 основных подходов к организации процесса создания и использования ПС:
- Водопадный подход. При таком подходе разработка ПС состоит из цепочки этапов. На каждом этапе создаются документы, используемые на последующем этапе. В исходном документе фиксируются требования к ПС. В конце этой цепочки создаются программы, включаемые в ПС.
- Исследовательское программирование. Этот подход предполагает быструю реализацию рабочих версий программ ПС, выполняющих лишь в первом приближении требуемые функции.
- Прототипирование. Этот подход моделирует начальную фазу исследовательского программирования вплоть до создания рабочих версий программ, предназначенных для проведения экспериментов с целью установить требования к ПС. В дальнейшем должна последовать разработка ПС по установленным требованиям в рамках какого-либо другого подхода (например, водопадного).
- Формальные преобразования. Этот подход включает разработку формальных спецификаций ПС и превращение их в программы путем корректных преобразований. На этом подходе базируется компьютерная технология (CASE-технология) разработки ПС.
- Сборочное программирование. Этот подход предполагает, что ПС конструируется, главным образом, из компонент, которые уже существуют. Должно быть некоторое хранилище (библиотека) таких компонент, каждая из которых может многократно использоваться в разных ПС.
В основном рассматривается водопадный подход с некоторыми модификациями. Во-первых, потому, что в этом подходе приходиться иметь дело с большинством процессов программной инженерии, а, во-вторых, потому, что в рамках этого подхода создается большинство больших программных систем.
В рамках водопадного подхода различают следующие стадии жизненного цикла ПС:
1) разработку ПС,
2) производство программных изделий (ПИ)
3) эксплуатацию ПС.
Рассмотрим каждую стадию более подробно.
Стадии разработки ПС: внешнее описание, конструирования, кодирования, аттестация.
Этап внешнего описания: включает процессы, приводящие к созданию некоторого документа, который называют внешним описанием ПС. Внешнее описание ПС начинается с анализа и определения требований к ПС со стороны пользователей (заказчика), а также включает процессы спецификации этих требований.
Этап конструирования ПС: охватывает следующие процессы: разработку архитектуры ПС, разработку структур программ ПС и их детальную спецификацию.
Этапа кодирования (программирование в узком смысле) ПС: включает процессы создания текстов программ на языках программирование, их отладку с тестированием ПС.
Этап аттестации ПС: производится оценка качества ПС. Если эта оценка оказывается приемлемой для практического использования ПС, то разработка ПС считается законченной. Это обычно оформляется в виде некоторого документа, фиксирующего решение комиссии, проводящей аттестацию ПС.
Программное изделие (ПИ) - экземпляр или копия разработанного ПС. Изготовление ПИ - это процесс генерации и/или воспроизведения (снятия копии) программ и программных документов ПС с целью их поставки пользователю для применения по назначению. Производство ПИ - это совокупность работ по обеспечению изготовления требуемого количества ПИ в установленные сроки.
Стадия эксплуатации ПС охватывает процессы хранения, внедрения и сопровождения ПС, а также транспортировки и применения ПИ по своему назначению. Она состоит из двух параллельно проходящих фаз: фазы применения ПС и фазы сопровождения ПС.
- Применение (operation) ПС - это использование ПС для решения практических задач на компьютере путем выполнения ее программ.
- Сопровождение (maintenance) ПС - это процесс сбора информации качестве ПС в эксплуатации, устранения обнаруженных в нем ошибок, его доработки и модификации, а также извещения пользователей о внесенных в него изменениях.
Билет 6
Императивное и декларативное программирование
Прежде чем говорить непосредственно о данных понятиях, расскажем определение парадигмы программирования.
Парадигма программирования – совокупность идей и понятий, определяющая стиль написания программы.
Основными парадигмами программирования являются:
1) императивное программирование
2) декларативное программирование
3) функциональное программирование
4) объектно-ориентированное программирование.
Существуют также и другие модели программирования, но мы рассмотрим только первые две.
Программирование:
1) Императивное
Программы представляют собой последовательность действий с условным и безусловным переходами, т.е. необходимо объяснить компьютеру, как нужно решать задачу.
2) Декларативное
Программа представляет собой совокупность утверждений описывающих фрагмент предметной области или сложившуюся ситуацию, иначе говоря, задается спецификация решения задачи, т.е. программист должен описать, что нужно решать и что требуется получить в итоге.