Процессы, происходящие при запуске программ в среде. NET

1. Подготавливается исходный текст программы.

2. Исходный текст компилируется в промежуточный низкоуровневый язык MSIL. При этом формируется пакет, состоящий из некоторого числа сборок, одна из которых является исполняемой и содержит точку входа в программу. В других - содержатся библиотечные файлы. Сборки содержат метаданные и код на промежуточном языке. Метаданные включают в себя информацию о типах данных, методах сборки и ХЭШ. ХЭШ содержит информацию о версиях и привилегиях, а так же какие другие сборки будут вызываться этой сборкой.

3. Среда CLR загружает сборку, содержащую точку входа в программу и анализирует ХЭШ для проверки целостности сборки и требуемых привилегиях. При этом происходит обращение к политике безопасности системы и учетной записи пользователя. Если пользователь обладает требуемыми привилегиями, то они будут предоставлены программе. CLR осуществляет так же проверку безопасности кода по типу памяти. Т.е. исполняемый код не должен пытаться читать или записывать в область памяти не принадлежащей ему. Если данное требование нарушается, то приложение снимается с выполнения.

4. CLR компилирует с помощью компилятора JIT (Just-in-time) программу на промежуточном языке MSIL в машинный код и запускает ее на выполнение. Причем компилируется только та часть программы, выполнение которой требуется в данный момент времени. Скомпилированный код сохраняется в ОЗУ ЭВМ и при повторном обращении к нему, перекомпиляции не происходит, а, следовательно, не происходи потери производительности, свойственных, например, компилятору-интерпретатору.

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


Историческая справка.

Язык программирования С - был разработан в 1972 г. Денисом Ричи в компании Bell Laboratories. Язык С - является первым структурным языком программирования.

В конце 1970 начале 1980 годов многие проекты достигли размера свыше пяти тысяч строк кода. Эта величина оценивается как предельная для языка структурного программирования. Свыше данного размера возникают большие трудности для понимания и сопровождения программ. Эта проблема была решена с помощью нового в то время подхода – объектно-ориентированного программирования (ООП).

В 1979 году Бьярном Страуструпом был разработан, на основе языка С, объектно-ориентированный язык – С с классами, который в последствии был переименован в 1983 в С++.

Долгое время язык оставался в тени. Первое справочное руководство по этому языку было выпущено только в 1991 году:

- Stroustroup, 1991."The C++ Programming Language".

И с этого момента он начинает широко применяться и приобретает большую популярность.

Следующим шагом в развитии языков программирования явилось появление языка программирования Java.

Работа над проектом Java, который первоначально назывался Oak, началась в 1991 году. Он создавался как независящий от платформы язык, предназначенный для разработки программного обеспечения (ПО) для контроллеров, встроенных в различные устройства (пылесосы, стиральные машины и т.п.).

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

Идея платформенной независимости Java заключается в том, что исходный текст программы транслируется в некоторый промежуточный язык, называемый байт-кодом. Каждый байт-код соответствует одной машинной инструкции некоторого абстрактного микропроцессора. Набор инструкций абстрактного микропроцессора соответствует набору инструкций, поддерживаемого большинством реальных микропроцессоров. Байт-код не зависит от платформы и может быть переслан по сети Internet для выполнения на любом типе компьютера, на котором установлена, так называемая, виртуальная машина Java (Java Virtual Machine - JVM).

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

Язык программирования Java был создан на основе языка С и С++ (синтаксис его очень сходен с синтаксисом С++ и С) и является структурным объектно-ориентированным языком.

Следующим шагом в развитии языков программирования явилась разработка под руководством Андерсена Хейльсберга в конце 90-х годов языка C #. Первая альфа-версия этого языка была выпущена в середине 2000 года. C# является прямым наследником С++. Многие синтаксические конструкции и ключевые слова он унаследовал от языка С++.

Отличительной особенностью языка программирования C# является то, что он, как и Java компилируется в промежуточный язык (Microsoft Intermediate Language MSIL – сокращенно IL). Концептуально, язык MSIL похож на байт-код Java. Он также определяет набор инструкций, не зависимых от процессора ЭВМ, но между MSIL и байт-кодом Java имеются различия.

MSIL в отличие от байт-кода Java не интерпретируется, а компилируется с помощью JIT (just in time – в нужный момент) компилятора во внутренние коды процессора по мере необходимости. При этом время запуска программы мало отличается от времени запуска программы компилированной традиционным компилятором.

Это объясняется двумя причинами:

1. JIT – компилирует не всю программу сразу, а только тот кусок кода, который вызывается в данный момент (отсюда название компилятора just-in-time). Скомпилированный код сохраняется в ОЗУ и при следующем запуске этого куска кода перекомпиляции не происходит. JIT – компилятор – оптимизирует код также как и традиционный компилятор, но кроме этого оптимизирует код непосредственно для того процессора, на котором он выполняется.

В связи с этим фирма Microsoft даже ожидает повышения быстродействия работы программы.

C# - это основной язык для разработки в среде.NET.


Вопросы:

1. Какие объективные предпосылки привели к разработке среды.NET Framework?

2. Краткая характеристика.NET Framework.

3. Что понимается под межъязыковой совместимостью в среде.NET Framework?

4. Каким образом достигается межъязыковая совместимость в среде.NET Framework?

5. Как в среде.NET Framework решается проблема «ада DLL»?

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

7. Каковы процессы, происходящие при запуске программы на выполнение в среде.NET Framework?

8. В чем отличия и преимущества JIT – компилятора перед традиционными компиляторами?

9. Каковы корни языка C# - основного языка программирования среды.NET Framework?
Терминология и основные определения ООП

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

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

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

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

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

В C# структура является ограниченным по своим возможностям классом.

Инкапсуляция - это сокрытие информации о строении или деталях класса.

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

Пользователю класса предоставляется (минимальная) необходимая и достаточная информация для использования класса: пользовательский интерфейс.

Класс для пользователя - это черный ящик с характерным поведением.

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

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

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

Полиморфизм – это свойство кода С# вести себя по разному в зависимости от ситуации, возникающей в момент выполнения.

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

Различают несколько видов полиморфизма:

1. Специальный полиморфизм

2. Параметрический полиморфизм

3. Чистый полиморфизм

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

Система типов C#

Система типов C# тесно интегрирована с системой общих типов –Common Type System (CTS) промежуточного языка IL среды.NET. В CTS согласно принципам ООП экземпляр любого типа данных является объектом с характерным для этого типа поведением. Попытки представить экземпляры всех типов в виде объектов предпринимались и ранее, но это обычно приводило к снижению скорости выполнения программы. Разработчики CTS решили проблему производительности следующим образом: все типы в CTS делятся на две большие категории. Это деление осуществляется по способу хранения экземпляров типов в памяти ЭВМ. Первая категория это ссылочные типы, которые предназначены для хранения сложных типов данных. Типы по ссылке хранятся в памяти ЭВМ, называемой кучей. Вторая категория данных – это объекты, хранящиеся в стеке, и называется типы по значению. Они применяются для хранения данных фиксированного размера. Все типы в CTS являются производными от базового типа – System.Object.

 
 


Рис. 1

Предположим, что у нас имеется ссылочный тип с именем Reftype.

Для создания объекта ссылочного типа необходимо выполнить два шага:

1. объявить ссылку, например:

Reftype myObj;

2. выделить память под объект этого типа с помощью оператора new:

myObj = new Reftype();

Оператор new выполняет для ссылочных типов два действия.

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

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: