Платформа .Net Framework

Автор: Пользователь скрыл имя, 16 Декабря 2011 в 01:41, реферат

Описание работы

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

Содержание

Введение
1. Обзор существующих технологий разработки программного обеспечения
2. Описание платформы NET Framework
3. Архитектура и принцип работы платформы NET Framework
3.1 Компиляция исходного кода
3.2 Процесс загрузки и исполнения кода в платформе NET
3.3 IL-код и верификация
3.4 Библиотека классов .NET Framework
4. Новые возможности платформы .NETFramework 4.0
Заключение
Список литературы.

Работа содержит 1 файл

Платформа .Net Framework.docx

— 45.03 Кб (Скачать)

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

- Взаимодействие  с существующим кодом. В Microsoft понимают, что разработчики накопили  огромный объем кода и компонентов.  Переписывание всего этого кода, так чтобы он задействовал  все достоинства NET Framework, значительно  замедлило бы переход к этой  платформе. Поэтому в .NET Framework реализована полная поддержка  доступа к СОМ-компонентам и  Win32-функциям в существующих динамических  библиотеках DLL[1]. 

3. Архитектура и  принцип работы  платформы NET Framework

3.1 Компиляция исходного  кода 

платформа net framework работа

При работе с  платформой .NETможно создавать файлы  с исходным кодом на любом языке, поддерживающем CLR. Затем соответствующий  компилятор проверяет и анализирует  исходный код. Независимо от компилятора  результатом его работы является управляемый модуль (managedmodule) – стандартный  переносимый исполняемый (portableexecutable, РЕ) файл 32-разрядной (РЕ32) или 64-разрядной Windows (PE32+), который требует для  своего выполнения исполняемую среду CLR.

В прошлом почти  все компиляторы генерировали код  для конкретных процессорных архитектур, таких как x86, IA64, Alpha или PowerPC. Все CLR-совместимые  компиляторы вместо этого генерируют IL-код. IL-код иногда называют управляемым (managedcode), потому что CLR управляет его  жизненным циклом и выполнением.

Каждый компилятор, предназначенный для CLR, кроме генерации IL-кода, также должен создавать полные метаданные (metadata) для каждого управляемого модуля. Коротко говоря, метаданные – это просто набор таблиц данных, описывающих то, что определено в модуле, например типы и их члены. Метаданные служат многим целям:

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

- В процессе  верификации кода CLR использует метаданные, чтобы убедиться, что код совершает  только «безопасные» операции.

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

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

Метаданные расширяют  возможности таких старых технологий, как библиотеки типов и файлы  языка описания интерфейсов (Interface Definition Language, IDL). Важно заметить, что метаданные CLR гораздо полнее. И в отличие  от библиотек типов и IDL они всегда связаны с файлом, содержащим IL-код. Фактически метаданные всегда встроены в тот же ЕХЕ/DLL, что и код, так  что их нельзя разделить. Так как  компилятор генерирует метаданные и  код одновременно и привязывает  их к конечному управляемому модулю, рассинхронизация метаданных и описываемого ими IL-кода исключена.

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

3.2 Процесс загрузки и исполнения кода в платформе NET 
 

При выполнении исполняемого файла Windows анализирует  заголовок ЕХЕ-файла на предмет  необходимого для его работы адресного  пространства – 32-или 64-разрядного. Файл с заголовком РЕ32 может выполняться  в адресном пространстве любого из указанных двух типов, а файлу  с заголовком РЕ32+ требуется 64-разрядное  пространство. Windows также проверяет  информацию о процессорной архитектуре  на предмет совместимости с имеющейся  конфигурацией.64-разрядные версии Windows поддерживают технологию выполнения 32-разрядных  приложений в 64-разрядной среде, которую  называют W0W64 (WindowsonWindows64). Она даже позволяет  выполнять 32-разрядные приложения на машине с процессором Itanium за счет эмуляции команд х8б, но за это приходится расплачиваться снижением производительности.

После анализа  заголовка ЕХЕ-файла для выяснения  того, какой процесс запустить  – 32-, 64-разрядный или WoW64, Windows загружает  в адресное пространство процесса соответствующую (х86, х64 или IA64) версию библиотеки MSCorEE.dll. В Windows версии х86 одноименная версия MSCorEE.dll хранится в каталоге C:\Windows\System32. В версиях х64 и IA64 версия х86 библиотеки находится в каталоге C:\Windows\SysWow64, а 64-разрядная версия MSCorEE.dll (хб4 orIA64) размещается в каталоге C:\Windows\System32 (это сделано из соображений обратной совместимости).

