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

Объектно-ориентированное программирование

Содержание:

Введение

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

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

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

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

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

Объект исследования – языки программирования высокого уровня.

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

Для достижения поставленной цели предстоит решить ряд задач:

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

При написании работы в качестве опорных источников использовались следующие:

  • Г.И. Радченко – «Объектно-ориентированное программирование»;
  • А.А. Тюгашев – «Основы программирования».

1. Языки программирования

На протяжении всего развития языков программирования четко выделяется ряд тенденций, постоянно сменяющих друг друга и оказывающих влияние на технологии:

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

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

1.1. Первое поколение

Первые языки программирования были очень сложны. Схема их развития отражена в таблице 1. Из данной таблицы видно, что большинство идей, являющихся основой современных языков программирования, зародились в том или ином виде уже к 1970 году. Дальнейшие языки чаще всего являются потомками или результатом обобщения и развития указанных. Данный факт объясняется широким распространением мини- и микро-ЭВМ, а также ростом количества разработчиков ПО [1].

Таблица 1 – Первые языки программирования

Поколение

Язык

Характеристики

Первое (1954-1958)

FORTRAN I

Математические формулы

ALGOL-58

Flowmatic

IPL V

Второе (1959-1961)

FORTRAN II

Подпрограммы, раздельная компиляция

ALGOL-60

Блочные структуры, типы данных

COBOL

Описание данных, работа с файлами

Lisp

Обработка списков, указатели, сборка мусора

Третье (1962-1970)

PL/1

FORTRAN+ALGOL+COBOL

ALGOL-68

Более простые преемники ALGOL-60

Pascal

Simula

Классы, абстрактные данные

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

К характерным чертам этих машин относятся:

  • малое количество оперативной памяти;
  • несовершенство системы ввода-вывода данных.

Эти ограничения и высокая стоимость машин позволяли работать на них только высококвалифицированным специалистам, которые были способны создавать программы на уровне двоичных кодов. Для облегчения процесса программирования вскоре были созданы языки первого поколения. Их задачей было приблизить программирование к предметной области, отдаляя тем самым от конкретной ЭВМ. Словарь таких языков по большей части состоял из математических функций. Топология языков первого и второго поколений представлена на рисунке 1 [10].

Рисунок 1 – Топология языков программирования первого и начала второго поколений

1.2. Второе поколение

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

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

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

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

Рисунок 2 – Топология языков программирования конца второго и начала третьего поколений

1.3. Третье поколение

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

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

Чаще всего модули содержат подпрограммы, которые должны разрабатываться, изменяться и использоваться исключительно совместно. Сюда же относятся и данные, используемые этими подпрограммами. Развитие модулей вывело их на новый уровень абстракции программных систем [20].

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

Наиболее ярким представителем языков третьего поколения является ALGOL-68 – универсальный язык программирования, в котором были реализованы практически все существующие к тому времени механизмы. Данный язык позволял создавать системы корпоративного масштаба для больших ЭВМ. Однако, он был достаточно сложен для первоначального обучения [5].

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

Основной задачей создания Pascal являлась именно задача обучения структурному программированию, а цель разработки языка C – написание операционной системы Unix.

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

Топология языков программирования конца третьего поколения представлена на рисунке 3 [7].

Рисунок 3 – Топология языков программирования конца третьего поколения

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

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

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

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

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

  • состоянием, поведение и идентичность;
  • структура и поведение схожих объектов определяет общий для них класс;
  • термин «объект» синонимичен термину «экземпляр класса».

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

Топология языков объектно-ориентированного программирования представлена на рисунке 4.

Рисунок 4 – Топология объектно-ориентированных языков программирования

1.4. Выводы

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

2. Объектно-ориентированное программирование

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

  • абстрагирование;
  • инкапсуляция;
  • модульность;
  • иерархия.

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

  • типизация;
  • параллелизм;
  • сохраняемость [17].

2.1. Абстрагирование

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

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

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

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

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

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

В рамках ООП принято выделять несколько групп абстракций:

  • сущности – объект является моделью некоторой определенной сущности из рассматриваемой предметной области;
  • поведения – объект представляет собой множество операций (действий) реальной сущности;
  • виртуальной машины – объект группирует операции, которые вместе используются более высоким уровнем управления, либо сами применяют некоторый набор операций низкого уровня;
  • прочие – объекты, состоящие из операций, никак не связанных между собой [19].

