ДонНТУ   Портал магистров

Почему следует программировать под .NET Framework

Я уже давно увлекаюсь программированием под .NET Framework. .NET мне нравится, прежде всего, тем, что содержит большую библиотеку классов, которая позволяет быстро решить практически все задачи современного программирования. Также по сравнению со своим главным конкурентом Java MSIL код выполняется быстрее. Немало важным плюсом в сторону .NET является то, что на рынке труда работодатели готовы платить хорошие деньги за знание и умение программировать под эту платформу. Что же такое .NET и что она из себя представляет? NET – программная платформа, выпущенная компанией Microsoft в 2002 году. Основой платформы является исполняющая среда Common Language Runtime (CLR), способная выполнять как обычные программы, так и серверные веб-приложения. .NET Framework поддерживает создание программ, написанных на разных языках программирования [1].

Структура платформы .NET

Центральной частью каркаса .NET является его общеязыковая исполняющая среда, известная как Common Language Runtime (CLR) или .NET runtime. Код, выполняемый под управлением CLR, часто называют управляемым кодом [2].

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

1. Компиляция исходного кода в Microsoft Intermediate Language (IL);

2. Компиляция IL в специфичный для платформы код с помощью CLR.

Этот двухшаговый процесс компиляции очень важен, потому что наличие Microsoft Intermediate Language (IL) является ключом ко многим преимуществам .NET.

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

Независимость от платформы

Первым делом, это значит, что файл, содержащий инструкции байт-кода, может быть размещен на любой платформе; во время выполнения может быть легко проведена финальная стадия компиляции, что позволит выполнить код на конкретной платформе. Другими словами, компилируя в IL, вы получаете платформенную независимость .NET – во многом так же, как компиляция в байт-код Java обеспечивает независимость от платформы программам на Java [1].

Повышение производительности

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

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

Традиционные компиляторы оптимизируют код, но они могут проводить лишь оптимизацию, не зависящую от конкретного процессора, на котором код будет выполняться. Это происходит потому, что традиционные компиляторы генерируют исполняемый код до того, как он поставляется пользователям. А потому компилятору не известно, на каком типе процессора они будут работать, за исключением самых общих характеристик вроде того, что это будет х86-совместимый процессор либо же процессор Alpha [4].

Языковая способность к взаимодействию

Применение IL не только обеспечивает независимость от платформы; оно также обеспечивает способность к взаимодействию [5]. Только представьте, что вы можете скомпилировать программу на одном языке в код IL, и этот скомпилированный код сможет свободно взаимодействовать с IL-кодом, скомпилированным из другого языка.

Базовая библиотека классов

Base Class Library, сокращённо BCL – стандартная библиотека классов платформы «.NET Framework». Программы, написанные на любом из языков, поддерживающих платформу .NET, могут пользоваться классами и методами BCL – создавать объекты классов, вызывать их методы, наследовать необходимые классы BCL и т. д.

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

В отличие от многих других библиотек классов, например, MFC, ATL/WTL или SmartWin, библиотека BCL не является некоей «надстройкой» над функциями операционной системы или над каким-либо API. Библиотеки BCL является органической частью самой платформы .NET Framework, её «родным» API. Её можно рассматривать как API виртуальной машины .NET. BCL обновляется с каждой версией .NET Framework [2].

Пространства имён (Namespaces)

System. Наиболее важное пространство имён. Включает в себя все примитивные типы языка C#: «пустой» тип Void, знаковые и беззнаковые целочисленные типы (например, Int32), типы чисел с плавающей запятой одинарной и двойной точности (Single, Double), «финансовый» тип Decimal, логический тип Boolean, символьный и строковый типы Char и String, а также, например, тип DateTime и другие. Обеспечивает также необходимым набором инструментов для работы с консолью, математическими функциями, и базовыми классами для атрибутов, исключений и массивов [2].

System.Collections. Определяет множество общих контейнеров или коллекций, используемых в программировании – такие как список, очередь, стек, хеш-таблица и некоторые другие. Также включена поддержка обобщений (Generics) [2].

System.Data. Это пространство имён представляет архитектуру ADO.NET, являющуюся набором программных компонентов, которые могут быть использованы для доступа к данным и для обслуживания данных.

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

System.Drawing. Предоставляет доступ к GDI+, включая поддержку для 2D растровой и векторной графики, изображений, печати и работы с текстом.

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

System.Management. Предоставляет средства для запроса информации, такой как количество свободного места на диске, информация о процессоре, к какой базе данных подключено определённое приложение, и многое другое [4].

System.Media. Позволяет проигрывать системные звуки и файлы в формате .wav.

System.Net. Предоставляет интерфейс для многих протоколов, используемых в сетях в настоящее время, таких как HTTP, FTP, и SMTP. Безопасность общения поддерживается протоколами наподобие SSL.

System.Linq. Определяет интерфейс IQueryable и связанные с ним методы, которые позволяют подключать провайдеры LINQ.

System.Reflection. Обеспечивает объектное представление типов, методов и свойств(полей). Предоставляет возможность динамически создавать и вызывать типы.Открывает API для доступа к возможностям рефлексивного программирования в CLR.

