Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Машинно-ориентированные языки

Содержание:

Введение

Предметом данной работы является объектно-ориентированное программирование, его история, развитие методологии и сферы применения. ООП является одной из ступеней эволюции программирования, поэтому в данной работе рассматриваются в том числе и его предшественники. Данная биологическая аналогия приведена не случайно. Известно, что Алан Кей, один из пионеров ООП до того, как стал создателем своего объектного языка SmallTalk, вел научную деятельность в области молекулярной биологии в Университете штата Колорадо, из которой и почерпнул идею «модулей», которая в дальнейшем получила развитие в концепции «объектов», как составляющих программы. На данный момент ООП является ведущим направлением в программировании и распространено буквально повсеместно.

В данной работе использованы следующие учебные пособия, раскрывающие тему объектно-ориентированного программирования: Давыдова, Н. А. «Программирование: учебное пособие» 2009 года, Мухортов, В. В., Рылов, В. Ю. «Объектно-ориентированное программирование, анализ и дизайн, методическое пособие» 2002 года, Тюгашев, А. А. «Основы программирования. Часть I» 2016 года, Бердоносов, В. Д. «Объектно-ориентированное программирование: учеб. пособие» 2015 года.

Кратко определим причины выбора именно этих пособий.

Бердоносов В. Д является профессором КнАГТУ, а также автором (соавтором) изданий по информационным технологиям.

Тюгашев А. А. является доктором технических наук и автором более чем 20 научных трудов по программированию. Данное пособие было написано для Университета ИТМО.

Учебное пособие соавторов Мухортова и Рылова было написано на основе методологии, разработанной Г. Бучем, и в каком-то смысле является переработкой издания Буча (будет упомянуто далее) в более понятной и сокращенной/сжатой форме.

Учебное пособие Давыдовой Н. А. выпущено научным издательством БИНОМ, специализируется в издании научных книг, вузовских и школьных учебников, методической и научно-популярной литературы естественнонаучного и информационно-математического направлений и выпускает методические пособия в соответствии с ФГОС.

Данные учебные пособия используются для обучения программированию в учебных заведениях, также на наш взгляд они под разными углами, но в необходимой мере раскрывают те или иные аспекты выбранной нами темы курсовой работы.

Кроме того для работы были использованы монографии таких авторов, как

Тимоти Бадд, который является доцентом по информатике в Университете штата Орегон, а также автором более десятка книг по объектно-ориентированному программированию, структурам данных, некоторые из которых опубликованы на нескольких языках;

Гради Буч, американского специалиста в области программной инженерии, руководителя исследований в IBM Research, IBM Fellow, создателя унифицированного языка моделирования UML;

Мэтт Вайсфельд, профессора колледжа, разработчика программного обеспечения и автора книг и статей по объктно-ориентированной разработке, из штата Огайо;

Иан Грэхэм, признанного во всем мире консультанта по объектным технологиям и бизнес-процессам с более чем двадцатилетным опытом работы в качестве ИТ-специалиста, автора или редактора 13 книг.

Краткий обзор деятельности указанных авторов не вызывает сомнений в их профессионализме.

Также в данной работе использованы статьи таких интернет-ресурсов, как Habrahabr – крупнейшего в Рунете сообщества программистов, в котором публикуются актуальные статьи практикующих программистов; Progstudy – площадки онлайн-обучения программированию, созданной и поддерживаемой программистами-практиками; itweek.ru (электронной страницей печатного издания PC Week/RE) — специализированного еженедельного издания, освещающего широкий круг проблем области ИТ.

Данная работа не преследует цель стать полноценным справочником или пособием по ООП и скорее носит теоретический, чем практический характер, что по сути задано и самой ее темой, которая подразумевает более теоретический, чем прикладной характер исследования.

Мы постараемся проследить развитие технологий и причины появления объектно-ориентированного подхода, кроме того мы рассмотрим основные понятия и методы ООП, ключевые языки и области применения.

1. История развития языков программирования


1.1 Машинно-ориентированные языки

Для начала определим само понятие программирования, в том смысле, в каком будем использовать его далее в данной работе.

Программирование в общепринятом понимании — процесс описания программной идеи с помощью языка, понятного приемнику и передатчику, тогда как программа представляет собой некую систематизированную совокупность команд, которые входят в перечень исполнимых для конкретной электронно-вычислительной машины, компьютера [2, с. 12].

Проследим развитие программирования. В какой период истории появился первый программируемый компьютер? Счетные машины известны с древнейших времен, но рассчеты на них производились вручную, поэтому мы не берем их в расчет.

В 1830-е годы Чарльз Бэббидж приступает к проекту аналитической машины, по сути прообраза современной ЭВМ. Первыми программами в истории считаются предписания по расчету чисел Бернулли, написанные Адой Лавлейс для этой машины, именно в этих предписаниях появляется такое фундаментальное понятие программирования, как цикл. Для ввода программы в машину предполагалось использовать перфокарты, и сама программа Ады Лавлейс представляет собой не текст, а набор перфокарт. Кроме того леди Лавлейс предвидела возможность машины оперировать не только числами, но и произвольными объектами, выраженными, например, алгебраически в символьной форме, что в наши дни называется символическими вычислениями, или компьютерной алгеброй. Если бы аналитическая машина была построена, она стала бы первым программируемым компьютером.[8, c.17]

Стоит упомянуть еще об одном подобном нереализованном проекте, относящемся к более близкому прошлому, проекте 1938 года, логической машине Z1 немецкого инженера Конрада Цузе. Если машина Бэббиджа должна была работать на паровом двигателе, машина Цузе была уже электромеханической, а программа должна была задаваться с помощью перфоленты. В 1945 году Цузе занялся созданием языка для будущей логической машины. Язык, получивший имя Plankalkül (на русском это название соответствует выражению «планирующее исчисление»), фактически, представляет собой язык программирования высокого уровня с такими современными чертами, как вызов подпрограмм, условные операторы, итерационные циклы, арифметику с плавающей запятой, массивы, иерархические структуры данных, утверждения, обработку исключений и многие другие.

Цузе предполагал создать автоматический преобразователь (аналог современных трансляторов с языков высокого уровня в машинный код) программы на Plankalkül в исполняемую на его предполагаемой машине перфоленту, но это не было им воплощено в реальность.

Данный, предварительный этап развития информационных технологий — это этап самоотверженных изобретателей, по сути первый шаг к созданию машин, которые должны облегчить человеческие жизни и труд, однако на данном этапе затраты ресурсов значительно превышают плоды, результаты. В дальнейшем, очевидно, что произойдет кардинальный переворот. [8, c. 17]

1.2 Эволюция информационных систем, необходимость эволюции языков

Появление ЭВМ — по сути революционное событие середины XX века. Первые электронно-вычислительные машины использовались исключительно для математических и статистических расчетов, но их возможности были ограничены малым объемом оперативной памяти, а также несовершенством системы ввода-вывода [7, c. 8]. Данные и команды вводились с пульта, перемычками или тумблерами. Как тогда, так и в наши дни, память ЭВМ может хранить только двоичные представления. Все программа писались в машинных кодах, но очевидно, что машинный язык весьма неудобен для человека. Программистам прошлого было необходимо запоминать, какой последовательности нулей и единиц соответствует та или иная команда, в ячейках с какими номерами хранятся промежуточные результаты вычислений, само программирование было занятием непростым, доступным немногим высококвалифицированным специалистам, и человеческий фактор был причиной проникновения в программы большого количества ошибок.[8, c.19]