2.2. Инкапсуляция

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

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

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

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

2.3. Модульность

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

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

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

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

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

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

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

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

Разработчики ПО должны стремиться к минимизации интерфейсных элементов модулей с целью уменьшения числа связей между различными элементами системы. В состав модулей должны входить только логически связанные абстракции. Также важно помнить, что модуль представляет собой минимальную единицу переиспользования и размещения ПО. Использование даже одного класса ведет к возникновению зависимости на весь модуль [11].

2.4. Иерархия

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

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

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

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

  • структуры классов;
  • структуры объектов.

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

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

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

Если класс имеет несколько родительских классов, такое наследование называется множественным [13].

2.5. Типизация

Абстракция является основой создания понятия типа.

Под типом принято понимать точную характеристику свойств, включая структуру и поведение, относящуюся к некоторой совокупности объектов.

Важно отметить, что различные языки программирования по-разному определяют понятия «тип» и «класс», однако во всех языках эти понятия неразделимы.

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

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

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

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

В Java пользовательские типы можно приводить друг к другу только в рамках используемой иерархии наследования.

И в C++, и в Java имеются средства явного преобразования и проверки типов во время исполнения.

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

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

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

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

Монорфизм представляет собой противоположность полиморфизма. Данный принцип характерен для языков с сильной типизацией и статическим связыванием [18].

2.6. Параллелизм

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

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

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

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

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

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

Параллелизм может обеспечиваться не только средствами языка, как это сделано в Java, но и специальными библиотеками, которые используются для разработки параллельных систем на языках, не имеющих встроенной поддержки этого принципа, например в C++ [16].

2.7. Сохраняемость

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

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

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

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

2.8. Выводы

В рамках данной главы рассмотрены основные принципы ООП и их реализация в различных языках.

3. Язык C#

3.1. История создания

Язык программирования C# является одним из представителей множества объектно-ориентированных языков программирования, разработанных в период 1998-2001 гг. компанией Microsoft под руководством А. Хейлсберга. Изначально цель данного языка заключалась в разработке прикладных программ для платформы Microsoft .NET Framework [10].

