Islamov M. Sh. Postgraduate, assistant lecturer,
UdSU, Izhevsk.
Исламов М.Ш. Аспирант, ассистент
УдГУ, Ижевск.
В данной работе поднимается проблема преподавания декларативного программирования на младших курсах ВУЗов для ИТ-специальностей, дан краткий анализ текущего состояния данного направления в России и мире, излагаются результаты проведенной работы в данном направлении в Удмуртском Государственном Университете, в котором на протяжении уже нескольких лет, наряду с широко распространенными языками программирования, студентам первого курса преподаются языки: Рефал, Lisp и Пролог.
Безусловно, нельзя говорить о программировании в образовании, ограничиваясь при этом только рассмотрением структурного программирования и ООП. Как показывает история развития ИТ-индустрии, одни популярные технологии достаточно быстро приходят на смену другим, что диктует определенные требования к концепциям и предметам преподавания, ведь нет никаких гарантий в том, что через несколько лет JAVA и C# не будут по популярности близки к Turbo Prolog'у и PL/1. Как следствие - специалист, "натасканный" на технологии, актуальные и востребованные сегодня, завтра уже может оказаться бесполезным. Такое образование, бесспорно, будет неэффективным. С другой стороны, точно предсказать, когда и какие направления будут актуальными, скажем, через 5-10 лет, не представляется возможным. Поэтому, по мнению автора, необходимо выделять равные приоритеты сразу нескольким парадигмам, позволяя таким образом будущим специалистам взглянуть “с высоты птичьего полёта” на все методологии, которые включает в себя понятие программирования и увидеть всю иллюзорность ограничений любой конкретно взятой.
Постановка вопроса "какой язык программирования лучше для обучения программированию" столь же адекватна, как вопрос "на скольких слонах земля будет стоять устойчивей".
^ Декларативное программирование
Одной из известных парадигм написания программ является ДЕКЛАРАТИВНЫЙ СТИЛЬ ПРОГРАММИРОВАНИЯ. Программы на декларативных языках представляют собой совокупности фактов (утверждений), описывающих предметную область в повествовательном наклонении. Вызовом программы является постановка задачи в терминах описанной предметной области, которую уже решает интерпретатор декларативного языка. Выше было упомянуто о 3-ех таких языках программирования: Рефал, Пролог и Lisp. Согласно одной из самых распространенных классификаций ЯП, декларативный стиль включает в себя функциональные языки (Рефал и Lisp) и логические (Пролог). Существует также другая классификация, в которой Рефал и Пролог относятся к "сентенциальному стилю программирования" (данный термин предложил русский ученый, создатель языка Рефал - В.Ф.Турчин. Позже термин был закреплен в [1].).
Исторически сложилось так, что применение указанных языков не достигло промышленного масштаба в нашей стране (напр. по сравнению с ООП) и ограничилось в основном использованием в академических и научно-исследовательских целях. Однако на Западе существует несколько серьезных решений на основе функционального программирования (AutoCAD, Emacs, Maxima и др.), демонстрирующих успешную применяемость этих языков на практике. Кроме того, существует множество примеров учебных задач, которые решаются декларативными языками гораздо быстрее и красивее, чем аналогичные решения для популярных промышленных языков (Пролог: ханойская башня, Refal: символьная производная от функции, факториалы больших чисел и др.). И лишь развитие языка Рефал в нашей стране, подарившее достижения в супер-компиляции и метавычислениях (в которых Россия еще не так давно занимала одну из лидирующих позиций) является ложкой меда в бочке дегтя.
Все это подчеркивает необходимость выяснения причин непопулярности этих эффективных инструментов, особенно сейчас - когда поднимается вопрос стандартизации образования. Ведь если нетрадиционные языки будут известны достаточно большому количеству специалистов, то у руководства фирм и предприятий не будет причин отказывать программисту в их использовании, объясняя это нежеланием усиления зависимости от одного человека (с чем автор сталкивался лично), даже если это сократит время на разработку продукта с нескольких дней до нескольких часов.
Для поверхностной оценки популярности тех или иных языков и направлений достаточно воспользоваться популярной поисковой системой с гибкой логикой запросов. Например, анализируя веб-страницы Интернета, которые были созданы или изменены за последний год, можно обнаружить следующую статистику для языков Lisp, Prolog, Refal и одного из актуальнейших направлений - метавычислений:
Всего
Год
Eng
rus
eng
rus
Prolog
2 010 000
54 600
118 000
170 000
Lisp
394 000
63 100
293 000
13 600
Refal
4 430
1 580
396
130
Метавыч.
75 200
102
8 050
24
Прогр-е
177 000 000
19 400 000
24 900 000
447 000
Таблица 1. Результат поиска в google
В таблице 1 представлены результаты поисковых запросов к google. Поиск проводился как для всех сайтов, так и для измененных/созданных за последний год. С помощью таких запросов, как [программирование prolog] и [programming prolog -site:.ru.] удалось с определенной точностью проанализировать по отдельности “русскоязычный интерес” к представленным декларативным языкам, к метавычислениям, программированию вообще, и “англоязычный интерес” (преимущественно Западный).
В таблице 2 все эти значения были поделены на соответствующие результаты поиска слова “программирование”/”programming”, и затем умножены на 10000 (для удобства сравнения), в результате чего получилась таблица коэффициентов, отражающих относительный интерес внутри каждой языковой зоны для каждого языка.
Eng
Rus
Всего
Год
Всего
Год
Prolog
113,56
47,39
28,14
440,41
Lisp
22,26
117,67
32,53
35,23
Refal
0,25
0,16
0,81
0,34
Метавыч.
4,25
3,23
0,05
0,06
Таблица 2. Коэффициенты относительности.
На таблице видно, что в то время, когда популярность Пролога на Западе за последний год упала примерно в два с половиной раза, у нас Пролог оказался в лидерах по росту популярности среди представленных языков и подскочил более чем в пятнадцать раз по сравнению со всем анализируемым периодом. В то же время растущий интерес к Лиспу на западе (пятикратный рост) никак не влияет на данные для нашей языковой зоны. Так же заметен спад доли интереса к языку Рефал, после кон. 90-х – нач. 2000-х годов (вероятно связанный с высоким ростом популярности других языков).
На таблице 3 показаны отношения результатов запросов между английской и русской зонами Интернета.
Всего
Год
Prolog
0,027
1,441
Lisp
0,160
0,046
Refal
0,357
0,328
Метавыч.
0,001
0,003
Программирование
0,110
0,155
Таблица 3. Отношение интересов: Eng/Rus.
Очевидно преимущество у нас языка Пролог, недооценка языка Лисп и достаточно стабильные отношения для Рефала, метавычислений и программирования в целом. Особо стоит обратить внимание на то, что информация по метавычислениям относительно слабо представлена в интернете, поскольку это направление напрямую зависит от программных средств, позволяющих комфортно и гибко оперировать с текстами программ. Первые работы по метавычислениям появились одновременно в СССР [2] и Японии [3], и в нашей стране они тесно связаны с развитием языка Рефал [1966, В.Ф.Турчин]. Однако несмотря на этот факт, ни Рефал, ни метавычисления так и не получили широкого распространения, в отличие от языка Пролог, который в 80-х годах имел и высокую популярность и шанс доказать свою состоятельность…
^ Опыт преподавания декларативных языков
В Удмуртском Государственном Университете студенты специальности "Прикладная математика и информатика" на первом курсе изучают язык Рефал (диалект Рефал-5), затем Lisp и Пролог. Как показала практика преподавания, столь раннее знакомство с Рефалом не является преждевременным, а наоборот, способствует обучаемости другим - структурным языкам, а позже (после изучения студентами основ математической логики) - функциональным. На данном этапе обучения у студента происходит разделение логико-математического и гуманитарного понимания типа данных (решая Рефал-задачи, студент узнает что слово - это не всегда список букв, что оно в зависимости от языка может быть неделимым - термом, - следовательно, необходимо учитывать лишь логику языка программирования, а не графическое изображение текста). Рефал также знакомит студентов с техникой шаблонов данных, сопоставлением с образцом, рекурсией и плюсами ее использования. У студентов вырабатывается гибкость мышления, что дает навыки формулировки требований и постановок задач (и подзадач).
Удобность данного языка в обучении первокурсников подтверждается также тем, что отдельные студенты в конце первой сессии уже могут написать Рефал-программу получения самых релевантных слов из текста, чего не могут сделать на Pascal и C. Известен так же случай, когда студенты первого курса предложили решение “задачи о золотой горе” [4] на языке Рефал, которое оказалось эффективнее решения преподавателя (на что тот, по рассказам студентов, сильно обиделся).
Другим интересным примером является решение задачи “Игра ХО”, в которой компьютер играет с человеком и не проигрывает. Студенту было предложено решить задачу на любом изученном ранее языке, после чего он написал программу на Базисном Рефале, которая просчитывает все ходы и выбирает оптимальный.
^ Диалект Рефала
Для дальнейшего эффективного обучения студентов программированию с помощью декларативных языков, автором был разработан и реализован диалект языка Рефал, являющийся расширением Рефала-5. Был добавлен механизм определения пользовательских типов переменных с помощью РБНФ-подобной грамматики, что позволяет уже на раннем этапе обучать студентов работе с регулярными выражениями и формальными системами описания синтаксисов, протоколов и структур данных. В будущем язык предполагается применять для обучения метавычислениям, и исследованиям в этом направлении.
Выводы
Декларативное программирование уже доказало свою применимость и пользу как в науке, так и при решении практических задач. На практике проверено, что оно доступно начинающим программистам. Кроме того, имеется широкий простор для дальнейшего развития и научных исследований. Стимулирование этого направления полезно не только для науки, но и для бизнеса (скорость разработки программ), для развития страны в целом: лидерские позиции в передовых IT-отраслях (супер-компиляция, метавычисления), поддержка отечественного инновационного направления.
Предлагается использовать полученный в УдГУ опыт, обратить внимание на декларативные языки, в частности Рефал, и рассмотреть целесообразность их включения как альтернатив в образовательные стандарты наравне со стереотипами (структурное, ООП).
Литература
[1] - Н. Н. Непейвода, И. Н. Скопин Основания программирования. Москва, Ижевск. 2003 г.
[2] - Турчин В.Ф. Эквивалентные преобразования рекурсивных функций описанных на Рефале // Теория языков и методы программирования. Труды Симпозиума по теории языков и методам программирования. Киев–Алушта, 1972. стр.31–42.
[3] - Futamura Y. Partial Evaluation of Computation Process – An Approach to a Compiler-Compiler // Systems. Computers. Controls., Vol. 2(5), pp.45-50, 1971.
[4] - http://ru.wikibooks.org/wiki/Рекурсия:_плохо_или_хорошо
www.ronl.ru
Реферат на тему:
Шаблон: Просмотр • Обсуждение • Править |
Декларативное программирование — термин с двумя различными значениями.
Согласно первому определению, программа «декларативна», если она описывает каково́ нечто, а не как его создать. Например, веб-страницы на HTML декларативны, так как они описывают что должна содержать страница, а не как отображать страницу на экране. Этот подход отличается от языков императивного программирования, требующих от программиста указывать алгоритм для исполнения. В типично декларативном языке программирования XSLT, последовательность исполнения зависит, как правило, от входящего XML (в случае с использованием push-модели — «проталкивание»), в случае использования pull-модели (вытягивания), XSLT вырождается в частный случай функционального программирования и легко может быть заменена на аналогичный код в XQuery.
Согласно второму определению, программа «декларативна», если она написана на исключительно функциональном, логическом или языке программирования с ограничениями. Выражение «декларативный язык» иногда употребляется для описания всех таких языков программирования как группы, чтобы подчеркнуть их отличие от императивных языков.
Программы на языках декларативного программирования легко поддаются методикам метапрограммирования — когда программа может генерироваться по её описанию. Например XSLT-программа может быть сгенерирована из файла XML (часто с помощью другой XSLT) — см. Schematron.
Это [декларативное] программирование подразумевает использование данных, а не написание кода для того, чтобы заставить приложение или компонент выполнить что-либо. Написание исходного кода иногда называют императивным программированием. [...] Очевидно, со временем декларативное программирование получит еще большее распространение. Примеры подобных технологий уже сейчас можно увидеть в Microsoft ASP.NET и Microsoft Windows Communication Foundation. Даже в Microsoft Windows Presentation Foundation программисты могут разрабатывать пользовательский интерфейс, объявляя (декларируя) его разметку и поведение, используя язык разметки XAML." Джеффри Рихтер[1] |
Категории: Парадигмы программирования, Декларативное программирование.
Текст доступен по лицензии Creative Commons Attribution-ShareAlike.wreferat.baza-referat.ru
Языки, которые мы уже обсудили, имеют одну общую черту: базовый оператор в них - это оператор присваивания, который заставляет компьютер переместить данные из одного места в другое. Принципиально иной подход к программированию заключается в том, чтобы описывать вычисление, используя уравнения, функции, логические выводы и т. п. Особое внимание в декларативном программировании уделяется тому, что нужно сделать, а не тому как это нужно сделать.
Мы рассмотрим особенности двух ветвей декларативного программирования: функциональное, основанное на математическом понятии функции, которая не изменяет свое окружение, в отличии от функций в процедурных языках, допускающих побочные эффекты, и логическое, в котором программы выражены в виде формул математической логики и компьютер для решения задачи пытается вывести логические следствия из них.
Функциональная программа состоит из совокупности определений функций, которые в свою очередь представляют собой вызовы других функций и предложений, управляющих последовательностью вызовов. При этом функции часто либо прямо, либо опосредованно вызывают сами себя (рекурсия).
Каждая функция возвращает некоторое значение в вызвавшую его функцию, вычисление которой после этого продолжается; этот процесс повторяется до тех пор, пока начавшая процесс вычислений функция не вернет конечный результат пользователю.
"Чистое" функциональное программирование не содержит оператора присваивания, в нем вычисление любой функции не приводит ни к каким побочным эффектам, отличным от собственно вычисления ее значения. Разветвление вычислений основано на механизме обработке аргументов условного предложения, а циклические вычисления реализуются с помощью рекурсии.
Отсутствие оператора присваивания делает переменные, используемые в функциональных языках программирования, очень похожими на переменные в математике - получив однажды свои значения, они больше никогда их не меняют. Отсутствие побочных эффектов в процессе вычисления функций приводит к тому, что порядок выполнения отдельных фрагментов программы не существенен - итоговое значение в любом случае будет одинаковым.
Функциональное программирование весьма красиво и иногда в качестве первого языка программирования, изучаемого студентами, выбирается Haskell или Lisp. Для успешного овладения данным стилем программирования, впрочем, необходимо весьма глубокое понимание многих разделов математики.
Пример
Хорошей иллюстрацией функционального стиля программирования является программа на языке Haskell для получения всех пифагоровых троек чисел, не превосходящих заданного числа (пифагоровой тройкой называют три целых числа, являющихся сторонами некоторого прямоугольного треугольника).
Создайте файл с именем triads.hs в который поместите следующий текст:
triads n = [(x,y,z) | let ns = [1 .. n], x <- ns, y <- ns, z <- ns, x*x+y*y == z*z]Такую программу легко понять: получить все тройки целых чисел x, y и z, не превышающих заданного числа n и удовлетворяющих условию x2+y2=z2.
Для запуска интерпретатора языка Haskell в командной строке наберите hugs. После появления приглашения > введите команду :load triads.hs для загрузки содержимого файла в память. Теперь можно находить пифагоровы триады, например, при помощи следующего вызова функции triads 50. Для завершения работы интерпретатора наберите :quit и нажмите на клавишу Enter.
Следующая программа на языке Haskell уже не столь очевидна, но она поражает своей краткостью.
Пример
Создайте файл с именем primes.hs и поместите в него следующие строки:
triads n = [(x,y,z) | let ns = [1 .. n], x <- ns, y <- ns, z <- ns, x*x+y*y == z*z]После старта интерпретатора hugs и загрузки в него этой программы достаточно вызвать функцию primes (без аргументов) и программа начнет печатать простые числа до тех пор, пока вы не прервете ее выполнение, нажав комбинацию клавиш Ctrl+C.
Еще одной реализацией декларативного стиля является логическое программирование, основанное на логике предикатов, которое подробно рассматривается в следующей главе.
Логика предикатов - это ветвь формальной логики, получившая развитие в XX веке. В логическом программировании основное внимание уделяется описанию структуры прикладной задачи, а не выработке предписаний компьютеру, что ему следует делать. Prolog (от французского PROgrammation LOGique, далее Пролог) - это наиболее известный язык логического программирования. Этот язык (наряду с функциональным языком Lisp) часто называют языком искусственного интеллекта - с его помощью решаются задачи создания экспертных систем и систем обработки естественных языков.
Пример
Для иллюстрации принципов логического программирования с использованием языка Пролог приведем программу, находящую решение известной головоломки "Ханойская башня", изобретенной французским математиком Люка в 1883 году и украшенной им же легендой.
"Где-то в непроходимых джунглях, недалеко от города Ханоя, есть монастырь бога Брамы. В начале времен, когда Брама создавал Мир, он воздвиг в этом монастыре три высоких алмазных стержня и на один из них возложил 64 диска, сделанных из чистого золота. Он приказал монахам перенести эту башню на другой стержень (в соответствии с правилами, разумеется). С этого времени монахи работают день и ночь. Когда они закончат свой труд, наступит конец света."
Правила перемещения дисков таковы: разрешается снимать со стержня только верхний диск, запрещается класть больший диск на меньший, при каждом ходе передвигается только один диск.
Поместите в файл с именем hanoi.pl следующий текст (символ % начинает комментарий, который не обязательно помещать в файл).
% move(число_дисков, откуда, куда, через) move(1,X,Y,_) :- write('Move top disk from '), write(X), write(' to '), write(Y), nl. move(N,X,Y,Z) :- N>1, M is N-1, move(M,X,Z,Y), move(1,X,Y,_), move(M,Z,Y,X).Запустите интерпретатор языка Пролог при помощи команды pl. После появления приглашения к работе (?- ) загрузите содержимое файла командой [hanoi]. (расширение файла указывать не нужно, а вот точка после закрывающей квадратной скобки необходима). Теперь, чтобы заставить Пролог решить задачу о перемещении трех дисков, введите следующий запрос:
move(3,left,right,center).(не забудьте о точке в конце ввода). Ниже приводится порядок перемещения дисков, найденный этой программой.
Для завершения работы с интерпретатором наберите команду halt. и нажмите Enter.
Задания
www.linuxcookbook.ru
Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 1940-х годах. Теоретической моделью процедурного программирования служит алгоритмическая система под названием Машина Тьюринга.
Программа на процедурном языке программирования состоит из последовательности операторов (инструкций), задающих процедуру решения задачи. Основным является оператор присваивания, служащий для изменения содержимого областей памяти. Концепция памяти как хранилища значений, содержимое которого может обновляться операторами программы, является фундаментальной в императивном программировании.
Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней.
Процедурный язык программирования предоставляет возможность программисту определять каждый шаг в процессе решения задачи. Особенность таких языков программирования состоит в том, что задачи разбиваются на шаги и решаются шаг за шагом. Используя процедурный язык, программист определяет языковые конструкции для выполнения последовательности алгоритмических шагов.
(по Чернацкому) в языке программирования есть основная программа и подпрограмма. В зависимости от языка программирования подпрограммы оформляются по разному. Примеры: Pascal, СИ, Кобол.
Декларативное программирование
Декларативное программирование — термин с двумя различными значениями.
Согласно первому определению, программа «декларативна», если она описывает каково́ нечто, а не как его создать. Например, веб-страницы на HTML декларативны, так как они описывают что должна содержать страница, а не как отображать страницу на экране. Этот подход отличается от языков императивного программирования, требующих от программиста указывать алгоритм для исполнения. В типично декларативном языке программирования XSLT, последовательность исполнения зависит, как правило, от входящего XML (в случае с использованием push-модели — «проталкивание»), в случае использования pull-модели (вытягивания), XSLT вырождается в частный случай функционального программирования и легко может быть заменена на аналогичный код в XQuery.
Согласно второму определению, программа «декларативна», если она написана на исключительно функциональном, логическом или языке программирования с ограничениями. Выражение «декларативный язык» иногда употребляется для описания всех таких языков программирования как группы, чтобы подчеркнуть их отличие от императивных языков.
Программы на языках декларативного программирования легко поддаются методикам метапрограммирования — когда программа может генерироваться по её описанию. Например XSLT-программа может быть сгенерирована из файла XML (часто с помощью другой XSLT) — см. Schematron.
Объе́ктно-ориенти́рованное, или объектное, программи́рование (в дальнейшем ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов. В случае языков с прототипированием вместо классов используются объекты-прототипы.
Основные понятия
Абстракция
Абстрагирование — это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно, абстракция — это набор всех таких характеристик.
Инкапсуляция
Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.
Класс
Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности (объекта). Фактически он описывает устройство объекта, являясь своего рода чертежом. Говорят, что объект — это экземпляр класса. При этом в некоторых исполняющих системах класс также может представляться некоторым объектом при выполнении программы посредством динамической идентификации типа данных. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.
Наследование
Наследование — это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником или производным классом.
Объект
Сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса или копирования прототипа (например, после запуска результатов компиляции и связывания исходного кода на выполнение).
Полиморфизм
Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Прототип
Прототип — это объект-образец, по образу и подобию которого создаются другие объекты. Объекты-копии могут сохранять связь с родительским объектом, автоматически наследуя изменения в прототипе; эта особенность определяется в рамках конкретного языка.
[править]
Определение ООП и его основные концепции
В центре ООП находится понятие объекта. Объект — это сущность, которой можно посылать сообщения, и которая может на них реагировать, используя свои данные. Данные объекта скрыты от остальной программы. Сокрытие данных называется инкапсуляцией.
Наличие инкапсуляции достаточно для объектности языка программирования, но ещё не означает его объектной ориентированности — для этого требуется наличие наследования.
Но даже наличие инкапсуляции и наследования не делает язык программирования в полной мере объектным с точки зрения ООП. Основные преимущества ООП проявляются только в том случае, когда в языке программирования реализован полиморфизм; то есть возможность объектов с одинаковой спецификацией иметь различную реализацию.
Язык Self, соблюдая многие исходные положения объектно-ориентированного программирования, ввёл альтернативное классам понятие прототипа, положив начало прототипному программированию, считающемуся подвидом объектного.
studfiles.net
Читайте также:
|
В предыдущих главах мы говорили о том, что формальная логика дает общий алгоритм решения задач, вокруг которого строится все декларативное программирование. В этом разделе мы познакомимся с основами этого алгоритма и вкратце обсудим декларативные языки программирования.
Логическая дедукция
Предположим, … нам известно, что Кермит либо на сцене, либо болен, и нам сообщают, что Кермит не на сцене. Можно сделать вывод, что Кермит болен. Это пример дедуктивного метода, который называется резолюцией (resolution).
Для того чтобы лучше понять этот метод, прежде всего условимся обозначать простые высказывания заглавными буквами, а отрицание высказывания — символом «^». Например, обозначим высказывание «Кермит — принц» буквой А, высказывание «Госпожа Пигги — актриса» буквой В. Тогда выражение
A OR В
будет означать: «Кермит — принц, или Госпожа Пигги — актриса». А выражение
В AND -A
будет означать: «Госпожа Пигги — актриса и Кермит не принц». Для обозначения импликации (из А следует В) мы будем использовать стрелку. Например, выражение
А -» В
означает: «Если Кермит — принц, то госпожа Пигги — актриса».
Согласно логической операции резолюции, если у нас есть два высказывания
Р OR Q И
R OR -Q.
то из них следует высказывание
Р OR R.
В таком случае из двух исходных высказываний выводится третье, которое называется резольвентой (resolvent). Обратите внимание на то, что резольвента является логическим следствием исходных высказываний. То есть если исходные высказывания истинны, то и резольвента должна быть истинной. (Если Q истинно, тогда R тоже должно быть истинно; а если Q ложно, тогда Р должно быть истинно. Следовательно, независимо от истинности Q либо Р, либо R должно быть истинным).
Исходные высказывания операции резолюции и их резольвента соединяются линиями (рис. 5.25). Обратите внимание на то, что операцию резолюции можно применить только к высказываниям, имеющим форму логического выражения, то есть высказываниям, компоненты (предикаты) которых соединены логическим оператором, например OR1. Так высказывание Р OR Q является дизъюнкцией, а высказывание Р —> Q нет. Однако этот факт не создает никаких трудностей, поскольку существует теорема математической логики, согласно которой любое высказывание, состоящее из предикатов первого порядка, можно записать в виде дизъюнкции. Мы не будем рассматривать эту теорему, а только отметим, что высказывание Р -> Q эквивалентно высказыванию Q OR -"P.
Набор высказываний называется несовместным, если все высказывания не могут быть истинны одновременно. Другими словами, несовместный набор высказываний является внутренне противоречивым. Самый простой пример — это комбинация высказывания Р и его отрицания -°Р. Специалисты по логике показали, что доказать несовместность высказываний можно с помощью многократного выполнения операции резолюции. Согласно правилу, если в результате многократного выполнения операции резолюции получается пустое высказывание (результат операции резолюции над высказываниями Р и ->Р), то исходный набор высказываний является несовместным. Можно доказать (рис. 5.26) несовместность высказываний
Р OR Q R OR -Q -R -P
Предположим, нам нужно доказать, что из некоторого набора высказываний следует Р. Доказать истинность Р — то же самое, что доказать ложность высказывания "’Р. Поэтому, чтобы показать, что из исходного набора высказываний следует Р, нам просто нужно выполнять операцию резолюции над исходными высказы-
ваниями и высказыванием ->Р, пока мы не получим пустое высказывание. Получив такой результат, можно сделать вывод, что высказывание ~>Р несовместно с исходными высказываниями и, следовательно, из них следует Р.
Прежде чем приступить к рассмотрению операции резолюции в программировании, следует затронуть еще один вопрос. Предположим, у нас есть два высказывания
(Маша находится в X) -» (Машина овечка находится в X). где X обозначает любое место, и (Маша находится дома)
В дизъюнктивной форме эти высказывания имеют вид (Машина овечка находится в X) OR -ЧМаша находится в X) и (Маша находится дома)
На первый взгляд может показаться, что над этими высказываниями нельзя выполнить операцию резолюции. В данном случае важно понять, что высказывание (Маша находится в X) является высказыванием о месте вообще и доме в частности. Поэтому над частным случаем первого высказывания
(Машина овечка находится дома) ИЛИ -■(Маша находится дома)
и высказыванием
(Маша находится дома)
можно выполнить операцию резолюции. В результате мы получим
(Машина овечка находится дома)
Процесс присвоения значений переменным (например, присвоение значения «дом» переменной X) для выполнения операции резолюции называется унификацией (unification). Именно эта операция позволяет применять общие высказывания в отдельных прикладных задачах.
refac.ru
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования «Уральский государственный университет им. А.М. Горького» ИОНЦ «Информационная безопасность»
ПодробнееМИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ УТВЕРЖДАЮ Декан ФВТ, профессор Б.Д. Шашков 2003 г. РАБОЧАЯ ПРОГРАММА ДИСЦИПЛИНЫ Рекурсивно-логическое программирование
ПодробнееПравительство Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования Национальный исследовательский университет «Высшая школа экономики»
Подробнее1 9. Функциональное программирование Математические функции выражают связь между параметрами (входом) и результатом (выходом) некоторого процесса. Так как вычисление это тоже процесс, имеющий вход и выход,
ПодробнееПЕРВОЕ ВЫСШЕЕ ТЕХНИЧЕСКОЕ УЧЕБНОЕ ЗАВЕДЕНИЕ РОССИИ МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
ПодробнееПравительство Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования «Национальный исследовательский университет Высшая школа экономики»
ПодробнееПравительство Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования «Национальный исследовательский университет Высшая школа экономики»
ПодробнееОтсечение и его использование. Лекция 4 (Часть 3). Совместное использование рекурсии, отсечения и отката при организации циклов. Специальности : 230105, 010501 Применение циклов в Пролог-программах. Основная
ПодробнееФункциональное программирование Введение Мирон Костенко, Владимир Ульянцев СПбГУ ИТМО, rain.ifmo.ru/cat 2009 программирование 2009 1 / 26 Императивное программирование Императивные (или процедурные) программы
ПодробнееООП 44.03.05 Педагогическое образование (с двумя профилями подготовки), СИСТЕМА МЕНЕДЖМЕНТА КАЧЕСТВА РАБОЧАЯ ПРОГРАММА ДИСЦИПЛИНЫ Б3.В.ОД.20 Основы искусственного интеллекта по направлению подготовки бакалавриата
ПодробнееПЕРВОЕ ВЫСШЕЕ ТЕХНИЧЕСКОЕ УЧЕБНОЕ ЗАВЕДЕНИЕ РОССИИ МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
Подробнее2 Оглавление 1. Цели и задачи освоения дисциплины...4 2. Место дисциплины в структуре ООП ВПО...4 3. Требования к результатам освоения содержания дисциплины...5 4. Содержание и структура дисциплины...6
ПодробнееМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ Государственное образовательное учреждение высшего профессионального образования «Мурманский государственный гуманитарный университет» (МГГУ) РАБОЧАЯ ПРОГРАММА ДИСЦИПЛИНЫ
ПодробнееФедеральное государственное автономное образовательное учреждение высшего профессионального образования Национальный исследовательский университет Высшая школа экономики Факультет БИЗНЕС-ИНФОРМАТИКИ Отделение
ПодробнееПравительство Российской Федерации Государственное образовательное бюджетное учреждение высшего профессионального образования «Государственный университет - Высшая школа экономики» Факультет Бизнес-информатики
ПодробнееФедеральное государственное автономное образовательное учреждение высшего профессионального образования Национальный исследовательский университет Высшая школа экономики Факультет БИЗНЕС-ИНФОРМАТИКИ Отделение
ПодробнееПравительство Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования «Национальный исследовательский университет Высшая школа экономики»
ПодробнееФедеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Академия гражданской защиты Министерства Российской Федерации по делам гражданской обороны, чрезвычайным
ПодробнееФедеральное государственное бюджетное образовательное учреждение высшего образования «Казанский национальный исследовательский технический университет им. А.Н. Туполева КАИ» (КНИТУ КАИ) Зеленодольский
ПодробнееФедеральное агентство связи федеральное государственное образовательное бюджетное учреждение высшего профессионального образования «Сибирский государственный университет телекоммуникаций и информатики»
ПодробнееПравительство Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования "Национальный исследовательский университет "Высшая школа экономики"
ПодробнееУчреждение образования «Белорусский государственный университет информатики и радиоэлектроники» УТВЕРЖДАЮ Проректор по учебной работе и менеджменту качества 22.01.2015г. Е. Н. Живицкая Регистрационный
ПодробнееПравительство Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования "Национальный исследовательский университет "Высшая школа экономики"
Подробнее... Парадигмы программирования (часть 1) Алексей Островский Физико-технический учебно-научный центр НАН Украины 28 ноября 2014 г. 1 / 32 ... Определение парадигмы Определение Парадигма программирования
ПодробнееМинистерство образования и науки Российской Федерации НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ЭКОНОМИКИ И УПРАВЛЕНИЯ «НИНХ» Кафедра информационных технологий МЕТОДИЧЕСКОЕ РУКОВОДСТВО ПО ОРГАНИЗАЦИИ САМОСТОЯТЕЛЬНОЙ
ПодробнееПравительство Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования Национальный исследовательский университет "Высшая школа экономики"
ПодробнееПравительство Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования "Национальный исследовательский университет "Высшая школа экономики"
ПодробнееПрограмма дополнительного образования «ПРОГРАММИРУЕМ НА ЯЗЫКЕ ПАСКАЛЬ» Возраст обучающихся 11-16 лет (7,8,9 класс) Срок реализации 3 года Количество часов 102/1 Составитель: Сафиуллова Л.Е. Учитель информатики
Подробнее1 . 2 РАБОЧАЯ ПРОГРАММА УЧЕБНОЙ ДИСЦИПЛИНЫ Основы программирования 2012 г. 3 4 . СОДЕРЖАНИЕ стр. 1 ПАСПОРТ РАБОЧЕЙ ПРОГРАММЫ УЧЕБНОЙ ДИСЦИПЛИНЫ... 2 СТРУКТУРА И СОДЕРЖАНИЕ УЧЕБНОЙ ДИСЦИПЛИНЫ.....7 3 УСЛОВИЯ
ПодробнееТитульный лист рабочей учебной программы Ф СО ПГУ 7.18.3/30 Министерство образования и науки Республики Казахстан Павлодарский государственный университет им. С. Торайгырова Кафедра «Вычислительная техника
ПодробнееМинистерство образования Республики Беларусь Учебно-методическое объединение высших учебных заведений Республики Беларусь по естественнонаучному образованию ^ВЕРЖ^ Первый заместитель Министра образования
Подробнееdocplayer.ru
Первыми императивными языками были машинные коды – «родной язык» программирования для компьютера. В этих языках инструкции были крайне просты, что снижало нагрузку на компьютеры, однако затрудняло написание крупных программ. В 1954 появился первый язык программирования –Fortran, а затем Algol, Pascal и C.
В отличие от функционального программирования (относящегося к декларативной парадигме), при императивном подходе интенсивно используется присваивание, что увеличивает сложность моделей вычислений и делает императивные программы подверженными специфическим ошибкам, не встречающимся при функциональном программировании
То есть одной из характерных черт императивного программирования является наличие переменных с операцией «разрушающего присвоения». Значит, имеется переменная А, которая содержит значение Х. На очередном шаге алгоритм предписывает присвоить переменной А значение Y. То значение, которое было у переменной А, будет «навсегда забыто». На практике это означает «переход между состояниями под управлением функции переходов».
Примерами могут служить такие языки, как FORTRAN, BASIC, ALGOL, PL/1, PASCAL, C, ADA.
Покажем на бытовом примере императивную программу:
Procedure Вскипятить_чайник
begin
Зажечь плиту;
Взять чайник;
Налить в чайник воды;
Поставить на плиту;
Подождать 5 минут;
end
begin
if Чайник не пуст then
Вылить из чайника воду;
Вскипятить_чайник;
end.
Императивное программирование наиболее пригодно для реализации небольших подзадач, где очень важна скорость исполнения на современных компьютерах. Кроме этого, работа с внешними устройствами, как правило, описывается в терминах последовательного исполнения операций («открыть кран, набрать воды»), что делает такие задачи идеальными кандидатами на императивную реализацию.
Декларативное программирование
В 60-х годах возникает новый подход к программированию, который до сих пор успешно конкурирует с императивным, а именно, декларативный подход.
Декларативное программирование подразумевает использование данных, а не написание кода для того, чтобы заставить приложение или компонент выполнить что-либо.
На начальном этапе развития декларативным языкам программирования было сложно конкурировать с императивными в силу объективных трудностей эффективной реализации трансляторов. Программы работали медленнее, однако они могли решать более абстрактные задачи с меньшими трудозатратами.
В основе декларативных языков лежит формализованная человеческая логика. Человек лишь описывает решаемую задачу, а поиском решения занимается императивная система программирования. То есть декларативное описание задачи более наглядно и легче формулируется, так как мы чаще знаем, чего хотим, но не знаем как сделать.
В итоге получаем значительно большую скорость разработки приложений, значительно меньший размер исходного кода, легкость записи знаний на декларативных языках, более понятные, по сравнению с императивными языками, программы.
Известна классификация языков программирования по их близости либо к машинному языку, либо к естественному человеческому языку. Те, что ближе к компьютеру, относят к языкам низкого уровня, а те, что ближе к человеку, называют языками высокого уровня.
В этом смысле декларативные языки можно назвать языками сверхвысокого или наивысшего уровня, поскольку они очень близки к человеческому языку и человеческому мышлению.
Декларативные программы не используют понятия состояния и, в частности, не содержат переменных и операторов присваивания.
Разновидностями декларативного программирования являются функциональное и логическое программирование, хотя в действительности программы на таких языках нередко содержат алгоритмические составляющие, так что правильнее говорить об ограниченных формах декларативного программирования.
Примером декларативного языка служит HTML, описывающий содержание страницы, а не способ её отображения на экране. Популярный сборщик пакетов Maven описывает лишь зависимости между пакетами, а не последовательность их установки. Язык запросов SQL описывает, что мы хотим достать из базы данных, как именно решает сервер.
Другие характерные примеры декларативных языков программирования: Haskell, Prolog.
С математической точки зрения, декларативная программа представляет собой формальную теорию, а её выполнение является автоматическим доказательством этой теории.
Билет 7
Функциональное и процедурное программирование
Прежде чем говорить непосредственно о данных понятиях, расскажем определение парадигмы программирования.
Парадигма программирования – совокупность идей и понятий, определяющая стиль написания программы.
Одним из путей развития декларативного стиля программирования стал функциональный подход, возникший после создания языка LISP
Функциональное программирование — парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).
Противопоставляется парадигме императивного программирования, которая описывает процесс вычислений как последовательное изменение состояний (в значении, подобном таковому в теории автоматов). При необходимости, в функциональном программировании вся совокупность последовательных состояний вычислительного процесса представляется явным образом, например, как список.
Функциональное программирование предполагает обходиться вычислением результатов функций от исходных данных и результатов других функций, и не предполагает явного хранения состояния программы. Соответственно, не предполагает оно и изменяемость этого состояния (в отличие от императивного, где одной из базовых концепций является переменная, хранящая своё значение и позволяющая менять его по мере выполнения алгоритма).
Сильные стороны:
1) Повышение надежности кода (за счёт чёткой структуризации и отсутствия необходимости отслеживания побочных эффектов).
2) Удобство организации модульного тестирования (возможность протестировать каждую функцию в программе, просто вычислив её от различных наборов значений аргументов).
3) Возможности оптимизации при компиляции.
4) Возможности параллелизма (всегда допустимо параллельное вычисление двух различных параметров. Порядок их вычисления не может оказать влияния на результат вызова).
Недостатки:
Недостатки функционального программирования вытекают из тех же самых его особенностей.
1) Отсутствие присваиваний и замена их на порождение новых данных приводят к необходимости постоянного выделения и автоматического освобождения памяти, поэтому в системе исполнения функциональной программы обязательным компонентом становится высокоэффективный сборщик мусора.
2) Нестрогая модель вычислений приводит к непредсказуемому порядку вызова функций, что создает проблемы при вводе-выводе, где порядок выполнения операций важен.
Для преодоления недостатков функциональных программ уже первые языки функционального программирования включали не только чисто функциональные средства, но и механизмы императивного программирования (присваивание, цикл, «неявный PROGN» были уже в LISPе). Использование таких средств позволяет решить некоторые практические проблемы, но означает отход от идей (и преимуществ) функционального программирования и написание императивных программ на функциональных языках. В чистых функциональных языках эти проблемы решаются другими средствами, например, в языке Haskell ввод-вывод реализован при помощи монад — нетривиальной концепции, позаимствованной из теории категорий.
Примерами языков функционального программирования могут являться Python, Lisp, Haskell, Hope, ML (Meta Language — семейство строгих языков функционального программирования.)
Таким образом, при создании программ на функциональных языках программист сосредотачивается на области исследований (предметной области) и в меньшей степени заботится о рутинных операциях (обеспечении правильного с точки зрения компьютера представления данных, "сборке мусора" и т.д.).
Процедурное программирование — программирование на императивном языке, при котором последовательно выполняемые операторы можно собрать в подпрограммы, то есть более крупные целостные единицы кода, с помощью механизмов самого языка.
То есть процедурное программирование представляет собой последовательность команд, определяющих алгоритм решения задачи.
Основная идея процедурного программирования - использование памяти для хранения данных.
Основная команда - присвоение, с помощью которой определяется и меняется память компьютера. Программа производит преобразование содержимого памяти, изменяя его от исходного состояния к результирующему.
Рассмотрим примеры, более подробно описывающие процедурный язык в разные промежутки времени. Различают следующие языки процедурного программирования:
1) Язык Фортран создан в начале 50-х годов 20-го века для программирования научно-технических задач; Первая публикация о нем появилась в 1954 г. Объектами языка являются целые и вещественные числа и числовые переменные. Выражения в нем формируются с помощью четырех арифметических действий: возведения в степень, логических операций И, ИЛИ, НЕ, операций отношения и круглых скобок. Основные операторы Фортрана — ввод, вывод, присваивание, условный и безусловный переход, цикл, вызов подпрограмм.
2) Кобол – создан в конце 60-х годов 20-го века для решения задач обработки больших объемов данных, хранящихся на различных носителях данных; Широко используется для решения учетно-экономических и управленческих задач. Программа на Коболе имеет вид ряда предложений на английском языке и напоминает обычный текст. Группы последовательно записанных операторов объединяются в предложения, предложения — в параграфы, параграфы — в секции. Программист присваивает параграфам и секциям имена (метки), что облегчает непосредственное обращение к нужному участку программы.
3) Алгол (1960 год) – это многоцелевой расширенный язык программирования. В нем впервые введены понятия “блочная структура программы” и “динамическое распределение памяти”;
4) Язык Паскаль (PASCAL) (1968-1971гг)- язык процедурного программирования наиболее популярный для ПК, который и в настоящее время успешно применяется. В основу языка Pascal положен подход от общей задачи к частным (более простым и меньшим по объему). К основным принципам, которыми обладает Паскаль, можно отнести: а) Структурное программирование, которое основано на использовании подпрограмм и независимых структур данных; б) Программирование “сверху-вниз”, когда задача делится на простые, самостоятельно решаемые задачи. Затем выстраивается решение исходной задачи полностью сверху вниз.
5) К языкам процедурного программирования можно отнести язык АДА (1979 г) Язык назван в честь первой программистки Ады Лавлейс- дочери Байрона. Его отличает модульность конструкций.
6) Язык СИ (начало 70-х годов). Одной из особенностей языка СИ является то, что различия между выражениями и операторами сглаживаются, что приближает его к функциональным языкам программирования. Кроме того, в языке СИ отсутствует понятие процедуры, а использование подпрограмм основано на понятии функции, которая может сочетать в себе возможности процедуры.
Теоретической моделью процедурного программирования служит алгоритмическая система под названием Машина Тьюринга.
Программа на процедурном языке программирования состоит из последовательности операторов (инструкций), задающих процедуру решения задачи. Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней.
Билет 8
Объектно-ориентированное программирование
Важным шагом на пути к совершенствованию языков программирования стало появление объектно-ориентированного подхода к программированию (ООП) и соответствующего класса языков.
Объектно-ориентированное программирование — это парадигма программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
Для лучшего понимания ООП необходимо знать следующие определения:
Класс – это тип, описывающий устройство объектов. Понятие «класс» подразумевает некоторое поведение и способ представления.Класс можно сравнить с чертежом, согласно которому создаются объекты. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.Классявляется описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности – объекта.
Объект – сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса (например, после запуска результатов компиляции исходного кода на выполнение).Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления. Говорят, что объект — это экземпляр класса.
Прототип – это объект-образец, по образу и подобию которого создаются другие объекты.
Поля (или свойства, в рамках C++ это можно считать синонимом) описывают то, какие данные смогут хранить экземпляры класса (т.е. объекты). Конкретные значения сохраняются уже внутри объектов. Поля объявляются в теле класса.
Методы класса — это функции, которые смогут применяться к экземплярам класса. Грубо говоря, метод — это функция, объявленная внутри класса и предназначенная для работы с его объектами.
Несомненным преимуществом данного подхода является концептуальная близость к предметной области произвольной структуры и назначения. Механизм наследования атрибутов и методов позволяет строить производные понятия на основе базовых и таким образом создавать модель сколь угодно сложной предметной области с заданными свойствами.
Еще одним теоретически интересным и практически важным свойством объектно- ориентированного подхода является поддержка механизма обработки событий, которые изменяют атрибуты объектов и моделируют их взаимодействие в предметной области.
ООП основано на «трех китах» - трех важнейших принципах, придающих объектам новые свойства. Этими принципами являются инкапсуляция, наследование и полиморфизм.
1) Наследование – свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником, дочерним или производным классом.
2) Полиморфизм – свойство, позволяющее присваивать действию одно и то же имя, которое затем совместно используется вниз и вверх по иерархии объектов, причем каждый объект иерархии выполняет это действие способом, именно ему подходящим.
3) Инкапсуляция- свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Суть инкапсуляции: Переменные состояния объекта скрыты от внешнего мира. Изменение состояния объекта (его переменных) возможно ТОЛЬКО с помощью его методов (операций). Почему это так важно? Этот принцип позволяет защитить переменные состояния объекта от неправильного их использования.Применение этого метода ведет к снижению эффективности доступа к элементам объекта. Это обусловлено необходимостью вызова методов для изменения внутренних элементов (переменных) объекта. Однако, при современном уровне развития вычислительной техники, эти потери в эффективности не играют существенной роли.
Пожалуй, наиболее известным примером объектно-ориентированного языка программирования является язык C++, развившийся из императивного языка С.
Наиболее востребованными объектно-ориентированными языками программирования, помимо C++, являются на сегодняшний момент Java и C#. Другие примеры объектно-ориентированных языков программирования: Visual Basic, Eiffel, Oberon.
Билет 9
Методы типового проектирования. Унифицированный язык визуального моделирования (UML – Unified Modeling Language)
Типовое проектирование информационных систем предполагает создание системы из готовых типовых элементов.
Основополагающим требованием для применения методов типового проектирования является возможность декомпозиции проектируемой ИС на множество составляющих компонентов (подсистем, комплексов задач, программных модулей и т.д.). Для реализации выделенных компонентов выбираются имеющиеся на рынке типовые проектные решения, которые настраиваются на особенности конкретного предприятия.
Для реализации типового проектирования используются два подхода:
1) параметрически-ориентированное
2) модельно-ориентированное проектирование.
Параметрически-ориентированное проектирование включает следующие этапы: определение критериев оценки пригодности пакетов прикладных программ (ППП) для решения поставленных задач, анализ и оценка доступных ППП по сформулированным критериям, выбор и закупка наибо- лее подходящего пакета, настройка параметров (доработка) закупленного ППП.
Модельно-ориентированное проектирование заключается в адаптации состава и характеристик типовой ИС в соответствии с моделью объекта автоматизации. Технология проектирования в этом случае должна обеспечивать единые средства для работы как с моделью типовой ИС, так и с моделью конкретного предприятия.
Модельно- ориентированное проектирование ИС предполагает, прежде всего, построение модели объекта автоматизации с использованием специального программного инструментария (например, SAP Business Engineering Workbench (BEW), BAAN Enterprise Modeler)
UML (Unified Modeling Language унифицированный язык моделирования) – язык графического описания для объектного моделирования в области разработки программного обеспечения.
UML является языком широкого профиля, это – открытый стандарт, использующий графические обозначения для создания абстрактной модели системы, называемой UML-моделью.
UML был создан для определения, визуализации, проектирования и документирования, в основном, программных систем. UML не является языком программирования, но на основании UML-моделей возможна генерация кода. UML позволяет также разработчикам программного обеспечения достигнуть соглашения в графических обозначениях для представления общих понятий (таких как класс, компонент, обобщение, агрегация и поведение) и больше сконцентрироваться на проектировании и архитектуре.
В 1994 году Гради Буч и Джеймс Рамбо, работавшие в компании Rational Software, объединили свои усилия для создания нового языка объектно-ориентированного моделирования. За основу языка ими были взяты методы моделирования Object-Modeling Technique и Booch. OMT был ориентирован на анализ, а Booch — на проектирование программных систем. В октябре 1995 года была выпущена предварительная версия 0.8 унифицированного метода (Unified Method). Осенью 1995 года к компании Rational присоединился Ивар Якобсон, автор метода Object-Oriented Software Engineering — OOSE. Группа разработчиков в OMG, в которую также входили Буч, Рамбо и Якобсон, выпустила спецификации UML версий 0.9 и 0.91 в июне и октябре 1996 года.
Сущности UML
В UML используются следующие виды диаграмм:
Структурные диаграммы:
· Диаграмма классов
· Диаграмма компонентов
· Диаграмма композитной/составной структуры
· Диаграмма кооперации
· Диаграмма развёртывания
· Диаграмма объектов
· Диаграмма пакетов
· Диаграмма профилей
Диаграммы поведения:
· Диаграмма деятельности
· Диаграмма состояний
· Диаграмма вариантов использования
Диаграммы взаимодействия:
· Диаграмма коммуникации
· Диаграмма обзора взаимодействия
· Диаграмма последовательности
· Диаграмма синхронизации
Рассмотрим некоторые диаграммы более подробно.
Диаграмма классов
Диаграмма классов (Class diagram) — статическая структурная диаграмма, описывающая структуру системы, демонстрирующая классы системы, их атрибуты, методы и зависимости между классами.
· Является центральным звеном ООП.
· Содержит информацию об объектах системы и статических связях между объектами
· Отражает декларативные знания о предметной области
· Оперирует понятиями класса, объекта, отношения, пакета.
Диаграмма компонентов (Component diagram) — статическая структурная диаграмма, показывает разбиение программной системы на структурные компоненты и связи (зависимости) между компонентами. В качестве физических компонентов могут выступать файлы, библиотеки, модули, исполняемые файлы, пакеты и т. п.
Диаграмма развёртывания (Deployment diagram, диаграмма размещения) — служит для моделирования работающих узлов иартефактов, развёрнутых на них. В UML 2 на узлах разворачиваются артефакты, в то время как в UML 1 на узлах разворачивались компоненты. Между артефактом и логическим элементом (компонентом), который он реализует, устанавливается зависимость манифестации.
Диаграмма объектов (Object diagram) — демонстрирует полный или частичный снимок моделируемой системы в заданный момент времени. На диаграмме объектов отображаются экземпляры классов (объекты) системы с указанием текущих значений их атрибутов и связей между объектами.
Преимущества UML
· UML объектно-ориентирован, в результате чего методы описания результатов анализа и проектирования семантически близки к методам программирования на современных объектно-ориентированных языках
· UML позволяет описать систему практически со всех возможных точек зрения и разные аспекты поведения системы;
· Диаграммы UML сравнительно просты для чтения после достаточно быстрого ознакомления с его синтаксисом;
· UML расширяет и позволяет вводить собственные текстовые и графические стереотипы что способствует его применению не только в сфере программной инженерии;
· UML получил широкое распространение и динамично развивается.
Билет 10
Аспекты ОО-разработки программного обеспечения. Абстрактные типы данных.
Первая и главная идея, лежащая в основе объектно-ориентированного подхода такова: программная система представляется в виде множества самостоятельных сущностей (объектов), взаимодействующих друг с другом. Каждая сущность сама отвечает за хранение информации, необходимой для ее жизни, и, кроме того, она имеет (реализует) свое собственное поведение.
Объектно-ориентированная разработка программного обеспечения связана с применением объектно-ориентированных методологий (технологий). Обычно эти объектно-ориентированные методологии поддерживаются инструментальными программными средствами.
Объектно-ориентированная разработка программ помогает справиться с такими сложными проблемами, как:
— уменьшение сложности программного обеспечения;
— повышение надежности программного обеспечения;
— обеспечение возможности модификации отдельных компонентов программного обеспечения без изменения остальных его компонентов;
— обеспечение возможности повторного использования отдельных компонентов программного обеспечения.
В настоящее время существует несколько технологий объектно-ориентированной разработки прикладных программных систем, в основе которых лежит построение и интерпретация на компьютере моделей этих систем. Одна из таких технологий - OMT (Object Modeling Techniques). Эта технология оказала большое влияние на других разработчиков объектно-ориентированных технологий, а книга, в которой она описана, является одной из наиболее часто цитируемых книг по данному направлению. Более того, система обозначений (графический язык) для описания моделей, предложенная в этой книге, широко применяется в других технологиях и в статьях по объектно-ориентированной разработке программных систем.
Абстрактный тип данных (АТД) — это тип данных, который предоставляет для работы с элементами этого типа определённый набор функций, а также возможность создавать элементы этого типа при помощи специальных функций.
Вся внутренняя структура такого типа спрятана от разработчика программного обеспечения — в этом и заключается суть абстракции. Абстрактный тип данных определяет набор функций, независимых от конкретной реализации типа, для оперирования его значениями. Конкретные реализации АТД называются структурами данных.
В большинстве современных императивных языков основной концепцией, используемой для описания абстракций в программном коде, является объектно-ориентированный подход. Объектно-ориентированное программирование (ООП) также, как и подход к программированию на основе АТД, является, в некоторой степени, развитием тех идей о модульном программировании.
В ООП результатом абстракции являются объекты, представляющие собой абстрактные машины (устройства), обладающие внутренним состоянием, которое можно изменять посылкой сообщений через методы объекта. Объекты обмениваются сообщениями друг с другом и, таким образом, реализуется алгоритм программной модели.
Абстрактные типы данных позволяют достичь модульности программных продуктов и иметь несколько альтернативных взаимозаменяемых реализаций отдельного модуля.
Билет 11
Повторное использование, расширяемость, совместимость – как этого достичь.
megaobuchalka.ru