Машинное кодирование можно считать самой первой, примитивной концепцией программирования. И очевидными, присущими ему недостатками при увеличении сложности задач были следующие:

- увеличивался объем кода (машинных операций);

- также недопустимо усложнялась структура процессора ЭВМ;

- время программирования соответственно тоже увеличивалось [2, c. 15].

Все это затрудняло написание объемных программ. Также программа, работоспособная на одной ЭВМ, не могла выполняться на другой.

Необходимость преодолеть данные проблемы стала причиной перехода к новой парадигме программирования — ассемблированию. Во-первых, понятие адресов (фактически номеров) ячеек было заменено понятием «операнд», во-вторых, однородные машинные инструкции были объединены в мнемонические команды. Большой вклад в развитие программирования и особенно его языков внесли Грейс Мюррей Хоппер и ее группа ученых: именно им мы обязаны возникновением подпрограмм, первого компилятора и такого понятия, как отладка [6, с. 16].

На машину возложили задачу перевода или компиляции исходного текста программы на языке Ассемблер в программу на машинном языке. Термин ассемблер произошел от английского слова assembler, так называли сборщик частей в одно целое, в данном случае — сборщик программы. Обращение к процессору стало выполняться через мнемонические команды, которые соответствуют инструкциям процессора вычислительной системы. Данное решение уменьшило время программирования, повысило производительность труда, увеличило объем программного кода, сократило сроки разработки, не усложняя при этом структуру процессора. Также повысились надежность и качество создаваемых программ за счет меньшего количества возможностей внесения ошибок в программу.

В 1950-х годах ЭВМ получили широкое распространение в научно-исследовательских институтах США и Западной Европы, с этого времени начинается стремительный прогресс программирования.[6, с. 16]

Далее программирование идет по пути развития алгоритмических абстракций. Такие характерные для машины понятия, как ячейки памяти или простейшие операции суммирования чисел в ячейках памяти, были заменены абстрактными переменными и довольно сложными выражениями, похожими на используемые в математике формулы Неудивительно, что первый язык программирования высокого уровня так и назвали — FORTRAN, от слов «формульный транслятор», этот язык, позволял решать специфические научные и инженерные задачи, и стал первым широко распространенным коммерческим языком. Также стали создаваться компиляторы для других языков программирования, среди которых стоит упомянуть COBOL, аппаратно-независимый язык, в котором, в отличие от большинства прочих языков, все данные описываются в отдельной секции, которая не совпадает с секцией команд, что позволяет использовать одни и те же описания данных в различных программах. Особенно эффективно выполняют программы, написанные на этом языке, простые арифметические операции с большими массивами данных, что необходимо, например в бухгалтерских расчетах.[6, с 18]

При создании языков высокого уровня делалась попытка выразить в языке суть алгоритма решения задачи, абстрагированного от мелких деталей реализации на той или иной ЭВМ, что нашло свое отражение в названии еще одного знаменитого языка программирования — ALGOL (от англ. algorithmic language — алгоритмический язык). ALGOL стал основой для дальнейшего развития программистской мысли, многие разработанные впоследствии и получившие распространение языки программирования содержат идеи и решения, взятые из ALGOL: во-первых, создание специальной нотации для определения синтаксиса алгоритмических языков (нотация Бэкуса-Наура); во-вторых доведение до логического завершения концепции операторных алгоритмических языков с заранее фиксированными типами данных и блочной структурой. Также стоит упомянуть такие нововведения ALGOL, как возможность разработки отдельных модулей проекта независимо друг от друга, а также реализацию вызова фрагментов кода программы и способов передачи параметров между процедурами и функциями. Также именно в ALGOL понятия блока и рекурсивного вызова функции.

Мощность ЭВМ быстро росла, ширилась и область их применения. Как и ранее основной задачей было инструктировать компьютер, что ему делать, но необходимо было также облегчить кропотливую работу по программированию, перейдя в выражениях языка от низкоуровневых машинных понятий ближе к тому, как обычно мыслит человек. Появилась возможность использования подпрограмм, раздельной компиляции, типов данных, обработки списков, наличием указателей и сборки мусора[8, с. 10]. Подпрограммы появились еще до 1950 года, но тогда их ценность в качестве абстракций не рассматривалась. Они считались не более чем средствами, упрощающими работу. Однако вскоре пришло понимание, что подпрограммы это абстрактные программные функции.

С середины 60-х годов программисты начали осознавать роль подпрограмм как важного промежуточного звена между решаемой задачей и компьютером. Использование подпрограмм как механизма абстрагирования имело три существенных последствия. Во-первых, были разработаны языки, поддерживавшие разнообразные механизмы передачи параметров. Во-вторых, были заложены основания структурного программирования, что выразилось в языковой поддержке механизмов вложенности подпрограмм и в научном исследовании структур управления и областей видимости. В-третьих, возникли методы структурного проектирования, стимулирующие разработчиков создавать большие системы, используя подпрограммы как готовые строительные блоки. Архитектура языков программирования этого периода, как и следовало ожидать, представляет собой вариации на темы предыдущего поколения. В нее внесены кое-какие усовершенствования, в частности, усилено управление алгоритмическими абстракциями, но остается нерешенной проблема программирования "в большом" и проектирования данных. [3, с. 33]

В конце 60-х годов начинает экспоненциально расти производительность вычислительных машин. Языки и методы программирования развиваются столь же быстро, но куда быстрее растет потребность в программах. Адекватным способом удовлетворить эту потребность в резком ускорении разработки стал метод многократного использования кода. Структурный подход предоставлял такую возможность, однако ни гибкость этого метода, ни масштабы использования не позволяли значимо ускорить процесс программирования. Кроме того появилась необходимость упростить сопровождение и модифицировать разработанные уже системы. Было необходимо радикально изменить способ построения систем таким образом, чтобы локальные модификации не нарушили работоспособность всей системы, и было легче изменять ее поведение. Разрастание программных проектов означало расширение также и коллективов программистов, и следовательно необходимость независимой разработки отдельных частей проекта.

Потребность облегчить проектирование систем и приблизить структуру программ к структуре решаемых задач стало почвой для появления языков третьего поколения, поддерживающих абстракцию данных. Разработчики получили возможность описывать свои собственные виды данных, то есть создавать пользовательские типы. Значение абстрактных типов данных в разрешении проблемы сложности систем хорошо выразил Шанкар: «Абстрагирование, достигаемое посредством использования процедур, хорошо подходит для описания абстрактных действий, но не годится для описания абстрактных объектов. Это серьезный недостаток, так как во многих практических ситуациях сложность объектов, с которыми нужно работать, составляет основную часть сложности всей задачи».

Это осознание повлекло за собой два важных вывода. Во-первых, возникли методы проектирования на основе потоков данных, которые вносят упорядоченность в абстракцию данных в языках, ориентированных на алгоритмы. Во-вторых, появилась теория типов, которая воплотилась в таких языках, как Pascal, разработанный Н. Виртом, и получивший широкое распространение благодаря легкости изучения и наглядности составленных на нем программ [6, с. 19].

Разрастание программных проектов требовало увеличения коллективов разработчиков и появления механизмов, позволяющих этим коллективам независимо работать над разными частями проекта. Так появились модули.

Модуль отдельно компилируемая часть программы, состоящая из наборов данных и подпрограмм. В модули, как правило, собирались подпрограммы, которые, как предполагалось, должны разрабатываться и изменяться совместно. Туда же собирались и данные, которые использовались этими подпрограммами. Постепенно модули стали новым, более крупным механизмом абстракции программных систем.