Свое название язык берет от музыкальной нотации, где символ диез обозначает повышение на полутон звука, соответствующего ноте. В случае программирования данный подход аналогичен названию языка C++, где «++» обозначает операцию инкремента переменной. Также название является игрой с цепочкой преобразований C → C++ → C++++(C#), так как символ «#» может быть представлен из четырех символов «+».

По причине существующих технических ограничений на отображение и того факта, что знак диез отсутствует на классической клавиатуре, для отображения названия используется знак номера «#» - это соглашение зафиксировано в спецификации ECMA-334 [19].

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

Основой языка C# стали лучшие черты языков-предшественников, таких как Modula, Pascal, C++, Smalltalk и, особенно Java. В C# нет моделей, которые считаются проблематичными в процессе разработки программных систем. Так, например, данный язык не предоставляет возможность множественного наследования классов, которая доступна в C++ и Java. Эта особенность избавляет разработчика от избыточных ошибок еще на этапе проектирования будущей структуры программы [20].

3.2. Характерные особенности

Одной из задач языка C# была задача создания прикладного языка общеязыковой исполняющей среды (Common Language Runtime, CLR - исполняющая среда для байт-кода, в которой компилируются программы, написанные на языках программирования, совместимых с платформой .NET) [3].

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

Развитие информационных технологий способствовало развитию языка программирования C#. Компания Microsoft постоянно обновляет список доступных технологий, компонентов и библиотек. Кроме того, развитие глобальной сети Интернет позволило создавать web-приложения на языке C#, опираясь на технологии ADO+, SOAP, COM+ и BiztalkFramework.

Разработчики языка C# хотели создать универсальный язык, позволяющий успешно сочетать в себе выразительность и простоту существующих объектно-ориентированных языков с мощными возможностями C++, из которого были взяты все основные языковые конструкции. Так, например, в языке C# можно встретить такие типы, как перечисления и структуры, отсутствующие в Java. Еще одним предшественником в области синтаксиса C# является язык VisualBasic, из которого взяты понятия свойств классов [12].

Одним из недостатков C# являются операции, критичные по продолжительности исполнения. Этот факт объясняется тем, что в С# нет некоторых ключевых моментов, необходимых для создания высокопроизводительных приложений. Так, например, в нем отсутствуют подставляемые деструкторы и функции, исполнение которых гарантировано в определенных местах программного кода [11].

Таким образом, к характерным особенностям языка C# относятся:

  • полный набор основных типов данных, доступных в C++;
  • поддержка технологии объектно-ориентированного программирования, в том числе наследование интерфейсов, перегрузка операторов и виртуальных функций;
  • наличие стандартной библиотеки шаблонных классов .NET, а также возможность легкого использования Windows API;
  • автоматическое освобождение динамической памяти;
  • автоматическая генерация XML-документов;
  • возможность добавления меток в виде атрибутов не только классам, но и методам. Эта особенность является полезной в случаях документирования, что позволяет воздействовать на процесс компиляции (например, пользуясь данной особенностью, можно особым образом помечать методы, которые необходимо компилировать исключительно в режиме отладки);
  • поддержка событий и свойств в стиле Visual Basic;
  • реализация прямого доступа к памяти и использование указателей (хотя C# разработан таким образом, что позволяет обходиться без этих особенностей);
  • быстрое и легкое изменение ключей компиляции, с помощью которых формируются библиотеки компонентов .NET или исполняемые файлы, используемые в последствии другим программным кодом аналогично элементам управления ActiveX (компоненты СОМ);
  • создание динамических web-страниц ASP.NET [13, 15].

3.3. Платформа .NET

Схема работы .NET Framework изображена на рисунке 5.

Рисунок 5 – Схема работы .NET Framework

Первой задачей любого разработчика является выбор среды разработки и компилятора, отвечающего за создание промежуточного кода на языке MSIL. С помощью базовых инструментов, поставляемых компанией Microsoft, разработчик может оперировать не только языком С#, но также C++ или Visual Basic. Кроме того, в настоящее время более двадцати независимых компаний предлагают собственные программные продукты, предназначенные для работы с платформой .NET.

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

В состав готового приложения .NET включаются сборки, представляющие собой один или несколько файлов, в которых кроме MSIL-кода также хранятся и метаданные. Метаданными принято называть различную служебную информацию о приложении. Таким образом, приложения .NET не требуют регистрации в системном реестре, аналогично COM-приложениям, потому что вся требующаяся информация поставляется вместе с приложением. Сюда же, к примеру, добавляются данные о разработчике, версии приложения и т.п.

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

После запуска приложения в дело вступает среда выполнения приложения CLR, которая загружает сборки приложения и обеспечивает его выполнение. Но для этого необходимо преобразовать код MSIL в машинные команды процессора [18].

3.4. Основы языка

3.4.1. Пространство имён

.NET Framework дает программисту определенный базовый набор различных функций. Каждая функция принадлежит какому-то конкретному классу. Классы группируются по пространствам имен. Эти пространства обладают вложенной структурой и могут быть представлены в виде иерархии Для навигации между пространствами в C# используется ключевое слово «using».

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

3.4.2. Система типов

В языке программирования C# система типов характеризуется типами двух категорий. В свою очередь, каждая категория содержит подкатегории: типы-значения и типы-ссылки.

На рисунке 6 изображена схема типов языка C#.

Рисунок 6 – Схема типов языка C#

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

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

К простым типам относятся:

  • целые числа (int);
  • числа с плавающей точкой (float);
  • decimal;
  • логический тип (bool).

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

Наряду с простыми типами, существуют еще и производные - типы, требующие предварительного объявления.

Основные отличия ссылочных типов от типов-значений представлены в таблице 2.

Таблица 2 – Отличия типов-значений и ссылочных типов

Тип-значение

Ссылочный тип

Содержимое

Значение

Ссылка

Хранение

В стеке

В динамической памяти

Значение по умолчанию

0, false, ‘\0’

null

Особенности копирования

Копируется значение

Копируется ссылка

Объявление любого класса или структуры в языке C# основано на объявлении предопределенного класса Object (наследование от класса Object). В результате этого разработчик получает возможность вызова от имени объектов-представителей любой структуры или класса методов-наследников класса Object. В частности, метода ToString, который предназначен для получения строкового (значение типа string) представления объекта.

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

3.5. Выводы

В данной главе описана история создания языка высокого уровня C#, его характерные особенности и основы, а также платформа .NET.

Заключение

В рамках выполнения данной курсовой работы рассмотрена тема «Обзор языков программирования высокого уровня».

Первая глава работы дает общее представление о языках программирования, рассматривая их эволюцию.

На протяжении всего развития языков программирования четко выделяется ряд тенденций, постоянно сменяющих друг друга и оказывающих влияние на технологии:

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

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

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

В рамках второй главы приводится подробное рассмотрение основных принципов ООП, а именно:

  • абстрагирование;
  • инкапсуляция;
  • модульность;
  • иерархия;
  • типизация;
  • парллелизм;
  • сохраняемость.

Во третьей главе работы рассмотрен язык программирования высокого уровня C#. К основным особенностям данного языка относятся:

  • поддержка объектно-ориентированного программирования;
  • полный набор основных типов данных;
  • реализация возможности автоматического освобождения динамически распределенной памяти;
  • встроенная функция автоматической генерации XML-документов;
  • доступ к библиотеке шаблонных классов .NET;
  • возможность добавления меток в виде атрибутов классам и методам;
  • поддержка событий и свойств в стиле Visual Basic;
  • прямой доступ к памяти и указатели;
  • легкое и быстрое изменение ключей компиляции.

Список использованных источников

  1. Бертран М. Основы объектно-ориентированного программирования. – М.: НОУ «Интуит», 2016. – 970 с.
  2. Булицын С.А. Объектно-ориентированное программирование / С.А. Булицын, Ю.В. Кузнецова, Д.Е. Малаханов. – М.: МГДД(Ю)Т, 2013. – 31 с.
  3. Вайсфельд М. Объектно-ориентированное мышление. – СПб.: Питер, 2014. – 304 с.
  4. Виллемер А. Программирование на С++. – М.: Эксмо, 2013. – 528 с.
  5. Захарова А.А. Информатика и программирование / А.А. Захарова, Е.В. Молнина, Т.Ю. Черныева. – Томск: Изд-во ТПУ, 2013. – 318 с.
  6. Иванов В.Б. Прикладное программирование на С/С++. – М.: СОЛОН-ПРЕСС, 2014. – 240 с.
  7. Иванова Г.С. Технология программирования. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2014. – 56 с.
  8. Кузнецов М.В. С++. Мастер-класс в задачах и примерах / М.В. Кузнецов, И.В. Симдянов. – СПб.: БХВ-Петербург, 2014. – 480 с.
  9. Лафоре П. Объектно-ориентированное программирование в C++. – СПб.: Питтер, 2014. – 928 с.
  10. Липачевв Е.К. Технология программирования. – Казань: Изд-во Казан. ун-та, 2014. – 142с.
  11. Мейерс С. Наиболее эффективное использование С++. – М.: ДМК Пресс, 2014. – 298 с.
  12. Мухортов В.В. Объектно-ориентированное программирование, анализ и дизайн / В.В. Мухортов, В.Ю. Рылов. – Новосибирск: ООО «Новософт», 2014. – 108 с.
  13. Никехин А.А. Основы С++ для моделирования и расчетов. – СПб.: НИУ ИТМО, 2014. – 106 с.
  14. Орлов С.А. Теория и практика языков программирования. – СПб.: Питер, 2017. – 688 с.
  15. Павловская Т.А. Программирование на языке высокого уровня С++. – СПб.: Питер, 2013. – 461 с.
  16. Пахомов Б.И. C/C++ и MS Visual C++ 2012 для начинающих. – СПб.: БХВ-Петербург, 2013. – 512 с.
  17. Радченко Г.И. Объектно-ориентированное программирование / Г.И. Радченко, Е.А. Захарова. – Челябинск: ЮУрГУ, 2013. – 167 с.
  18. Соловьев С.В. Технология разработки прикладного программного обеспечения / С.В. Соловьев, Л.С. Гринкруг, Р.И. Цой. – М.: БИНОМ, 2012. – 321 с.
  19. Тюгашев А.А. Основы программирования. – СПб.: ИТМО, 2016. – 164 с.
  20. Эшаров Э.А. Основы объектно-ориентированного программирования. – Томск: Изд-во ТГАСУ, 2013. – 86 с.