Добавлен: 01.04.2023
Просмотров: 112
Скачиваний: 2
СОДЕРЖАНИЕ
- тяжелая – основой которой являются процессы операционной системы. В данном случае каждый поток обладает собственным адресным пространством;
- легкая – основой которой являются потоки в рамках одного процесса. В данном случае потоки используют одно адресное пространство.
Программа, работающая в системе с легкой многопоточностью, представляет собой совокупность нескольких потоков управления и точек синхронизации. Точки синхронизации служат для реализации целостности совместно используемых данных и взаимодействия потоков.
В ООП потоки управления реализованы в виде активных объектов, которые являются инициаторами всех действий, происходящих в системе. Параллелизм дает возможность нескольким объектам действовать одновременно.
Параллелизм может обеспечиваться не только средствами языка, как это сделано в 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.