Первоначально языки программирования не имели достаточно развитых механизмов защиты данных одного модуля от использования их процедурами другого. Во многом эта задача ложилась на коллективы разработчиков. Появившиеся различные подходы в разработке программных систем благоприятствовали возникновению огромного количества языков, имеющих те или иные сильные и слабые стороны в реализации этих принципов. Одним из наиболее развитых представителей языков третьего поколения стал язык ALGOL-68. Будучи универсальным и реализуя почти все разработанные к тому времени механизмы в алгоритмических языках, он был достаточно труден для первоначального освоении, однако позволял разрабатывать системы корпоративного масштаба для больших ЭВМ. [7, с.11]

Благодаря распространению малых ЭВМ, огромную популярность приобрели более простые потомки ALGOL-60 — язык Pascal, до сих пор наиболее широко используемый в академический и учебной среде, и появившийся во второй половине 70-х годов язык C, который приобрел наибольшую популярность среди профессиональных программистов. Язык C был разработан для написания операционной системы Unix.

Классическим потомком языка Pascal, предназначенным для профессионального написания сложных программных комплексов, стал язык Ada, имеющий встроенную поддержку модульности и абстрактных типов данных.[7, с. 13]

Язык C также стал очень популярным языком как системного, так и прикладного программирования, благодаря лаконичному синтаксису и простой алгоритмической структуре: в нем отсутствуют вложенные процедуры. Наличие возможности низкоуровневого управления памятью (преобразование типов, наличие указателей на данные и функции), препроцессор и поддержка макросов делают его языком системного программирования, предоставляя средства, ранее доступные для малых ЭВМ только на уровне языка ассемблера. Простота в освоении и чрезвычайная гибкость сделали его многофункциональным средством прикладного программирования.

Процедурно-ориентированные языки мало подходили для написания программных систем, где центральным место занимали не алгоритмы, а данные. С определенного момента возникла острая необходимость в языковой поддержке описания произвольных объектов окружающего мира. В оборот вошли абстрактные типы данных. На смену языкам программирования высокого уровня, или языкам третьего поколения пришли проблемно-ориентированные языки программирования; декларативный подход к программированию; языки визуального (графического) программирования; использование в программировании подмножеств естественного языка; объектно-ориентированные языки, о которых пойдет речь далее.[2, с. 12]

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

2. История и развитие методологии ООП


2.1 Предпосылки возникновения ООП

Объектно-ориентированное программирование часто называют новой парадигмой программирования. Другие парадигмы программирования: директивное (языки типа Pascal или C), логическое (языки типа Prolog) и функциональное (языки типа Lisp, FP или Haskell) программирование.

Несмотря на то, что техника организации вычислений и данных, составляющая сущность объектно-ориентированного программирования является новой, предпосылки ее зарождения можно отнести как минимум к временам Линнея, если не Платона. Стиль решения задач, воплощенный в объектно-ориентированной технике, нередко используется в повседневной жизни. Это парадоксально, но поэтому зачастую новички в информатике способны воспринять основные идеи объектно-ориентированного программирования сравнительно легко, в то время как люди, более осведомленные, бывает становятся в тупик из-за своих представлений. К примеру, Алан Кей обнаружил, что легче обучать языку Smalltalk детей, чем профессиональных программистов. [1, с. 9]

На заре информатики, большинство программ писалось на ассемблере. Они не соответствуют сегодняшним стандартам. По мере того как программы становились все сложнее, разработчики обнаружили, что они не в состоянии помнить всю информацию, необходимую для отладки и совершенствования их программного обеспечения. Появление таких языков программирования высокого уровня, как Fortran, Cobol и Algol, разрешило некоторые проблемы (было введено автоматическое управление локальными переменными и неявное присваивание значений). Одновременно это возросла вера пользователей в возможности компьютера. По мере того как предпринимались попытки решить все более сложные проблемы с его использованием, возникали ситуации, когда даже лучшие программисты не могли удержать все в своей памяти. Привычными стали команды программистов, работающих совместно. По мере того как программные проекты становились все сложнее, было замечено, что задача, для решения которой одному программисту требовалось два месяца, не решалась двумя программистами за месяц. Причиной такого нелинейного поведения является сложность. В частности, взаимосвязи между программными компонентами стали сложнее, и разработчики вынуждены были постоянно обмениваться между собой значительными объемами информации от другого. Порождает сложность не просто большой объем рассматриваемых задач, а уникальное свойство программных систем, разработанных с использованием традиционных подходов, — большое число перекрестных ссылок между компонентами. [1, c. 17]

Десятилетиями люди спрашивали себя, почему создание программного обеспечения не может копировать процесс конструирования материальных объектов. Программисты осознали необходимость отделить логический смысл фрагмента программы от проблемы его реализации.

Все это и многое другое стало причиной необходимости развития программирования в направлении большей абстракции: от процедур к модулям, далее к абстрактным типам данных и наконец к объектам. [1, c. 20]

Объектно-ориентированные методы программирования обеспечили механизм для отделения существенной информации от специализированной. Тем самым при использовании объектно-ориентированной техники мы можем создавать большие программные компоненты, пригодные для повторного использования. Многие коммерческие пакеты программных компонентов, пригодных для многократного использования, уже имеются, и разработка повторно используемых программных компонентов становится быстро развивающейся отраслью индустрии программного обеспечения. [1, c. 21]

2.2. История развития методов ООП

Норвежцев Оле Джохана Дала и Кристена Нюгорта принято считать основоположниками объектного подхода в программировании. В 1952 г. Нюгорт решил заняться моделированием крупных и сложных систем реального мира, в 1957 получил возможность компьютерной реализации своих замыслов на машине Ferranti MERCURY, но быстро осознал ограниченность машинных языков и Фортрана.

Ferranti MERCURY – версия, созданная Манчестерским университетом в содружестве с компанией Ferranti в ходе работ над компьютером Mark 2. Она отличалась поддержкой операций с плавающей точкой. Память компьютера составляла 1024 слова по 40 бит с временем доступа 10 мкс к 10-битовому слову. Устройство адресации могло работать с 10-, 20- и 40-битовыми словами. Долговременная память насчитывала 4096 40-битных слов и обрабатывала их со скоростью 17,28 мс. Для выявления сбоев выполнялась проверка четности. Программисты решали задачи с помощью языка Mercury Autocode.[9]

История Симулы началась в 1962 г. с проекта Simulation Language, предназначенного для программного моделирования метода Монте-Карло. Нюгорт, занимавший в то время должность директора по науке Норвежского компьютерного центра (NCC), приступил к созданию языка дискретного моделирования. Он привлек к сотрудничеству Оле Джохана Дала, коллегу по экспериментальной группе Министерства обороны Норвегии, которую возглавлял Йан Гэрвик, основатель информатики в этой стране. Одновременно готовились две версии Симулы. Первая, Симула I, формировалась по контракту с подразделением Univac корпорации Sperry Rand для машины UNIVAC 1107. Американские заказчики желали видеть этот язык фортраноподобным, от чего, впрочем, авторы категорически отказались; в результате прародителем Симулы стал Алгол 60. Последний был выбран благодаря блочной архитектуре, хорошим средствам сокрытия данных, а также вследствие высокой популярности в европейских научных центрах. А работы над вторым вариантом спонсировал NCC.

