Сборка мусора CLR

Одним из ключевых средств CLR является сборщик мусора (Garbage Collector — GC). GC избавляет от забот об управлении выделением и освобождением памяти, которое является причиной многих ошибок в программном обеспечении. Однако GC не избавляет от управления ресурсами.

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

Однако еще лучше для этой задачи применять шаблон Disposable (Освобождаемый).

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

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

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

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

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

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

Принцип действия CLR

Среда CLR управляет выполнением кода .NET. Действует она по следующему принципу. Результатом компиляции программы на С# является не исполняемый код, а файл, содержащий особого рода псевдокод, называемый Microsoft Intermediate Language, MSIL (промежуточный язык Microsoft).

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

Следует, однако, иметь в виду, что, несмотря на кажущееся сходство псевдокода MSIL с байт-кодом Java, это все же разные понятия.

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

Именно таким образом отчасти достигается переносимость в среде .NET Framework.

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

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

Таким образом, программа на С# фактически выполняется как собственный код, несмотря на то, что первоначально она скомпилирована в псевдокод MSIL.

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

Помимо псевдокода MSIL, при компилировании программы на С# получаются также метаданные, которые служат для описания данных, используемых в программе, а также обеспечивают простое взаимодействие одного кода с другим. Метаданные содержатся в том же файле, где и псевдокод MSIL.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100