Далее основной поток процесса вызывает определенный в MSCorEE.dll метод, который инициализирует CLR, загружает сборку ЕХЕ, а затем  ее метод точки входа (Main). На этом процедура запуска управляемого приложения считается завершенной.

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

Для выполнения какого-либо метода его IL-код должен быть преобразован в машинные команды. Этим занимается JIT-компилятор CLR. Рассмотрим пример:

publicvoidMain()

{

Console.WriteLine(“HelloWorld”);

}

Непосредственно перед исполнением метода Main среда CLR находит все типы, на которые  ссылается код Main. При этом CLR выделяет внутренние структуры данных, используемые для управления доступом к типам, на которые есть ссылки. В примере  метод Main ссылается на единственный тип – Console, и CLR выделяет единственную внутреннюю структуру. Эта внутренняя структура данных содержит по одной  записи для каждого метода, определенного  в типе Console. Каждая запись содержит адрес, по которому можно найти реализацию метода. При инициализации этой структуры CLR заносит в каждую запись адрес  внутренней, недокументированной функции, содержащейся в самой CLR. Это функция JIT Compiler.

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

После этого JIT Compiler возвращается к внутренней структуре  данных типа и заменяет адрес вызываемого  метода адресом блока памяти, содержащего  готовые машинные команды. В завершение JIT Compiler передает управление коду в  этом блоке памяти. Этот код –  реализация метода Write Line (той его  версии, что принимает параметр String). Из этого метода управление возвращается в Main, который продолжает выполнение в обычном порядке.

Затем Main обращается к Write Line вторично. К этому моменту  код Write Line уже проверен и скомпилирован, так что обращение к блоку  памяти производится, минуя вызов JIT Compiler. Отработав, метод Write Line возвращает управление Main. Снижение производительности наблюдается только при первом вызове метода. Все последующие обращения  выполняются «на полной скорости»: повторная верификация и компиляция не производятся.

JIT-компилятор  хранит машинные команды в  динамической памяти. Это значит, что скомпилированный код уничтожается  по завершении работы приложения. Так что, если потом снова  вызвать приложение или если  одновременно запустить второй  его экземпляр (в другом процессе  ОС), JIT-компилятор заново будет  компилировать IL-код в машинные  команды.

Для большинства  приложений снижение производительности, связанное с работой JIT-компилятора, незначительно. Большинство приложений раз за разом обращается к одним  и тем же методам. На производительности это скажется только раз. К тому же, скорее всего больше времени занимает выполнение самого метода, а не обращение  к нему.

Полезно также  знать, что JIT-компилятор CLR оптимизирует машинный код аналогично компилятору  неуправляемого кода C++. Создание оптимизированного  кода занимает больше времени, но производительность его будет гораздо выше, чем  неоптимизированного.

Многие авторитетные авторы считают, что управляемые  приложения могут работать производительнее неуправляемых, и тому есть масса  причин. Взять хотя бы тот факт, что  превращая IL-код в команды процессора в период выполнения, JIT-компилятор располагает более полными сведениями о среде выполнения, чем компилятор неуправляемого кода. Ниже перечислены  особенности, которые позволяют  управляемому коду работать производительнее неуправляемого:

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

- JIT-компилятор  может обнаружить, что определенное  выражение на конкретной машине  всегда равно false. Например, посмотрим  на метод с таким кодом:

if (numberOfCPUs> 1)

{

}

Здесь number OfCPUs - число процессоров. Код указывает JIT-компилятору, что для машины с  одним процессором не нужно генерировать никаких машинных команд. В этом случае машинный код оптимизирован  для конкретной машины: он короче и  выполняется быстрее.

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

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

3.3 IL-код  и верификация 
 

IL ориентирован  на работу со стеком, то есть  все его команды помещают операнды  в стек исполнения и извлекают  результаты из стека. Поскольку  в IL нет команд работы с регистрами, это упрощает работу разработчикам  компиляторов для CLR: не нужно  думать об управлении регистрами, да и команд в IL меньше (за  счет отсутствия тех же команд  работы с регистрами).

Команды IL не связаны  и с типами. Например, IL-команда add складывает два последних операнда, помещенных в стек; нет отдельных 32- и 64-разрядной версий команды. При  выполнении add определяет типы операндов  в стеке и делает, что требуется.

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

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

Информация о работе Платформа .Net Framework