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

Основные понятия объектно-ориентированного программирования (Анализ существующих объектно-ориентированных сред разработки программ)

Содержание:

Введение

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

В данной работе рассматриваются основные аспекты объектно-ориентированного программирования.

Объектом исследования в работе является сравнительный анализ объектно-ориентированных сред разработки.

Предметом исследования является объектно-ориентированная технология программирования.

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

Для выполнения цели исследования, необходимо выполнить следующие задачи исследования:

    1. Исследовать теоретические аспекты объектно-ориентированного программирования;
    2. Определить понятие объектно-ориентированного программирования;
    3. Определить основные преимущества и недостатки ООП;
    4. Проанализировать наиболее распространенные обьектно-ориентированные среды разработки;
    5. На основании этого выбрать среды для проведения сравнительного анализа;
    6. Провести сравнительный анализ различных сред разработки.

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

Глава 1. Теоретические аспекты объектно-ориентированного программирования

1.1 Понятие объектно-ориентированного программирования

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

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

Концепция объектно-ориентированного программирования (ООП) появилась более сорока лет назад, как развитие идей процедурного программирования. Идеология процедурного программирования, ничего особенного собой не представляет: все программы представлены набором процедур и функций, в то время как сами процедуры и функции – это последовательности операторов, выполняя которые компьютер модифицирует значения переменных в памяти. Основная программа в процедурном программировании также является процедурой (функцией), в теле которой могут быть вызовы других процедур и функций – подпрограмм. Суть процедурного программирования проста: данные отдельно, поведение отдельно. То из чего состоит процедурный язык программирования (какие конструкции в него входят), я постарался собрать в отдельном разделе. Разделение кода на подпрограммы, во-первых, позволяет выделить повторно используемые фрагменты кода, а во-вторых, делает код программы структурированным.

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

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

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

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

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

1.2 Основные принципы объектно-ориентированного программирования

Основными принципами объектно-ориентированного программирования являются:

Класс - это пользовательская структура данных, которая воедино объединяет данные и функции для работы с ними (поля класса и методы класса);

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

ООП включает три ключевых подхода: наследование, инкапсуляцию и полиморфизм.

Инкапсуляция — свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Некоторые языки (например, С++) отождествляют инкапсуляцию с сокрытием, но большинство (Smalltalk, Eiffel, OCaml) различают эти понятия.

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

Рисунок 1 – Основные принципы объектно-ориентированного программирования

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

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

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

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

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

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

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

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

Основные принципы полиморфизма:

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

1.3 Преимущества и недостатки объектно-ориентированного подхода

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

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

Достоинства ООП:

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

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

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

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

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

К недостаткам ООП также можно отнести следующее:

    1. В сложных иерархиях классов поля и методы в большинстве случаев наследуются с различных уровней. Порой сложно определить методы и поля, которые относятся к данному классу. Чтобы получить такую информацию нужны специальные инструменты, называемые навигаторами классов.
    2. Злоупотребление инкапсуляцией приводит к сложностям расширения класса из-за скрытой логики и данных. Основным моментом является не то, что клиенту не разрешается знать о каких-либо данных, а то, что клиенту для работы с классом нет необходимости знать данные.
    3. Также инкапсуляция влияет на время выполнения программы.

Рисунок 2 – Преимущества и недостатки объектно-ориентированного подхода

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

Три краеугольных камня ООП — наследование, инкапсуляция и полиморфизм — мощные средства/концепции, но также со своими недостатками.

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

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

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

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

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

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

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

Когда мы рассматриваем необходимую функциональность нашего кода, многие из поведений по своей сути являются общими проблемами и потому не относятся к какому-то конкретному типу данных. Тем не менее, эти установки нужно куда-то пристроить, поэтому в итоге мы создаём бессмысленные классы для их содержания. У всех этих бессмысленных сущностей есть привычка становиться ещё более бессмысленными: когда у меня есть много объектов Manager, мне приходится создавать ManagerManager. Такие ManagerManager классы можно зачастую увидеть в продакшне, который по задумке не должен был стать настолько сложным с течением времени.

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

Предположим, что мы хотим создать общий (полиморфный) объект, который принимает какие-то данные и флаг состояния в качестве параметров. Если состояние говорит, что данные валидные (т.е. status === true), на данных можно применить функцию, результат которой будет возвращён вместе с флагом состояния. В противном случае мы не применим функцию и просто вернём данные и флаг.

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

