Объектно-ориентированное
программирование. Сравнительный анализ языков объектно-ориентированного
программирования
Оглавление
Введение
. Характеристики и свойства языков программирования
. Некоторые аспекты объектно-ориентированного программирования
. Исследование эволюции объектно-ориентированных языков программирования
Заключение
Список использованной литературы
Введение
Языки программирования являются средством представления знаний для компьютерных систем. Они предлагают концептуальные средства представления и возможности моделирования, приспособленные к решению конкретных задач. При этом концепции языков программирования складываются и развиваются в результате стремления разработчиков снизить «семантический разрыв» между языком описания работы вычислительного устройства и языком, на котором осуществляется постановка задачи. Развитие языков на эмпирическом уровне определяется развитием вычислительной техники. На теоретическом уровне изменения в представлениях о языках программирования определяется выбором формы управления вычислительными устройствами. Многообразие концепций языков, разработанных за период в 60 лет, привело к многообразию парадигм программирования, сложившихся к настоящему времени.
Концептуальные идеи языков программирования, которые нашли свое отражение в современных языках программирования, сыграли важную роль в теории программирования. А знание способов реализации в них семантических структур является важным фактором при выборе языка программирования для решения поставленной задачи.
На сегодняшний день количество прикладных языков программирования, реализующих объектно-ориентированную парадигму, является наибольшим по отношению к другим парадигмам программирования.
Практически все широко используемые языки являются объектно-ориентированными, развивая и совершенствуя прикладные средства реализации объектно-ориентированных возможностей. В образовательном процессе в силу ограниченности времени при изучении объектно-ориентированного программирования (ООП) рассматриваются, как правило, возможности какого-либо одного языка, что приводит к игнорированию полезных и эффективных механизмов ООП в других языках. Таким образом, является актуальной систематизация знаний об объектно-ориентированном подходе к программированию и его реализации в различных языках программирования.
Целью данной работы является изучение и анализ языков объектно-ориентированного программирования.
Для достижения поставленной цели был выбран ТРИЗ - эволюционный подход. Кроме того, были использованы следующие инструменты ТРИЗ: приемы разрешения технических противоречий; законы развития технических систем.
Наряду с методологией построения программного обеспечения также, несомненно, важны особенности конкретного языка программирования, поскольку, в конечном счете, конструкции должны быть выражены на каком-то языке.
Выделим группу механизмов, которая определяет особенности разработки программ на том или ином языке программирования: синтаксис, структура программы, отладка.
С развитием языков программирования перечисленные механизмы также эволюционировали и на данный момент представляют собой наборы элементов, в разной степени, реализуемые в языках программирования.
Для достижения поставленной цели необходимо решить задачи:
. Дать характеристику и определить свойства языков программирования.
. Изучить аспекты объектно-ориентированного программирования.
. Построить и проанализировать ТРИЗ - эволюционную карту механизмов ООП на основе анализа развития объектно-ориентированных языков программирования.
. Для наглядности также построить S-образную кривую развития языков программирования, откладывая по вертикальной оси оценку языка с точки зрения реализации объектно-ориентированных возможностей.
Представленная к защите работа структурно
состоит из оглавления, введения, трех параграфов, заключения и списка
использованной литературы.
1. Характеристики и свойства языков
программирования
Основными характеристиками, позволяющими сравнивать языки программирования и выбирать наилучшие для решения той или иной задачи, являются: мощность, уровень и концептуальная целостность.
Мощность языка характеризуется количеством и разнообразием задач, алгоритмы, решения которых можно записать, используя этот язык. Очевидно, самым мощным является машинный язык. Любую задачу, запрограммированную на каком-либо языке, можно запрограммировать и на машинном языке. язык программирование интерфейс
Уровень языка характеризуется сложностью решения задач с помощью этого языка. Чем проще записывается решение задач, чем более непосредственно реализуются сложные операции и понятия, чем меньше объем получаемых программ, тем выше уровень языка.
Концептуальная целостность языка, в свою очередь, характеризуется совокупностью понятий, служащих для описания этого языка, и включает три взаимосвязанных аспекта: экономию, ортогональность и единообразие понятий. Экономия понятий предполагает достижение максимальной мощности языка с помощью минимального числа понятий. Ортогональность понятий означает, что между понятиями не должно быть взаимного влияния. Так, если какое-либо понятие используется в различных контекстах, то правила использования должны быть одни и те же. Единообразие понятий требует согласованного, единого подхода к описанию и использованию всех понятий.
Обычно чем меньше мощность языка (то есть чем уже область его применения), тем выше его уровень. По этой причине наряду с универсальными языками разрабатываются и специализированные языки в некоторой конкретной области. Конечно, чем мощнее язык, тем труднее обеспечить концептуальную целостность; в то же время высокий уровень языка непосредственно связан с концептуальной целостностью.
Перечисленные характеристики языков программирования определяют наличие или отсутствие свойств: надежности, удобочитаемости, полноты, гибкости, простоты. Эти свойства позволяют наиболее детально сравнивать языки.
Надежность языка обеспечивает минимум ошибок при написании программ. Для этого язык должен быть таким, чтобы было трудно делать ошибки, не обнаруживаемые при компиляции. Например, благодаря наличию в языке требования, чтобы все переменные были объявлены до использования, ошибки, связанные с неправильным написанием имен, выявляются при компиляции (то есть автоматически). Язык должен защищать программиста от него самого, сделав трудным или даже невозможным появление некоторых ошибок. Так, плохо, если можно сделать одно и то же более чем одним способом: лишняя возможность выбора может привести к ошибке. Примером более тонкой защиты программиста является трактовка отношения равенства: поскольку точное равенство двух чисел с плавающей точкой есть не что иное, как удачное совпадение, то разумно определить его как приблизительное равенство с некоторой точностью.
Удобочитаемость языка - это свойство, обеспечивающее легкость восприятия программ человеком. Удобочитаемость зависит от широкого спектра факторов, включающего, с одной стороны, выбор ключевых слов, а с другой - возможность модулеризации программы. Главное, чтобы нотация языка позволяла при чтении программы легко выделять основные понятия каждой конкретной части программы, не обращаясь к сопровождающим ее описаниям.
Высокая степень удобочитаемости оказывается полезной с различных точек зрения. Во-первых, уменьшается сложность документирования, если центральным элементом документации является сама программа. Во-вторых, удобочитаемость позволяет легче сопровождать программу: ясно, что существенные изменения в программе могут быть сделаны лишь тогда, когда ее работа понимается совершенно правильно.
Очевидно, что реализация требований удобочитаемости зависит от самого программиста, который должен постараться по возможности четче структурировать свою программу и так расположить ее текст, чтобы подчеркнуть эту структуру. Тем не менее, важную роль играет и используемый программистом язык. На нижних уровнях программных конструкций язык должен обеспечить возможность четкой спецификации того, какие объекты данных подвергаются обработке и как они используются. Эта информация определяется выбором идентификаторов и спецификаций типов данных.
Программиста не нужно заставлять прибегать к искусственным построениям, вводя в язык такие ограничения, как максимальная длина идентификатора или определенные фиксированные типы данных. Алгоритмические структуры должны выражаться в терминах легко понимаемых структур управления. Ключевые слова не следует сводить к аббревиатурам, а символы операций должны быть выбраны так, чтобы они отображали их смысл. На более высоких уровнях программных конструкций язык должен обеспечивать возможность модулеризации. Общее поведение программы гораздо легче понять, когда она составлена из ряда автономных единиц, каждая из которых должна быть понятна вне связи с остальными частями программы.
Полнота языка обеспечивает описание на языке решения задач определенной предметной области, а также с помощью средств языка, например средств отладки, процесса разработки программ.
Гибкость языка обеспечивает легкость выражения на языке необходимых для решения задач действий, предоставляет программисту достаточно возможностей для выражения всех операций в программе.
Простота языка обеспечивает легкость понимания семантики языковых конструкций и запоминания их синтаксиса. А это в свою очередь позволяет уменьшить затраты на обучение программиста и вероятность совершения ошибок, возникающих в результате неправильной интерпретации спецификаций языка. Например, язык должен быть таким, чтобы конструкции, означающие близкие по смыслу понятия, и выглядели одинаково, и, что еще более важно, конструкции, означающие различные понятия, должны выглядеть по-разному.
При сравнении и выборе языков программирования следует учитывать еще два свойства языка, хотя они и не влияют непосредственно на процесс разработки программ. Это мобильность и эффективность.
Мобильность языка обеспечивает независимость его аппаратных средств, позволяет переносить программное обеспечение с машины на машину с относительной легкостью.
Эффективность языка обеспечивает эффективную реализацию языка (включая эффективную реализацию компилятора и эффективные программы, генерируемые компилятором). В настоящее время в связи с все снижающейся стоимостью аппаратных средств и все возрастающей стоимостью программного обеспечения необходимость эффективности отходит на второй план по сравнению с надежностью.
Эффективность создания, тестирования и использования программы хорошо иллюстрируется языком АПЛ. При использовании этого языка для решения некоторого класса задач проектирование, кодирование, тестирование, модификация и выполнение программы отнимает у программиста минимальное количество времени и энергии. АПЛ может быть назван эффективным в полном смысле слова - он позволяет минимизировать суммарное время и энергию, затрачиваемые на решение задач на ЭВМ.
Описание свойства языков можно еще более детализировать, указав их зависимость от тех или иных частных требований к языкам. Совокупность этих требований уже довольно велика, что затрудняет их прямое использование для сравнения и выбора языков. Именно поэтому целесообразно остановиться на перечисленных выше трех характеристиках и семи свойствах. Однако для адекватного оценивания характеристик и свойств необходимо знать их зависимость от многочисленных требований.
Основу любого объектно-ориентированного языка программирования (ООП) составляет объектно-ориентированный подход, строящийся на технической основе, элементы которой образуют объектную модель проектирования, которая объединяет в себе принципы абстракции, инкапсуляции, полиморфизма, модульности и иерархии [3].
В целом на сегодняшний день нет точного определения ООП или объектно-ориентированного языка программирования. В различной литературе авторы дают различное разъяснение этим терминам. Основываясь на этих определениях [2; 3; 8], определим объектно-ориентированный язык программирования как язык программирования, в качестве базовых элементов которого выступают объекты, имеющие собственные свойства и методы и образующие иерархически организованные классы объектов.
Концептуальную базу объектно-ориентированного подхода к разработке программ составляют четыре основных механизма [3]: абстракция, инкапсуляция, полиморфизм, наследование.
С момента зарождения объектно-ориентированного
подхода концептуальная база ООП развивалась и эволюционировала вместе с
языками, реализующими данных подход к программированию. Каждый более поздний
элемент в наборе механизмов расширяет функциональные возможности языка в рамках
реализации ООП.
2. Некоторые аспекты объектно-ориентированного
программирования
Если приемы процедурного программирования концентрируются на алгоритмах, то объектно-ориентированное программирование (ООП) концентрируется на сути задачи. Элементы программы разрабатываются в соответствии с объектами, присутствующими в описании задачи. Отсюда и терминология - «Объектно-ориентированное программирование». При этом первичными считаются объекты (данные), которые могут активно взаимодействовать друг с другом с помощью механизма передачи сообщений (называемого также и механизмом вызова методов). Функция программиста - определить объекты, взаимодействие которых после старта программы приведет к достижению необходимого конечного результата.
Общий подход к ООП включает в себя следующие концепции [6]:
) наличие типов, определенных пользователем;
) скрытие деталей реализации (инкапсуляция);
) использование кода через наследование; разрешение интерпретации вызова функции во время выполнения программы (полиморфизм).
Известно, что реальные/физические объекты окружающего мира обладают тремя базовыми характеристиками:
1) набором свойств, характеризующих объект;
2) способностью объекта изменять свойства;
3) способностью реагировать на события как в окружающем мире, так и внутри самого себя.
Хотя термины «тип данных» (или просто тип) и «абстрактный тип данных» звучат похоже, они имеют различный смысл. В языках программирования тип данных (переменной) обозначает множество значений, которые может принимать эта переменная. Абстрактный тип данных (АТД) определяется как математическая модель с совокупностью операторов, определенных в рамках этой модели.
Таким образом, классы могут служить простым примером АТД.
Разработку класса - абстрактного типа данных рекомендуется начинать с разработки информационной и математической моделей реального или физического объекта, как это показано в схеме, представленной на рис. 1.
В соответствии с этой схемой на начальном этапе
исследования задачи нужно выделить физические объекты. После чего нужно
определить свойства, характеризующие каждый физический/реальный объект. Следует
отметить, что из множества свойств объекта следует взять только те, которые
необходимы для решения задачи. Во избежание избыточности следует выяснить:
какие из свойств являются базовыми; какие свойства можно получить на основании
базовых свойств, какие свойства будут меняться; как воздействовать на объект с
целью изменения его свойств; в каких процессах будет задействован объект и как
это отразится на его свойствах (действия над объектом).