System.Runtime. Позволяет управлять поведением приложения или CLR в режиме Run-time. Некоторые из включённых возможностей взаимодействуют с COM, сериализированными объектами внутри двоичного файла или SOAP.

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

System.Text. Поддерживает различные кодировки, регулярные выражения, и другие полезные механизмы для работы со строками (класс StringBuilder).

System.Threading. Облегчает мультипотоковое программирование.

System.Timers. Позволяет вызвать событие через определённый интервал времени.

System.Transactions. Обеспечивает поддержку локальных и распределённых транзакций.

Общие сведения о языке программирования С#

C# (произносится си шарп) – объектно–ориентированный язык программирования. Разработан в 1998-2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework [3].

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

Переняв многое от своих предшественников – языков C++, Java, Delphi, Модула и Smalltalk – С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# в отличие от C++ не поддерживает множественное наследование классов (между тем допускается множественное наследование интерфейсов).

Особенности технологии Windows Forms

Windows Forms – название интерфейса программирования приложений (API), отвечающего за графический интерфейс пользователя и являющегося частью Microsoft .NET Framework. Данный интерфейс упрощает доступ к элементам интерфейса Microsoft Windows за счет создания обертки для существующего Win32 API в управляемом коде. Причем управляемый код – классы, реализующие API для Windows Forms, не зависят от языка разработки. То есть программист одинаково может использовать Windows Forms как при написании ПО на C#, С++, так и на VB.Net, J# и др [4].

С одной стороны Windows Forms рассматривается как замена более старой и сложной библиотеке MFC, изначально написанной на языке C++, но с другой стороны, WF не предлагает парадигму, сравнимую с MVC. Для исправления этой ситуации и реализации данного функционала в WF существуют сторонние библиотеки. Одной из наиболее используемых подобных библиотек является User Interface Process Application Block, выпущенная специальной группой Microsoft, занимающейся примерами и рекомендациями, для бесплатного скачивания. Эта библиотека также содержит исходный код и обучающие примеры для ускорения обучения.

Внутри .NET Framework, Windows Forms реализуется в рамках пространства имён System.Windows.Forms.

Библиотека параллельных задач (TPL)

Библиотека (TPL) представляет собой набор открытых типов и API-интерфейсов в пространствах имен System.Threading и System.Threading.Tasks в .NET Framework 4. Библиотека параллельных задач предназначена для повышения производительности разработчиков за счет упрощения процесса добавления параллелизма в приложения. Она динамически масштабирует степень параллелизма для наиболее эффективного использования всех доступных процессоров. Кроме того, в библиотеке параллельных задач осуществляется секционирование работы, планирование потоков в пуле ThreadPool, поддержка отмены, управление состоянием и выполняются другие низкоуровневые задачи. Используя библиотеку параллельных задач, можно повысить производительность кода, сосредоточившись на работе, для которой предназначена программа. Используя библиотеку TPL можно достичь большей производительности кода, чем любыми другими средствами доступными в .NET. Преимущество в производительности увеличивается при увеличении количества процессоров в системе. В частности на рисунке 1 представлены результаты тестирования производительности алгоритма перемножения двух матриц 750х750 при использовании классов ThreadPool и Parallel [5].

Рисунок 1 – Производительность Parallel.For в сравнении с пулом потоков [6]

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

Вывод

Таким образом .NET – современная программная платформа призванная облегчить труд разработчика путём предоставления обширной библиотеки классов и современных объектно-ориентированных языков программирования: С#,Visual Basic, S#, J#, Visual C++, F# и др. Платформа .NET постоянно развивается. Интерес к платформе растёт на рынке разработки программных обеспечения, вследствие чего процент программ написанных под неё растёт с течением времени. Периодически выходят новые дополнения Frameworks к платформе .NET, в результате чего возможности для разработки постоянно растут.

Список использованной литературы

1. Программная платформа .NET Frameworl [Электронный ресурс, режим доступа]: http://ru.wikipedia.org/wiki/.NET_Framework#.D0.90.D1.80.D1.85.D0.B8.D1.82.D0.B5.D0.BA.D1.82.D1.83.D1.80.D0.B0_.NET (10.05.13);

2. Базовая библиотека классов [Электронный ресурс, режим доступа]: http://ru.wikipedia.org/wiki/Base_Class_Library (11.05.13);

3. Язык С# [Электронный ресурс, режим доступа]: http://ru.wikipedia.org/wiki/C_Sharp (12.05.13);

4. Технология Windows Forms [Электронный ресурс, режим доступа]: http://ru.wikipedia.org/wiki/Windows_Forms (13.05.13);

5. Библиотека параллельных задач [Электронный ресурс, режим доступа]: http://msdn.microsoft.com/ru-ru/library/dd460717.aspx (15.05.13);

6. Оптимизация управляемого кода для многоядерных компьютеров [Электронный ресурс, режим доступа]: http://msdn.microsoft.com/ru-ru/magazine/cc163340.aspx (20.05.13).