В 1965 г. авторам пришла в голову идея объединить данные с процедурами, их обрабатывающими. После успешного обсуждения возможностей Симулы I на саммите НАТО в 1966 г. решено было продолжить его совершенствование. В язык вошли новые средства моделирования и имитации мультипроцессной работы. Авторы также придумали термины "класс" и "объект". Тогда же возникла и технология наследования – создатели Симулы ввели в язык возможность использования разными классами общих свойств путем указания названия класса в виде префикса. После публичного анонса новая технология вызвала интерес в Дании, Германии и СССР. У нас в конце 60-х появилась реализация Симулы для УРАЛа-16.

Новая версия языка поддерживала проектирование “сверху вниз” с помощью виртуальных процедур и технологии статического и динамического связывания. Якоб Палме, специалист Шведского института оборонных исследований добавил в Симулу механизм сокрытия переменных. Первый законченный компилятор обновленной Симулы 67 увидел свет в 1969 г. и работал на машинах Control Data. Затем последовали реализации для UNIVAC 1108 и IBM, но все они, к сожалению, стоили очень дорого, что, вероятно, помешало активному распространению этого прекрасного языка. Однако с его помощью были спроектированы, например, первые СБИС-чипы Intel.[9]

Тем временем Алан Кей (человек, придумавший первый персональный компьютер; см. PC Week/RE, N 39/98, с.25) внимательно изучал идеи, заложенные в Планшет, Симулу и еще два оригинальных языка – LISP, применявшийся для задач искусственного интеллекта, и LOGO, предназначенный для обучения базовым понятиям программирования. В ходе ознакомления с этими языками Кей придумал новую концепцию разработки, в соответствии с которой набор последовательно выполняющихся инструкций мог быть заменен на многомерную среду взаимодействия объектов, общающихся друг с другом путем асинхронного обмена сообщениями. В результате появлялась возможность поддержки подобной среды не одним, а множеством компьютеров, объединенных в сеть. Правда, для своего времени эта идея оказалась слишком революционной.

В конце 50-х годов Кей работал на Денверской военно-воздушной базе “Рандольф” (Randolph), где писал на машинном коде программы для ЭВМ Burroughs 220. Тогда он столкнулся с проблемой передачи сформированных на этой машине данных на компьютеры других баз. Стандартных форматов и ОС в современном понимании для тех ЭВМ не существовало, поэтому Кею пришлось создавать микропрограммы, которые содержали в себе всю необходимую информацию и после запуска на других машинах через простой пользовательский интерфейс самостоятельно разворачивали нужные данные. Такие программы Кей первоначально назвал "модулями", объединявшими данные и код. В 1966 г. он занялся научной деятельностью в области молекулярной биологии в Университете шт. Колорадо, где к нему пришло понимание важности этой идеи. Кей задумал создание системы модулей (возможно, уже тогда он дал им название "объекты"), объединяющих данные и алгоритмы их обработки, способные взаимодействовать друг с другом через определенные разработчиком интерфейсы, но не имеющие представления о том, что происходит за их пределами. При этом он активно использовал аналогии с биологическими объектами и механизмами взаимодействия клеток в живом организме.[9]

В 1972 г. работая в хорошо известном научном центре Xerox PARC, Кей воплотил эти идеи в новом объектном языке SmallTalk, первоначально названном им Biological System и смоделированном на Бейсике, а затем реализованном на ассемблере. В процессе этой деятельности он предложил знаменитый термин "объектно-ориентированное программирование" (ООП). Заложенные в SmallTalk идеи ООП и по сей день остались непревзойденными ни в каких других языках и системах.

Если Кея нередко называют отцом SmallTalk, то матерью этого уникального языка можно считать профессора лингвистики Адель Голдберг, работавшую в те годы в тесной связке с Аланом в Xerox PARC. Она написала первую документацию к SmallTalk, а затем несколько книг и большое число статей по методологиям объектного анализа.

Мировую известность получила версия SmallTalk 80, коммерческие реализации которой вышли в 1981 г. Правда, они отличались невысокой производительностью. Впоследствии Кей принимал участие в работе группы Squeak, создавшей реализацию SmallTalk под девизом "Объектно-ориентированному программированию нужна скорость Си". Однако превзойти популярность Си проекту Squeak не удалось. Этот элегантный и шустрый язык, придуманный в лаборатории AT&T Bell при участии программистов Кена Томпсона и Денниса Ритчи (известных ЕС-программистам по легендарной игре Star Trek), добрался до ООП своим путем. [9]

1974 г. Марвин Мински, основоположник теории искусственного интеллекта, предложил идею фрейма, отделяющего описание класса (структуры) объекта от его конкретного представления (экземпляра) и быстро завоевавшего популярность в языках искусственного интеллекта. Фрейм стал прямым предшественником современного понятия объектов в Си++. [статья]

1976 г. Кринстен Нюгорн создал новый язык BETA, в котором ввел концепцию шаблонов – более высокого уровня абстракций, нежели объекты. Его коллега Оле Джохан Дал еще долгое время работал профессором информатики в Университете Осло. А Нюгорн на некоторое время занялся политикой и активно выступал против вступления Норвегии в Евросоюз.

1980 г. Бьерн Страуструп, продолживший дело своих коллег из лаборатории Bell, дополнил язык Си концепцией классов, основанной на фреймах и объектных механизмах Симулы.

1982 г. В Мехико прошла 8-я Международная конференция по сверхбольшим БД (VLDB), где была предложена концепция объектно-ориентированных БД и рассматривались вопросы расширения существовавших языков запросов к БД новыми, объектными типами данных.

1983 г. Страуструп дал своему творению окончательное название Си++.[3, c. 36]

1986 г. прошла Первая всемирная конференция по объектно-ориентированным системам программирования в Портленде. Скорее всего, прозвучавшие именно на ней доклады оказали стимулирующее влияние на Уильяма Аткинсона, инженера Apple, который через год после этого спроектировал систему HyperCard, прообраз современных визуальных сред быстрой разработки. Эффективность новой технологии оказалась столь высокой, что уже в 1989 г. одиннадцать компаний, среди которых были 3Com, American Airlines, Canon, Data General, Hewlett-Packard, Philips Telecommunications, Sun Microsystems и Unisys, основали группу OMG (Object Management Group), призванную формировать индустриальные стандарты на объектное программирование и упрощать интеграцию приложений с помощью универсальных кросс-платформных технологий. Эта группа первым делом приступила к выработке единого стандарта компонентной модели CORBA (Common Object Request Broker Architecture) – набора спецификаций, определяющих способы объектно-ориентированного взаимодействия компонентов промежуточного уровня в гетерогенных средах без привязки к конкретным языкам программирования. С самого начала CORBA нацеливалась на поддержку крупных, индустриальных проектов, и этот подход со временем себя полностью оправдал. Сегодня нет другого столь же распространенного независимого стандарта, поддерживающего самые разные ОС и объектные модели.

1992 г. Вышел стандарт CORBA 1.0, определяющий ключевые аспекты функционирования CORBA-систем. В него были включены базовое описание объектной модели, наборы программных интерфейсов поддержки CORBA-систем, а также декларативный язык определения интерфейсов Interface Definition Language (IDL), созданный OMG для описания распределенных интерфейсов.

1993 г. Корпорация Microsoft выпустила первую версию компонентной модели COM (Component Object Model), идея которой была, видимо, позаимствована из модели SOM (System Object Model), уже давно существовавшей в IBM OS/2 (в создании OS/2 Microsoft одно время принимала активное участие). Первоначально COM готовилась только для поддержки технологии встраивания и связывания документов OLE, но быстро выделилась в самостоятельное направление.