Глава 2. Анализ современных подходов к объектно-ориентированному программированию

2.1 Анализ существующих объектно-ориентированных сред разработки программ

Развитие объектно-ориентированного подхода в технологии программирования подтолкнуло развитие сред визуального программирования.

Примеры объектно-ориентированных языков:

    1. Pascal. С выходом Delphi 7 на официальном уровне стал называться Delphi. Основная область использования Object Pascal - написание прикладного ПО.
    2. C++ широко используется для разработки программного обеспечения, является одним из самых популярных языков. Применяется для создания ОС, прикладных программ, драйверов устройств, приложений, серверов, игр.
    3. Java - транслируется в байт-код, обрабатывается виртуальной машиной Java. Преимуществом такого способа выполнения является независимость от операционной системой и оборудования. Существующие семейства: Standard Edition, Enterprise Edition, Micro Edition, Card.
    4. JavaScript применяется в качестве языка сценариев для web-страниц. Синтаксис во многом напоминает Си и Java. Является реализацией Ecmascript. Сам Ecmascript используется в качестве основы для построения других скриптовых языков, таких как JScript, ActionScript.
    5. Objective-C построен на основе языка Си, а сам код Си понятен компилятору Objective-C.
    6. Perl - высокоуровневый интерпретируемый динамический язык общего назначения. Имеет богатые возможности для работы с текстом, изначально разработан именно для манипуляций с текстом. Сейчас используется в системном администрировании, разработке, сетевом программировании, биоинформатике и т. д.
    7. PHP. Аббревиатура переводится как препроцессор гипертекста. Применяется для разработки веб-приложений, в частности серверной части. С его помощью можно создавать gui-приложения с помощью пакетов PHP-GTK, PHP-Qt, WinBinder.
    8. Python - язык общего назначения, ориентирован на повышение производительности разработчика и читаемость кода. Был разработан проект Cython, с помощью которого осуществляется трансляция программ, написанных на Python в код на языке Си.

Рисунок 3 – Наиболее распространенные среды разработки

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

2.2 Анализ существующих способов сравнения объектно-ориентированных сред разработки

Проанализируем существующие способы сравнения объектно-ориентированных сред разработки:

    1. Статическая типизация
    2. Динамическая типизация
    3. Явная типизация
    4. Неявная типизация
    5. Неявное приведение типов в неоднозначных ситуациях
    6. Шаблоны
    7. Неуправляемые указатели
    8. Ручное управление памятью
    9. Сборка мусора

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

Глава 3. Сравнительный анализ современных объектно-ориентированных языков программирования

3.1 Обоснование выбора различных сред

Проведем сравнительный анализ языков программирования: Delphi, Python, C++, C#, Java.

Краткая характеристика каждого языка программирования представлена в таблице 3.1.

Название

Назначение

Основные особенности

1

Python

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

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

2

C++

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

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

3

C#

Разработка .NET приложений, кроссплатформенных программ.

C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.

4

Java

Сильно типизированный объектно-ориентированный язык программирования. Удобен при разработке мобильных приложений, кроссплатформенных программ

Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой компьютерной архитектуре, с помощью виртуальной Java-машины

5

Delphi

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

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

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

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

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

Язык программирования Python эффективен с точки зрения разработчика: программы делают больше, чем на многих других языках, в гораздо меньшем объёме кода. Значительно простой синтаксис позволяет легко читать код программы, возникает меньше проблем с отладкой и расширением программ. Он же является преимуществом при выборе языка начинающим программистом.

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

Понятие переменной в языке программирования С++ как и в языке программирования Паскаль тождественно: под переменной понимают поименованный участок памяти, в котором хранится значение определенного типа. Другими словами, переменная – это именованная область памяти для хранения данных, которые могут изменяться в процессе выполнения программы. Исходя из определения, отличительными характеристиками данного понятия являются тип, идентификатор и значение. Имена и типы переменных указываются при описании и не могут изменяться в процессе выполнения программы. В Паскале тип переменной объявляется после служебного слова var, в разделе описания переменных.

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

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

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

