КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Классы языков программирования
Императивные языки программирования – Бейсик, Паскаль, Си и прочие (включая объектно-ориентированные). Императивное программирование наиболее популярное. Характеризуются последовательным, пошаговым изменением состояния вычислителя. При этом управление изменениями полностью определено и полностью контролируемо. Одна из характерных черт императивного программирования – наличие переменных с операцией "разрушающего присвоения". То есть, была переменная А, было у нее значение Х. Алгоритм предписывает на очередном шаге присвоить переменной А значение Y. То значение, которое было у А, будет "навсегда забыто". Если задача описывается последовательным исполнением операций ("открыть кран, набрать воды"), то такие задачи идеальные кандидаты на императивную реализацию. Декларативные языки программирования: Функциональные языки программирования – LISP, ISWIM (If you See What I Mean), ML (Meta Language), Miranda В языках функционального программирования основными конструктивными элементами являются функции. Тексты программ на функциональных языках программирования описывают «как решить задачу», но не предписывают последовательность действий для решения. Способ решения задачи описывается при помощи зависимости функций друг от друга (в том числе возможны рекурсивные зависимости) без указания последовательности шагов. Функциональное программирование, как и другие модели "неимперативного" программирования, обычно применяется для решения задач, которые трудно сформулировать в терминах последовательных операций. Практически все задачи, связанные с искусственным интеллектом, попадают в эту категорию. Среди них следует отметить задачи распознавания образов, общение с пользователем на естественном языке, реализацию экспертных систем, автоматизированное доказательство теорем, символьные вычисления. Эти задачи далеки от традиционного прикладного программирования, поэтому им уделяется не так много внимания в учебных программах по информатике. Логические языки программирования – Prolog. Если в функциональном программировании программы - это выражения, и их исполнение заключается в вычислении их значения, то в логическом программировании программа представляет из себя некоторую теорию (описанную на достаточно ограниченном языке), и утверждение, которое нужно доказать. В доказательстве этого утверждения и будет заключаться исполнение программы.
Процедурные языки программирования – используют процедуры (подпрограммы, методы или функции). Процедуры содержат последовательность шагов для выполнения. В ходе выполнения программы любая процедура может быть вызвана из любой точки. Ада, Бейсик, Си, C++, С# (из Microsoft) КОБОЛ, Паскаль, Delphi, Фортран, Java, Перл, Visual Basic, PHP Объектно-ориентированные подход к программированию - это подход к разработке программного обеспечения, основанный на объектах, а не на процедурах. Java, Си, Visual Basic При процедурном программировании программа разбивается на части в соответствии с алгоритмом: каждая часть (подпрограмма, функция, процедура) является составной частью алгоритма. При объектно-ориентированном программировании программа строится как совокупность взаимодействующих объектов. Объект – это базовое понятие ООП. Любой объект принадлежит одному или нескольким классам, которые в свою очередь определяют, описывают поведение объекта. Примеры классов: "Гном", "Хоббит", "Маг". Примеры объектов: "хоббит по имени Фродо Бэггинс", "маг по имени Гэндальф". Каждый объект характеризуется свойствами, методами и событиями. Свойства – описание объекта. Примеры атрибутов: "имя", "рост". Набор конкретных значений определяет текущее состояние объекта. Метод – это действие объекта, изменяющее его состояние или реализующее другое его поведение. Пример методов: "назвать свое имя", "стать невидимым". Объект, класс, метод, свойства, события – это базовые понятия ООП. Действие в ООП инициируется посредством передачи сообщений объекту, ответственному за действия. Сообщение содержит запрос на осуществление действия и сопровождается дополнительной информацией (аргументами), необходимой для его выполнения. К концепции ООП относится: Полиморфизм – это взаимозаменяемость объектов с одинаковым интерфейсом. Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество методов». В зависимости от типа объекта одно и то же сообщение может соответствовать различным действиям – методам для достижения требуемого результата. Наследование - возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка (иногда его называют суперклассом) и добавляя, при необходимости, новые свойства и методы. Наследование призвано отобразить такое свойство реального мира, как иерархичность. Инкапсуляция — это принцип, согласно которому любой класс должен рассматриваться как чёрный ящик — пользователь класса должен видеть и использовать только интерфейс (от английского interface — внешнее лицо, т. е. список декларируемых свойств и методов) класса и не вникать в его внутреннюю реализацию. Этот принцип (теоретически) позволяет минимизировать число связей между классами и, соответственно, упростить независимую реализацию и модификацию классов. Свойство объекта скрывать некоторые свои свойства и методы. Смысл инкапсуляции состоит в том, что внешний пользователь не знает детали реализации объекта, работая с ним путём предоставленного объектом интерфейса.
Неструктурное программирование допускает использование в явном виде команды безусловного перехода (в большинстве языков GOTO). Типичные представители неструктурных языков - ранние версии Бейсика и Фортрана. Однако в языках высокого уровня наличие команды перехода влечет за собой массу серьезных недостатков: программа превращается в "спагетти" с бесконечными переходами вверх-вниз, ее очень трудно сопровождать и модифицировать. Фактически неструктурный стиль программирования не позволяет разрабатывать большие проекты. Ранее широко практиковавшееся первоначальное обучение программированию на базе неструктурного языка (обычно Бейсика) приводило к огромным трудностям при переходе на более современные стили. Как отмечал известный голландский ученый Э. Дейкстра, "программисты, изначально ориентированные на Бейсик, умственно оболванены без надежды на исцеление". Структурное программирование задача разбивается на большое число мелких подзадач, каждая из которых решается своей процедурой или функцией (декомпозиция задачи). При этом проектирование программы идет по принципу сверху вниз: сначала определяются необходимые для решения программы модули, их входы и выходы, а затем уже эти модули разрабатываются. Такой подход вместе с локальными именами переменных позволяет разрабатывать проект силами большого числа программистов. как доказал Э. Дейкстра, любой алгоритм можно реализовать, используя лишь три управляющие конструкции: последовательное выполнение, ветвление цикл не должно быть безусловных переходов!!!!!!!!! Программирование: • Алгоритмическое или процедурное • Структурное • Объектно-ориентированное а) Алгоритмическое программирование Основная идея алгоритмического программирования – разбиение программы на последовательность модулей, каждый из которых выполняет одно или несколько действий. При этом выполнение модуля всегда начинается с первой команды и заканчивается самой последней, чтобы нельзя было попасть на команды модуля извне и передать управление из модуля на другие команды минуя заключительную. Алгоритм на выбранном языке записывается с помощью команд описания данных, вычисления значений и управления последовательностью выполнения программы. Текст программы представляет собой линейную последовательность операторов. Используется для решения не сложных задач, когда программа состоит из нескольких сот строк кода. b ) Структурное программирование При создании средних по размеру приложений (несколько тысяч строк исходного кода) используется структурное программирование. Его идеязаключается в том, что структура программы должна содержать структуру решаемой задачи, чтобы алгоритм решения был явно виден из исходного текста. В качестве средства создания программы используется подпрограмма– набор операторов, выполняющих нужное действие и не зависящих от других частей исходного кода. Программа разбивается на множество мелких подпрограмм (занимающих до 50 операторов – критический порог для быстрого понимания цели программы), каждая из которых выполняет одно из действий, предусмотренных исходным заданием. Комбинируя эти программы, удается формировать итоговый алгоритм уже не из простых операторов, а из законченных блоков кода, имеющих определенную смысловую нагрузку, причем обращаться к таким блокам можно по названиям. Получается, что подпрограммы – это новые операторы или операции языка, определяемые программистом. Подпрограммы бывают двух видов процедуры и функции. Процедура просто выполняет группу операторов. Функция - выполняет группу операторов, вычисляет некоторое значение и передает его обратно в главную программу. При этом значение имеет определенный тип. Возможность использования подпрограмм относит язык программирования к классу процедурныхязыков. Наличие подпрограмм позволяет вести проектирование и разработку приложения сверху вниз– такой подход называется нисходящим проектированием . При этом задача разбивается на большое число мелких подзадач, каждая из которых решается своей процедурой или функцией (декомпозиция задачи). При этом проектирование программы идет по принципу сверху вниз: сначала определяются необходимые для решения про граммы модули, их входы и выходы, а затем уже эти модули разрабатываются. Такой под ход вместе с локальными именами переменных позволяет разрабатывать проект силами большого числа программистов. Подпрограммы могут быть вложенными, если она вызывается не только из главной программы, но и из любых подпрограмм. Допускается вызов подпрограммы из самой себя – такой прием называется рекурсией. Структура подпрограммы: заголовок с параметрами, тело подпрограммы (операторы, которые будут выполняться при ее вызове), завершение подпрограммы. Параметры, которые указываются в заголовке программы, могут быть • формальными, которые нужны только для описания тела программы; • фактическими- конкретные значения, которые указываются в момент вызова подпрограммы. Как доказал Э. Дейкстра, любой алгоритм можно реализовать, используя лишь три управляющие конструкции: • последовательное выполнение, • ветвление • цикл Не должно быть безусловных переходов! Правила композиции, используемые при структурном подходе к составлению алгоритмов: а) альтернативный выбор б) цикл с) подпрограмма с) Объектно-ориентированныйподход к программированию- это подход к разработке программного обеспечения, основанный на объектах. Реальные объекты окружающего мира обладают тремя базовыми характеристиками: они имеют набор свойств, способны разными методами изменять эти свойства и реагировать на события, возникающие как в окружающем мире, так и внутри самого объекта. Объект– совокупность свойств (структур данных, характерных для этого объекта), методов их обработки (подпрограмм изменения свойств) и событий, на которые данный объект может реагировать и, которые приводят, как правило, к изменению свойств объекта. Класс– новый тип, совокупность объектов имеющих идентичную структуру, отличающихся только значениями. Каждый конкретный объект называют экземпляром класса. Описание нового класса похоже на описание новой структуры данных, только к полям (свойствам) добавляются методы – подпрограммы. Важнейшая характеристика класса – возможность создания на его основе новых классов с наследованиемвсех свойств и методов добавления собственных. Класс, не имеющий предшественника, называют базовым. Например, класс «животные» имеет свойства «название», «размер», методы «идти», «размножаться». Созданный на его основе класс «кошка» наследует все его свойства и методы, к которым дополнительно добавляется свойство «окраска» и метод «пить». Свойство объектов переопределять методы наследуемого класса называется полиморфизмом. Например, в большинстве случаев методы базового класса у классов-наследников приходится переопределять – объект класса «кошка» выполняет метод «идти» совсем не так как «амеба». Все переопределяемые методы по названию (написанию) будут совпадать с методами базового объекта. Компилятор по типу объекта (его классу) распознает, какой конкретный метод надо использовать. И не вызовет для класса «амеба» метод «идти» класса «кошка».
|