В том же 1993-м была предложена компонентная технология Microsoft ActiveX, основанная на элементах управления OLE, пришедших из Visual Basic, где они назывались VBX/OCX. [9]

1994 г. Опубликован стандарт CORBA 2.0, который быстро получил массовое признание, так как представлял собой богатый и глубоко проработанный набор документов и охватывал большинство востребованных рынком задач. В нем были ликвидированы недостатки прежней версии, в результате чего CORBA 2.0 начал поддерживать транзакции и понимать универсальную кодировку Unicode, а также появился набор средств обеспечения безопасности и взаимодействия COM- и CORBA-объектов.

Гради Буч и Джеймс Румбах из Rational Software решили объединить две методологии визуального моделирования Booch и OMT и создать на их основе новый язык UML (Unified Modeling Language).

1995 г. Sun Microsystems свободно распространяет в Интернете элемент технологии Java – среду HotJava, поддерживающую мобильный код, разработку проекта Green, которая к тому времени считалась в Sun практически пропащей, если бы не развитие Сети. Новинку сразу же лицензирует Netscape Communication, а следом за ней к Java проявляют коммерческий интерес десятки компаний, в том числе Microsoft, IBM, Adobe, Borland, Lotus, Oracle.

Корпорация Borland выпустила первую версию среды быстрой визуальной разработки Delphi 1, основанную на концепции библиотек стандартных компонентов.

Microsoft сообщает о новой технологии DCOM – распределенной версии COM, позволившей собирать приложения из компонентов, выполнявшихся на разных компьютерах. Первоначально эта технология называлась Network OLE (сетевое OLE), однако по мере выделения COM в самостоятельное направление решено было отказаться от упоминания OLE в ее названии.

1996 г. Microsoft называет ActiveX новой объектной стратегией, направленной на поддержку Интернета. [9]

1997 г. Sun Microsystems предлагает концепцию Enterprise JavaBeans – технологию создания корпоративных Java-компонентов, которые можно исполнять на серверах приложений, реализуя логику крупных, хорошо масштабируемых и защищенных систем на платформно-независимой основе.

Эксперты OMG осознают не только важность объектных технологий программирования, но и острую потребность в универсальных методологических концепциях проектирования крупных систем. Секретом стабильности системы и высокой отдачи инвестиций специалисты OMG называют независимую UML-модель и приступают к созданию концепции “Архитектура, управляемая моделью» (Model Driven Architecture, MDA). В ее основу закладывается базовая платформно-независимая UML-модель системы, несколько платформно-зависимых моделей и коллекция определений программных интерфейсов. Первую реализацию этой универсальной концепции (так называемое "отображение в объектный стандарт") OMG выполнила, конечно, для CORBA.[3, с. 40]

2000 г. Microsoft анонсирует новую объектную платформу .NET и новый язык программирования C#, сочетающий лучшие свойства С++ и Java. Он был предложен Microsoft во многом в противовес Java.

2001 г. OMG выпускает спецификацию CORBA 3.0. Она дополнена возможностями асинхронного обмена сообщениями, разработки систем реального времени и создания встраиваемых систем. В ней появились подключаемые компоненты, поддержка XML и средства интеграции различных Интернет-технологий. Была продумана модель сборки системы из компонентов JavaBeans и ActiveX. Стало допустимым в рамках одного компонента описывать множество интерфейсов, а также использовать язык сценариев. Особый акцент в третьей версии CORBA сделан на эффективном взаимодействии с Java.

2002 г. Опубликована последняя официальная версия CORBA 3.0.2.

И очевидно, что на данный момент сфера применения объектного подхода ширится и ширится.






 

3. Основные концепции ООП

Объектно-ориентированное программирование — это парадигма программирования, в рамках которой «во главу угла» ставят понятия объектов и классов. Сейчас ООП так или иначе присутствует во всех языках. Основной идеей объектного подхода является объединение данных и производимых над этими данными операций в одно концептуально замкнутое понятие — класс. Данные класса не должны изменяться извне его, доступ к данным стоит осуществлять только через функции члены (методы класса). Появление объектно-ориентированного программирования стало результатом возросших требований к функционалу программ, когда описывать объект приходилось раз за разом в разных участках кода. Тогда и было введено понятие класса, параметры которого задавались единожды, а после в коде оставлялись только ссылки на класс, чтобы код самостоятельно «собрал» объект.

Программа, написанная на объектном языке, представляет собой совокупность объектов, каждый из которых принадлежит к определенному абстрактному типу данных (классу) и имеет интерфейс в виде набора методов для взаимодействия друг с другом (посылки сообщений).

Насколько появление объектных языков и объектной модели явилось прямым развитием модульного подхода при написании программных систем, настолько и появление объектно-ориентированных механизмов явилось следующим шагом в развитии объектной модели. [10]

В качестве живого примера объектно-ориентированного программирования можно привести мастерскую, где есть старший слесарь (программист) и ученики (разные участки кода). При устаревших парадигмах программирования старшему слесарю пришлось бы сначала объяснить ученику №0, как вырезать деталь (создать объект), затем ученику №1 то же самое, потом ученику №2 и так далее. ООП же даёт слесарю целую пачку бесконечных подробных чертежей (классов) деталей, которые он может раздавать ученикам вместо повторного объяснения (заведения описания объекта). Как нетрудно догадаться, это ускоряет работу и позволяет старшему слесарю уделить внимание более важным проблемам мастерской.

В терминах объектно-ориентированного подхода, мы говорим, что перечисленные классы образуют иерархию наследования, построенную на основе отношения «обобщение/специализация».

Классы не всегда образуют строго пирамидальную иерархию. Сложность окружающей действительности и многообразие объектов реального мира побуждает человека вырабатывать классификационные схемы, для того чтобы мыслить и оперировать объектами. Поэтому, совершенно естественным стало внедрение поддержки объектного подхода в языках программирования. [10]

Алан Кей, которого некоторые называют отцом объектно-ориентированного программирования, считает следующие положения фундаментальными характеристиками ООП:

1. Все является объектом.

2. Вычисления осуществляются путем взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некое действие. Объекты взаимодействуют, посылая и получая сообщения.

Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.

3. Каждый объект имеет независимую память, которая состоит из других объектов.

4. Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки).

5. В классе задается поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.

6. Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определенного класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве. [1, с. 14]

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

Программа написанная на объектно-ориентированном языке представляет собой совокупность объектов, каждый из которых принадлежит к определенному абстрактному типу данных (классу), а классы образуют иерархию наследования.

Концептуальной базой объектно-ориентированного стиля программирования является объектная модель, основывающаяся на четырех главных принципах:

- абстрагирование

- инкапсуляция

- полиморфизм

- наследование

Без следования любому из этих принципов модель не будет объектно-ориентированной. Кроме того, имеются еще три дополнительных принципа, которые не являются обязательными, но полезны.

- модульность

- типизация

- параллелизм

- устойчивость. [2, с. 25]

Рассмотрим подробнее перечисленные ранее основные принципы ООП.

1) Абстрагирование — выделение существенных характеристик некоторого объекта, отличающих его от всех других видов объектов и, таким образом, четко определяющих его концептуальные границы с точки зрения наблюдателя. Абстракция концентрирует внимание на внешнем представлении объекта и позволяет отделить существенные особенности поведения от их реализации. Абельсон и Суссман назвали такое отделение поведения от его реализации принципом минимальных обязательств, в соответствии с которым интерфейс объекта должен обеспечивать только существенные аспекты его поведения и ничего более. Существует также дополнительный принцип наименьшего удивления, согласно которому абстракция должна полностью описывать поведение объекта, ни больше и ни меньше, и не порождать сюрпризы или побочные эффекты, выходящие за пределы абстракции. [2, с. 26]