Существуют различные классификации типов данных. Например, типы данных подразделяются на стандартные и заданные пользователем. К стандартным типам данных относятся int (целый), float (вещественный с плавающей точкой), char (символьный), string (строковый). К типам данных, заданным пользователем, относятся массивы и структуры.

Самой распространенной упрощенной структурой, реализованной практически во всех языках программирования, является массив. Рассмотрим подробнее использование массивов в языках программирования Паскаль, С++ и Python.

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

В языке Паскаль тип массива задается с использованием специального слова array (англ. – массив), после чего указывается тип индекса массива и тип элементов массива. С помощью индекса можно обращаться с отдельными элементами любого массива, как к обычной переменной заданного типа: можно получать значение этого элемента, отдельно присваивать ему значение, использовать его в выражениях. Недостатком языка Паскаль является то, что переменные в массиве можно перебирать с интервалом равным 1 в прямом или обратном порядке с помощью стандартного цикла обхода (цикл for – цикл с параметром).

Доработка языка программирования С++ позволила шире использовать все возможности работы с массивами. При инициализации массива можно задать его размер, но не описывать его значения, можно задать размер и тут же описать этот массив, а можно описать массив, не задавая при этом его размера.

Важным отличием является также то, что можно перебирать элементы массива не только в прямом и обратном порядке, а также устанавливать интервал перебора элементов с помощью того же стандартного цикла обхода. Это является значительным плюсом языка С++ в работе с массивами, а также преимущества данной циклической конструкции for.

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

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

Кортеж используется для представления неизменяемой последовательности разнородных объектов. Его элементы записываются в круглых скобках. Так как кортеж – один из типов последовательностей, то всё, что можно применять к строкам в Python, верно и по отношению к кортежам. Можно найти длину кортежа, вывести все его элементы на экран с помощью цикла for, а также, пользуясь оператором in, проверить кортеж на вхождение какого-либо элемента. Кортежи можно сцеплять, создавать на них срезы.

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

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

При работе с кортежами, словарями и списками удобно пользоваться функцией len(s), где s последовательность. Данная функция определяет длину последовательности. Необходимо заметить, что в Паскаль и С++ такой функции нет! Чтобы в Паскале и С++ определить количество элементов в массиве, необходимо инициализировать новую переменную, присвоить ей значение 0, а затем с помощью цикла for перебрать все элементы массива, увеличивая созданную переменную с каждым элементом на 1 – стандартный цикл обхода массива.

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

Еще одним важным элементом сравнения для анализируемых языков программирования является запись блоков или составных операторов.

Для логически верного использования конструкций языка важно помнить, что в Паскаль блоки выделяются с помощью служебных слов begin – end, в С++ –  с помощью фигурных скобок {}. В языке программирования Python дело обстоит гораздо иначе. Здесь большую роль играют отступы. Вложенные инструкции объединяются в блоки по величине отступов. Отступ может быть любым, главное, чтобы в пределах одного вложенного блока отступ был одинаков. Но не стоит забывать про читаемость кода! Именно эта особенность Python и повышает читаемость кода только лишь спецификацией языка.

Например, при записи условного оператора в первой строке размещается условие (логическое выражение), а в блоке с отступом – практически любое действие. Если условие истинно, то выполняется код в блоке после команды if, а если ложно, этот код игнорируется.

Нередко в программе требуется проверять более двух возможных ситуаций. Для этого в Python предусмотрен синтаксис if – elif – else. Python выполняет только один блок в этой цепочке. Все условия проверяются по порядку до тех пор, пока одно из них не окажется истинным. Далее выполняется код, следующий за этим условием, а все остальные проверки Python пропускает. Для языков С++ и Паскаль реализация подобных ситуаций в коде требует использование вложенных конструкций, что усложняет читабельность кода и требует усиления внимания программиста к выполнению правил их использования («else относится к ближайшему if»).

Использование в Python конструкции if – elif – else похоже на использование операторов выбора сase оf и switch() в Паскале и С++ соответственно.

Циклы while с предусловием и постусловием в данных языках программирования особого отличия не имеют.

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

В С++ дело обстоит немного иначе. Сначала инициализируется параметр цикла, после чего ставится точка с запятой. Затем задается конечное значение счетчика цикла. Снова ставим точку с запятой. Задаем шаг цикла. Шаг цикла – это значение, на которое будет увеличиваться или уменьшаться счетчик цикла при каждом проходе.