2) Инкапсуляция — процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение. Инкапсуляция служит для того, чтобы изолировать контрактные обязательства абстракции от их реализации. Абстракция и инкапсуляции дополняют друг друга. В центре внимания абстракции находится наблюдаемое поведение объекта, а инкапсуляция сосредоточена на реализации, обеспечивающей заданное поведение. Как правило, инкапсуляция осуществляется с помощью сокрытия информации (а не просто сокрытия данных), т.е. утаивания всех несущественных деталей объекта. Обычно скрываются как структура объекта, так и реализация его методов.[2, с. 26]

3) Полиморфизм — обозначение различных действий одним именем и свойство объекта отвечать на направленный к нему запрос сообразно своему типу. Полиморфизм позволяет обойтись без операторов выбора, при этом связь метода и имени определяется только в процессе выполнения программ.

4) Наследование — механизм, позволяющий определять новые типы данных на основе существующих таким образом, что данные и функции существующих классов становятся членами наследуемых классов.

Без любого из этих принципов модель нельзя считать объектно-ориентированной. С момента зарождения объектно-ориентированного подхода концептуальная база ООП развивалась и эволюционировала вместе с языками, в которых воплощен данный подход к программированию. Описанные принципы представляют собой группы механизмов, которые их реализуют в различных языках программирования. [2, с. 26]

Рассмотрим также дополнительные принципы ООП:

Модульность — свойство системы, которая была разложена на внутренне связанные, но слабо связанные между собой модули. Правильный выбор модулей для решения поставленной задачи является почти такой же сложной задачей, как и выбор правильного набора абстракций. Существует несколько эмпирических приемов и правил, позволяющих обеспечить разумную модульность. Бриттон и Парнас утверждают: «Конечной целью декомпозиции программы на модули является снижение затрат на программирование, благодаря независимому проектированию и тестированию. Структура каждого модуля должна быть достаточно простой для понимания, допускать независимую реализацию других модулей и не влиять на поведение других модулей, а также позволять легкое изменение проектных решений».

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

Параллелизм — возможность различным объектам действовать одновременно. Это свойство, отличающее активные объекты от пассивных.

Устойчивость. Любой объект или данные в программной системе существуют во времени и пространстве (памяти ЭВМ). Одни объекты существуют только как промежуточные результаты вычисления выражения, другие могут вообще пережить программу, оставаясь сохраненными в базе данных. Таким образом устойчивость — это способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства. [7, с. 41].

Использование объектив-ориентированного подхода не ограничено каким-либо одним языком программирования — он применим к широкому спектру объектных и объектно-ориентированных языков. Объектно-ориентированный подход стал основой объекте-ориентированной парадигмы программирования, и в настоящее время количество прикладных языков программирования, реализующих данную парадигму, является наибольшим по отношению к другим парадигмам. [2, с.29]




 

4. Сферы применения ООП в современном мире. Наиболее востребованные объектные и объектно-ориентированные языки.


Объектно-ориентированная разработка программного обеспечения существует с начала 1960-х годов. Но только во второй половине 1990-х годов объектно-ориентированная парадигма начала набирать обороты, несмотря на тот факт, что популярные объектно-ориентированные языки программирования вроде Smalltalk и C++ уже широко использовались.

Расцвет объектно-ориентированных технологий совпал с началом применения Интернета в качестве платформы для бизнеса и развлечений. А после того как стало очевидным, что Глобальная сеть активно проникает в жизнь людей, объектно-ориентированные технологии уже заняли удобную позицию для того, чтобы помочь в разработке новых веб-технологий. [4, с. 20]

Хотя на протяжении последних 20 лет наблюдалось постоянное и значительное увеличение количества объектно-ориентированных разработок, зависимость мирового сообщества от сетей вроде Интернета и мобильных инфраструктур поспособствовала еще более широкому их распространению. Буквально взрывной рост количества транзакций, осуществляемых в браузерах и мобильных приложениях, открыл совершенно новые рынки, где значительная часть разработок программного обеспечения была новой и главным образом не обремененной заботами, связанными с унаследованными системами. [4, c. 22]

Сегодня одной из наиболее интересных областей разработки программного обеспечения является интеграция унаследованного кода с мобильными и веб системами. Во многих случаях мобильное клиентское веб-приложение в конечном счете «подключается» к данным, располагающимся на мейнфрейме. Разработчики, одновременно обладающие навыками в веб-разработке как для мейнфреймов, так и для мобильных устройств, весьма востребованны. Электронные соединения по сути превратились в соединения, основанные на объектах. Тяготея к мобильным веб-приложениям, бизнес тяготеет к объектам, поскольку технологии, используемые для электронной торговли, по своей природе в основном являются объектно-ориентированными. [4, c. 22]

Несомненно, появление Интернета значительно поспособствовало переходу на объектно-ориентированные технологии. Дело в том, что объекты хорошо подходят для использования в сетях. Хотя Интернет был в авангарде этой смены парадигмы, мобильные сети теперь заняли не последнее место в общей массе. [4, c. 23]

Несмотря на многомиллионные вложения, сделанные в 1970-1980 годах коммерческими компаниями и государственными структурами разных стран в универсальные языки программирования (такие, как Алгол, PL/1, Си) и языки логического программирования (прежде всего Prolog), самой распространенной в мире программной технологией остается ООП. Наиболее известным событием нового тысячелетия в этой сфере стал быстро набравший популярность язык программирования C#. Его можно смело считать лучшим на сегодня объектно-ориентированным средством создания графических приложений.

На данные момент существует более 100 объектно-ориентированных и объектных языков программирования. Объектно-ориентированным можно называть язык, основанный на классах, в котором реализованы наследование и рекурсия (обращение к самому себе). [5, c.104].

В списке 15 наиболее популярных языков программирования согласно рейтингу GitHub, объектно-ориентированные языки занимают большинство позиций. [11]

Среди них TypeScript (15 место), язык, обязанный своим появлением компании Microsoft. Он создан как средство разработки веб-приложений, расширяющее возможности JavaScript. Андерс Хейлсберг является основным разработчиком языка TypeScript который ранее участвовал в создании Turbo Pascal, Delphi и C#.

Язык Swift (14 место) — детище компании Apple, созданный для iPhone-приложений в 2014 году, Swift за довольно короткий срок сумел завоевать популярность.

Scala (13 место) вышел в свет в 2001 году. Его подхватили такие крупные компании, как Airbnb и Apple. По их мнению, на нем проще и быстрее писать приложения для их нужд, нежели на языке Java. Изначально Scala, поддерживающий объектно-ориентированную и функциональную парадигмы, был создан с расчетом на трансляцию в байт-код Java и .NET. Со временем также появился транслятор Scala в код JavaScript — Scala.js. Однако в мае 2016 года стало известно, что в рамках проекта Scala Native создается компилятор, обещающий ускорить выполнение приложений, написанных на этом языке.

Objective-C (12 место) предстал перед публикой в 1983 году. Конечно, в него были добавлены новые идеи и элементы языка Smalltalk, но буква С не зря венчает его название. Особенно распространился Objective-C среди разработчиков под платформы Apple. Пока он удерживает эти позиции, но Swift грозится потеснить потомка С в скором времени.

С# (8 место) — язык программирования, сочетающий объектно-ориентированные и контекстно-ориентированные концепции. Разработан в 1998-2001 годах группой инженеров под руководством Андерсa Хейлсбергa и стал частью первого релиза .NET framework. Язык С# сочетает в себе надежность С++ с дополнительными возможностями Java. Поэтому если вы хорошо знаете Java, можно легко переключиться на С# и наоборот.

Язык С# позволяет разрабатывать практически любые приложения, которые связаны с Visual Studio IDE. Сторонники C# называют его самым мультипарадигменным, универсальным, продвинутым и удобным в использовании языком программирования. Учитывая тот факт, что за ним стоит платформа Microsoft .NET, число таких сторонников достаточно велико.

В 1986 году был разработан С++ (6 место), который является одним из самых распространенных языков в мире. Это компилируемый строго типизированный язык программирования общего назначения. Можно сказать, что это не новый язык, а скорее совместимое снизу-вверх расширение языка С [4, c. 110]. Он поддерживает разные парадигмы программирования: процедурную, обобщённую, функциональную; наибольшее внимание уделено поддержке объектно-ориентированного программирования. Google Chrome, Mozilla Firefox, Winamp и линейка продуктов Adobe были разработаны с помощью С++. Кроме того, некоторые современные игры и операционные системы были разработаны на С++ из-за быстрого процессинга и компиляции. [11]

Ruby (4 место) — интерпретируемый язык программирования высокого уровня. Обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, «сборщиком мусора» и многими другими возможностями, поддерживающими много разных парадигм программирования, прежде всего классово-объектную. Разработанный в 1995 году Юкихиро Мацумто, Ruby был задуман как язык, совмещающий все качества других языков, способствующий облегчению труда программиста. Фреймворк Ruby использовался для разработки Github, Scribd, Yammer, Shopify и Groupon. Ruby сочетает в себе некоторые возможности Lisp, Pearl и Eiffel.

Python (3 место) еще один высокоуровневый язык программирования. Часто он считается самым легким языком, благодаря своей простоте, читаемости и синтаксису. Python был разработан Гвидо Ван Россумом в 1991 году. Python не использовался так широко в прошлом, однако стал особенно популярным за последние годы благодаря инвестициям Google. В настоящее время некоторые весьма известные и надежные сайты работают на python, особенно pinterest.com, instagram.com и rdio.com. Как и PHP, Python можно использовать для разработки веб приложений.

Когда появился язык Java (2 место), он взял рынок штурмом. И для этого были серьезные причины. Java был разработан Джеймсом Гослингом в 1990 году в компании Sun Microsystems. Этот язык дополнительно увеличивает возможности языка С++, однако является исключительно объектно-ориентированным. Java был разработан по принципу WORA (Write Once Run Anywhere или «написав код однажды, вы запустите его везде»). Речь идет про переносимость Java. Необходимо скомпилировать исходный код на Java всего лишь раз, а затем запустить на любой машине с установленным JVM (Java Virtual Machine) и затем использовать. [5, c. 116]

JavaScript (1 место) — мультипарадигменный язык программирования. Поддерживает объектно-ориентированный, императивный и функциональный стили. Обычно он используется как встраиваемый язык для программного доступа к объектам приложений. Наиболее широкое применение находит в браузерах как язык сценариев для придания интерактивности веб-страницам. Основные архитектурными чертами JavaScript являются динамическая типизация, слабая типизация, автоматическое управление памятью, прототипное программирование, функции как объекты первого класса. На JavaScript оказали влияние многие языки, при разработке была цель сделать язык похожим на Java, но при этом лёгким для использования не программистами. Серверные языки сценариев идеально подходят для разработки сложных веб приложений, но каждая такая задача сильно нагружает сервер. Поэтому разработчики делегировали часть функций на сторону клиента и использовали JavaScript. JavaScript — это язык программирования, выполняемый в клиентском браузере и обрабатывает команды на компьютере конечного пользователя, а не сервера, что приводит к снижению нагрузки на сервер и увеличению скорости работы приложения. JavaScript был разработан компанией Netscape и вряд ли есть сайты, которые не используют его. [11]

5. Причины повсеместного распространения ООП

Объектно-ориентированное программирование стало чрезвычайно популярно в последние несколько лет. Производители программного обеспечения заинтересованы в том, чтобы создавать объектно-ориентированные версии своих продуктов.
ООП — это эволюционный шаг, естественным образом вытекающий из предшествующей истории программирования. [1, с. 3]

Перечислим основные причины огромной популярности объектно-ориентированного программирования в последнее десятилетие:

- надежда, что ООП может просто и быстро привести к росту продуктивности и улучшению надежности программ, помогая тем самым разрешить кризис в программном обеспечении;

- желание перейти от существующих языков программирования к новой технологии;

- вдохновляющее сходство с идеями, родившимися в других областях.

Объектно-ориентированное программирование является лишь последним (на данный момент) звеном в длинной цепи решений, которые были предложены для разрешения «кризиса программного обеспечения». Положа руку на сердце: кризис программного обеспечения просто означает, что наше воображение и те задачи, которые мы хотим решить с помощью компьютеров, почти всегда опережают наши возможности.

Несмотря на то что объектно-ориентированное программирование действительно помогает при создании сложных программных систем, важно помнить, что ООП не является «серебряной пулей» (термин, ставший популярным благодаря Фреду Бруксу), которая запросто справляется с чудовищем. Программирование по-прежнему является одной из наиболее трудных задач, взваливаемых на себя человеком.

Чтобы стать профессионалом в программировании, необходимы талант, способность к творчеству, интеллект, знания, логика, умение строить и использовать абстракции и, самое главное, опыт — даже в том случае, когда используются лучшие средства разработки.

Объектно-ориентированное программирование является новым пониманием того, что собственно называется вычислениями, а также того, как мы можем структурировать информацию внутри компьютера. Чтобы стать профессионалом в технике ООП, требуется полная переоценка привычных методов разработки программ.(1, с. 4)

Чтобы эффективно использовать ООП, требуется глядеть на мир иным способом. Само по себе применение объектно-ориентированного языка программирования (такого, как C++) не вынуждает стать объектно-ориентированным программистом. Использование объектно-ориентированного языка упрощает разработку объектно-ориентированных приложений, но, как было остроумно замечено, «программа фортрановского типа может быть написана на любом языке».

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

Объект получается в результате инкапсуляции состояния (данных) и поведения (операций). Тем самым объект во многих отношениях аналогичен модулю или абстрактному типу данных.

Поведение объекта диктуется его классом. Каждый объект является экземпляром некоторого класса. Все экземпляры одного класса будут вести себя одинаковым образом (то есть вызывать те же методы) в ответ на одинаковые запросы. Объект проявляет свое поведение путем вызова метода в ответ на сообщение. Интерпретация сообщения (то есть конкретный используемый метод) зависит от объекта и может быть различной для различных классов объектов. Объекты и классы расширяют понятие абстрактного типа данных путем введения наследования. Классы могут быть организованы в виде иерархического дерева наследования. Данные и поведение, связанные с классами, которые расположены выше в иерархическом дереве, доступны для нижележащих классов. Происходит наследование поведения от родительских классов.

С помощью уменьшения взаимозависимости между компонентами программного обеспечения ООП позволяет разрабатывать системы, пригодные для многократного использования. Такие компоненты могут быть созданы и отлажены как независимые программные единицы, в изоляции от других частей прикладной программы.