Чтобы в Python использовать цикл for необходимо сначала написать служебное слово for, потом имя переменной, в которой предполагается сохранять значения элементов, потом in, затем имя перебираемой последовательности, двоеточие и, наконец, тело цикла.

3.2 Проведение сравнительного анализа

В таблице 3.2 представлены результаты сравнительного анализа.

Таблица 3.2 – Результаты сравнительного анализа языков группы ООП

Python

C++

C#

Java

Delphi

Статическая типизация

+/-

+

+

+

+

Динамическая типизация

+

-

-

-

-

Явная типизация

+/-

+

+

+

+

Неявная типизация

+

-/+

+/-

-

-

Неявное приведение типов в неоднозначных ситуациях

-

+

+

-

+

Шаблоны/Патерны

x

+

-

-

+

Неуправляемые указатели

+

+

+

-

-

Ручное управление памятью

+

+

-

-

-

Сборка мусора

+

-

+

+

+

В предыдущей главе были представлены критерии для сравнения. Рассмотрим описание каждого конкретного:

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

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

Явная типизация – языки данной типизации разнятся тем, что тип новых переменных, функций, их доводов необходимо задавать явно.

Неявная типизация – языки этой типизации переносят эту задачу на компилятор или интерпретатор.

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

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

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

Указатель – это переменная, которая содержит адрес другой переменной в памяти. Например, если переменная a содержит адрес переменной b, то это означает, что переменная a указывает на переменную b. Отличие между управляемыми и неуправляемыми указателями состоит в следующем: в отличие от управляемого указателя неуправляемому указателю можно присвоить любой адрес памяти, даже той, которая находится за пределами исполнительной среды.

Ручное управление памятью состоит в возможности по команде программиста выделить определенное количество оперативной памяти на выполнение операции.

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

Заключение

Объектно-ориентированное программирование (ООП) — это шаблон проектирования программного обеспечения, который позволяет решать задачи с точки зрения объектов и их взаимодействий. ООП обычно реализуется с помощью классов или прототипов. Большинство объектно-ориентированных языков (Java, C++, Ruby, Python и др.) используют наследование на основе классов. JavaScript реализует ООП через прототипное наследование.

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

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

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

Список источников

    1. Архангельский А.Я. Компоненты общего назначения библиотеки C++ Builder 5. - М.: ЗАО "Издательство БИНОМ" 2001 - 416 с.
    2. Архангельский А.Я. Язык Pascal и основы программирования в Delphi - М.: ООО "Бином-Пресс", 2004.
    3. Бокс Д. Сущность технологии COM. Библиотека программиста. 4-е изд. - СПБ.: Питер, 2001 - 400 с.
    4. Глушаков С.В. Программирование на Visual C++ - М.: ООО "Издательство АСТ"; Харьков "Феликс", 2003 - 726 с.
    5. Гослинг Д., Арнольд К. Язык программирования Java. /Пер. с англ. - СПБ.: Питер, 1997 - 304 с.
    6. Доусон М. Программируем на Pyton. – СПб.: Питер, 2017. – 416
    7. Лясин Д.Н., Саньков С.Г. Объектно-ориентированное программирование на языке С++: Учебное пособие./ Волгоград.гос.техн.ун-т,- Волгоград, 2003 – 83 с.
    8. Мэтиз Э. Изучаем Python. Программирование игр, визуализация данных, веб-приложения. – Спб.: Питер, 2017. – 496 c.
    9. Пол Айра Объектно - ориентированное программирование на C++. 2-е изд./Пер. с англ. - СПБ.; М.: "Невский Диалект" - "Издательство БИНОМ", 1999 - 462 с.
    10. Пратт Т., Зелковиц М. Языки программирования: разработка и реализация. 4-е изд. - СПБ.: Питер, 2002 - 688 с.
    11. Столяров А.В. Методы и средства визуального программирования. Раздел «введение в язык C++». М.: МГТУ ГА, 2008 – 112 c.
    12. Страуструп Б. Язык программирования C++. Специальное изд./Пер. с англ. - М.: "Бином", 2005.
    13. Standard for the C Programming Language ISO/IEC 9899, 1990. 2. Standard for the C++ Programming Language ISO/IEC 14882, 1998.