Многократно используемые программные компоненты позволяют разработчику иметь дело с проблемами на более высокой ступени абстрагирования. Мы можем определять и манипулировать объектами просто в терминах сообщений, которые они распознают, и работы, которую они выполняют, игнорируя детали реализации.

[1, с. 22-23]

6. Критика ООП

Очевидно, что в настоящее время объектно-ориентированное программирование является магистральным путем развития в индустрии информационных технологий.

В то же время у ООП есть и ряд довольно авторитетных критиков. К ним, в частности, относится такой известный в мире программирования человек, как Никлаус Вирт, создатель языков Паскаль, Модула и Оберон. Он утверждает, в частности, что ООП — не более чем тривиальная надстройка над структурным программированием и преувеличение его значимости, выражающееся в том числе во включении в языки программирования все новых модных «объектно-ориентированных» средств, безусловно, вредит качеству разрабатываемого программного обеспечения. Н. Вирт очень удивлен тем вниманием, которое уделяется ныне ООП. Другой критик ООП — известный специалист по программированию Александр Степанов, который участвовал в создании C++ вместе c Бьерном Страуструпом, а впоследствии написал стандартную библиотеку шаблонов языка программирования С++ (STL). А. Степанов полностью разочаровался в парадигме ООП. Он пишет: «Я уверен, что ООП методологически неверна. Она начинает с построения классов. Это как если бы математики начинали бы с аксиом. Но реально никто не начинает с аксиом, все начинают с доказательств. Только когда найден набор подходящих доказательств, лишь тогда на этой основе выводится аксиома. То есть в математике вы заканчиваете аксиомой. То же самое и с программированием: сначала вы должны начинать развивать алгоритмы, и только в конце этой работы приходите к тому, что вы в состоянии сформулировать четкие и непротиворечивые интерфейсы. Именно из-за этой неразберихи в ООП так популярен рефакторинг — из-за ущербности парадигмы вы просто обречены на переписывание программы уже в тот самый момент, когда только задумали ее спроектировать в ООП-стиле».

Патриарх свободно распространяемого ПО Ричард Столлмэн также известен своим критическим отношением к ООП. Особенно любит он шутить насчет мифа о том, что ООП «ускоряет разработку программ»: «Как только ты сказал слово «объект», можешь сразу забыть о модульности».

Критики, в частности, обращают внимание на следующие обстоятельства:

Внедрение ООП требует дополнительных затрат на обучение программистов и накладных расходов при создании программ — от 12 до 75% времени.

Наследование — самая большая провокация в индустрии, ни в каком моделировании наследования не существует.

Инкапсуляция и повторное использование возможны и без ООП при правильной модульной организации программной системы.

В то же время ряд наиболее сложных и успешно используемых программных систем созданы именно в рамках объектно-ориентированного подхода, его применяют такие гиганты индустрии, как Microsoft, IBM, Oracle.[8, с. 157-158]

Критика несомненно крайне важна, так без критической оценки — невозможно переосмысление и улучшение существующих методик. Однако, следует заметить, что несмотря на все недочеты, ООП все равно остается основным направлением в программировании в наше время. Стоит учесть критические замечания и продолжать развитие.

Заключение

В заключение хотелось бы сказать, что ООП — довольно объемная тема. Целью данной работы было скорее не в полном объеме раскрыть все методики и приемы программирования — для этого существуют научные издания — а скорее пролить свет на эту тему. Из многочисленных источников была собрана и соединена разрозненная информация о развитии программирования. Основную сложность в данной работе составило что разными исследователями используется немного разная терминология. Например, в языке Object Pascal класс называется «объектом» (тип данных object), а надклассы известны как родительский класс, класс-предок и т. д.

Еще одной довольно интересной находкой в ходе данной работы было то, что не все источники едины в том, что является «китами», на которых стоит ООП. Но это вызывает скорее улыбку, чем какое-то непонимание, так как программирование — будучи очень текучей и творческой сферой современных технологий — создается, поддерживается и развивается людьми, у которых могут быть несколько различные взгляды на один и тот же вопрос. Важным является то, чтобы выбранный метод работал, а не, какое он носит название.

ООП, которое является не «венцом эволюции» программирования, а одной из его ступеней, несомненно играет огромную роль в налаживании отношений между машинами и людьми, и оно скорее повернуто лицом к людям, чем к машинам. Если в прошлом требовались значительные усилия и время, а также недюжинная эрудированность в математике и математической логике, чтобы соприкоснуться с программированием, то сейчас, с появлением объектно-ориентированных языков, усвоить азы программирования, а далее изучить его фундаментально, по сути может даже школьник. Именно объектно-ориентированный, или если можно сказать — человеко-ориентированный подход сделал это возможным.

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

По сути все в этом мире является объектом, объектом, который используется человеком, поэтому переход к объектно-ориентированным метода не более, чем логичен и закономерен для нас.

Очевидно, что ООП не является панацеей, эта сфера также переживает своеобразные кризисы, в ней также есть проблемы и недочеты, но на данный момент это наиболее востребованный метод написания самого разнообразного программного обеспечения, не случайно в рейтингах наиболее востребованных языков объектные и объектно-ориентированные языки занимают первые места.

Хотелось бы также напоследок добавить, что такое ключевое понятие ООП, как «абстракция», «абстрагирование», заимствованное из философии в целом является тенденцией развития не только информационных технологий, но и человечества в целом.

Использованные источники

1. Бадд, Т. Объектно-ориентированное программирование в действии. / Т. Бадд — Спб.: «Питер» 1997. — 464с.

2. Бердоносов, В. Д. Объектно-ориентированное программирование: учеб. пособие / В. Д. Бердоносов, А. А. Животова. - Комсомольск-на-Амуре: ФГБОУ ВПО «КнАТГУ», 2015 — 135 с.

3. Буч, Г. Объектно-ориентированное проектирование с примерами применения / Г. Буч — К.: Диалектика; М.: Конкорд, 1992. — 519 с.

4. Вайсфельд, М. Объектно-ориентированное мышление. / М. Вайсфельд — СПб.: Питер, 2014. — 304 с.

5. Грэхэм, И. Объектно-ориентированные методы. Принципы и практика. 3-е издание. Пер с англ. / И. Грэхэм — М. : Издательский дом «Вильямс», 2004 — 880 с.

6. Давыдова, Н. А. Программирование: учебное пособие / Н. А. Давыдова, Е. В. Боровская. — М. : БИНОМ. Лаборатория знаний, 2009. — 238 с.

7. Мухортов, В. В., Рылов, В. Ю. Объектно-ориентированное программирование, анализ и дизайн, методическое пособие / В. В. Мухортов, В. Ю. Рылов — Новосибирск.: 2002. — 108 с.

8. Тюгашев, А. А. Основы программирования. Часть I. / А. А. Тюгашев — Спб: Университет ИТМО, 2016. – 160 с.

9. Бобровский, С., История объектно-ориентированного программирования, PC Week/RE № 28 от 05.08.2003 г., стр. 10, г., стр. 20. URL: https://www.itweek.ru/infrastructure/article/detail.php?ID=64959 и № 29 от 12.08.2003

https://www.itweek.ru/infrastructure/article/detail.php?ID=65030

(дата обращения 14.11.17)

10. Объектно-ориентированное программирование для чайников, 2017, URL: https://progstudy.ru/index.php/sm/article/ob-ektno-orientirovannoe-programmirovanie (дата обращения 07.01.18)

11. Гринштейн, Г., 15 самых популярных языков по версии GitHub, 2016, URL: https://habrahabr.ru/post/310262/ (дата обращения 21.11.17)