Clr c что это
Перейти к содержимому

Clr c что это

  • автор:

CLR что это

vedro-compota's picture

Common Language Runtime (англ. CLR — общеязыковая исполняющая среда) — виртуальная машина, интерпретирующая и исполняющая код на языке CIL, в который компилируются программы, написанные, в частности, на .NET-совместимых языках программирования (C#, Managed C++, Visual Basic .NET, Visual J# и т. п.); компонент пакета Microsoft .NET Framework.

Key Words for FKN + antitotal forum (CS VSU):

  • неофициальный форум фкн
  • ФКН ВГУ Воронеж
  • программирование Воронеж
  • ВГУ информатика
  • ВГУ компьютерных наук
  • сайт студента
  • программирование информатика IT
  • сайт о программировании
  • примеры программного кода
  • сообщество программистов
  • Log in to post comments
  • 2806 reads

Общеязыковая исполняющая среда CLR

Существует ряд средств, которые поддерживаются .NET, но не поддерживаются C#, и, возможно, вас удивит, что есть также средства, поддерживаемые C# и не поддерживаемые .NET (например, некоторые случаи перегрузки операций). Однако поскольку язык C# предназначен для применения на платформе .NET, вам, как разработчику, важно иметь представление о .NET Framework, если вы хотите эффективно разрабатывать приложения на C#. Поэтому давайте заглянем «за кулисы» .NET.

Центральной частью каркаса .NET является его общеязыковая исполняющая среда, известная как Common Language Runtime (CLR) или .NET runtime. Код, выполняемый под управлением CLR, часто называют управляемым кодом. С точки зрения программирования под термином может пониматься коллекция внешних служб, которые требуются для выполнения скомпилированной единицы программного кода. Например, при использовании платформы MFC для создания нового приложения разработчики осознают, что их программе требуется библиотека времени выполнения MFC (т.е. mfc42.dll). Другие популярные языки тоже имеют свою исполняющую среду: программисты, использующие язык VB6, к примеру, вынуждены привязываться к одному или двум модулям исполняющей среды (вроде msvbvm60.dll), а разработчики на Java — к виртуальной машине Java (JVM).

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

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

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

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

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

Основной механизм CLR физически имеет вид библиотеки под названием mscoree.dll (и также называется общим механизмом выполнения исполняемого кода объектов — Common Object Runtime Execution Engine). При добавлении ссылки на сборку для ее использования загрузка библиотеки mscoree.dll осуществляется автоматически и затем, в свою очередь, приводит к загрузке требуемой сборки в память. Механизм исполняющей среды отвечает за выполнение целого ряда задач. Сначала, что наиболее важно, он отвечает за определение места расположения сборки и обнаружение запрашиваемого типа в двоичном файле за счет считывания содержащихся там метаданных. Затем он размещает тип в памяти, преобразует CIL-код в соответствующие платформе инструкции, производит любые необходимые проверки на предмет безопасности и после этого, наконец, непосредственно выполняет сам запрашиваемый программный код.

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

Механизм mscoree.dll

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

Использование байт-кода с четко определенным универсальным синтаксисом дает ряд существенных преимуществ:

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

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

Следует отметить, что независимость .NET от платформы в настоящее время является лишь теоретической, поскольку реализация .NET доступна только для ОС Windows. Однако уже существуют частичные реализации для других платформ (например, проект Mono — попытка создать реализацию .NET с открытым кодом).

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

Хотя язык IL выше сравнивался с Java, все же IL на самом деле более гибкий, чем байт-код Java. Код IL всегда компилируется оперативно (Just-In-Time, JIT-компиляция), в то время как байт-код Java часто интерпретируется. Одним из недостатков Java было то, что во время выполнения программ процесс трансляции байт-кода Java в родной машинный код приводил к снижению производительности (за исключением самых последних версий, где Java компилируется оперативно (JIT) на некоторых платформах).

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

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

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

COM и COM+

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

Важные аспекты работы CLR

Важные аспекты работы CLR

09.10.2018

1158

Рейтинг: 5 . Проголосовало: 5
Вы проголосовали:
Для голосования нужно авторизироваться

advertisement advertisement

Добрый день, дорогие читатели блога ITVDN. Сегодня я затрону очень важные темы о виртуальной машине среды .Net, которую в Microsoft назвали CLR (Common Language Runtime — Общеязыковая среда выполнения). Вы узнаете, что значит промежуточный код, познакомитесь с важными компонeнтами CLR: JIT (Just in Time compiler) компилятором и его ролью в выполнении кода, также со Сборщиком Мусора(Garbage Collector). Будет полезно получить ваши отзывы, положительные и отрицательные.

C# является языком общего назначения платформы .NET (эта платформа поддерживает разные языки, которые отличаются друг от друга, например, VB.NET, F#, весь список можно поискать в интернете), разработанный компанией Microsoft, учитывая плюсы и минусы ряда языков, таких как C++ и Java. Это ни в коем случае не значит, что Microsoft занимается копированием, в мире технологий это в порядке вещей, каждая новая технология основывается на старых, Java был разработан на основе других языков (включая C++), такие инструменты для Java, как Spock Framework или Gradle, были созданы, учитывая минусы предшественников, сам C++ был разработан на основе C и в начале назывался “Си с классами”. Вся эта информация доступна в интернете. Вернемся к C#, двумя его особенностями являются компиляция кода и автоматическая сборка мусора. Поговорим о каждой по отдельности.

advertisement advertisement

Компиляция кода

Сущность компиляции в том, что написанный нами код сначала компилятором (каждый язык .Net имеет свой компилятор) переводится в промежуточный язык IL(Intermediate Language, его также называют MSIL, CIL или просто байт-код). После байт-код переводится в машинный код (нули и единицы), понятный процессору. За это отвечает JIT-компилятор. Это свойство есть и у других языков .NЕТ платформы, если, например, есть программа, написанная на C# и VB.NET, они отдельно скомпилируются, но после эти части программы уже будут соединены в одно целое на уровне байт-кода. Если здесь задуматься, можно понять смысл названия “Общеязыковая среда выполнения”, это среда, где вместе выполняется байт-код от разных языков .NET платформы.

Тема связана со специальностями:

Способом компиляции работают также языки C++ и Java. Есть еще интерпретируемые языки, в их случае код выполняется строка за строкой. Наиболее известными языками этого семейства являются Javascript, PHP, Python.

А теперь давайте создадим консольное приложение и посмотрим, что из себя представляет байт-код. Откройте папку приложения, зайдите в bin, потом Debug и скопируйте путь к этой папке, она вам пригодится. Для этого просто нажмите на иконку папки, который показан стрелкой в картинке снизу.

Папка будет пуста, но как только выполните программу, в ней появятся 3 файла, первый из них мы откроем с помощью утилиты ILDasm (IL Disassembler), который устанавливается вместе с Visual Studio. В картинке не видно, но у файла расширение “.exe”.

Делать это очень просто, откройте Start Menu, в папке Visual Studio найдите Developer Command Prompt и запустите его.

В появившемся окне напишите “ildasm.exe” и путь к файлу, который вы скопировали, после добавьте имя первого файла в списке вместе с расширением(у меня имя файла “HelloStudents”, потому что я так назвал свой проект). В открывшемся окне увидите Манифест сборки и имя вашего проекта.

Развернув его, перед вами откроется такая картинка.

Давайте откроем “Main : void(string[])”, здесь IL-код нашего метода Main, который во время выполнения программы JIT-компилятор генерирует в машинный код.

О работе JIT добавлю, что есть 3 типа:

  1. Нормальный(по умолчанию) JIT
  2. Econo JIT
  3. Pre JIT

Чтобы не было необходимости постоянно проделывать эти шаги, есть способ открыть ILDasm через Visual Studio. Для этого в Visual Studio откройте External Tools в разделе Tools.

В поле “Title” дайте название “ILDasm”, а для поля “Arguments” выберите значение, которое видите на скриншоте, после нажмите на многоточия поля “Command” и найдите папку, где находится ildasm.exe в операционной системе(у меня путь к нему был таким C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools), выберите нужный файл.

Сохраните изменения и после этого в разделе “Tools” появится ILDasm.

Видео курсы по схожей тематике:

Python 3.4.0 Стартовый

Python 3.4.0 Стартовый

Ruby Базовый

ASP.NET MVC 4

Eсли присмотреться к картинке сверху, можно увидеть дату релиза фреймворка .NET версии 4.6.1

Автоматическая сборка мусора

Цель автоматической сборки мусора состоит в том, чтобы освобождать память во время работы программы автономно, тем самым освобождая разработчиков от этой проблемы, которая требует довольно больших усилий. С этой стороны, C# — противоположность известного языка C++, который требует вручную освобождать память при написании программы. Проще говоря, в случае C++ при выполнении программы память освобождается в соответствии командам, которые дали сборщику мусора разработчики и соответственно это приводит к быстродействию программы, а в случае C# сам CLR решает, когда и как освобождать память, но это отрицательно влияет на скорость выполнения кода.

Важным аспектом, который на мой взгляд должен знать каждый начинающий C# разработчик, является понятие поколений. Объекты, созданные в ходе выполнения программы, хранятся в управляемой куче, в которой разделяются 3 поколения (поколение 0,1,2), их размер устанавливает CLR.

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

Все объекты, которые переживут очистку в поколении 1, перейдут в поколение 2. Если дойдет до того, что начнется чистка в поколении 2, объекты, пережившие ее, останутся там же. Этим способом осуществляется очистка так называемых малых объектов, но существуют также большие объекты, размер которых достигает 85000 байт и выше. Они сразу помещаются в поколении 2.

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

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

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

Самостоятельная работа

Прочитайте об этих понятиях

  1. Высокоуровневое/низкоуровневое программирование
  2. IDE/Text Editor, различия между ними
  3. Манифест сборки
  4. Ассемблер, различие от IL
  5. Управляемый/неуправляемый код, для чего реализован интерфейс IDisposable

Бесплатные вебинары по схожей тематике:

Программист или тестировщик? Какую профессию лучше выбрать

Программист или тестировщик? Какую профессию лучше выбрать

Создание Memory Game на JavaScript

Создание Memory Game на JavaScript

Как стать программистом. День открытых дверей в CyberBionic Systematics.

Как стать программистом. День открытых дверей в CyberBionic Systematics.

Полезные ресурсы

Очень рекомендую изучить материалы о сборке мусора в руководстве Microsoft по .NET и прочесть главу 21 книги Дж. Рихтера “CLR via C#”. Их довольно трудно усвоить, но если прочтете 2-3 раза, во многом разберетесь, я сам пользовался ими для этой статьи. С их помощью узнаете, в каких случаях, кроме переполнения памяти, производится очистка памяти, узнаете о режимах сборки мусора, получите больше информации о куче больших объектов, увидите примеры использования класса GC. Кстати, на сайте ITVDN можете найти обзор книги Рихтера от Александра Шевчука.

Что это такое — приложения CLR?

Что такое монитор и что такое мьютекс? Это же разные вещи?
Здравствуйте. В разных айти-статьях по-разному используют эти термины, причём часто их путают друг.

Как такое может быть и что это такое?
в маленьком превью одна картинка, открываешь совершенно другая (какая и должна быть) с чем это.

Что это такое и как это можно сделать?
Это что то из стандартных компонентов или как в своем проекте сделать что то подобное? .

591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386

Создавая такой проект, ты начинаешь работать с платформой .NET. То есть вместо cin и cout ты должен использовать Console::WriteLine() и Console::Read()

2815 / 1406 / 107
Регистрация: 07.03.2009
Сообщений: 4,446

Common Language Runtime (CLR) — «общеязыковая исполняющая среда» — компонент пакета Microsoft .NET Framework, виртуальная машина, исполняющая программа, написанная на .NET-совместимых языках программирования.

CLR интерпретирует и исполняет код на языке IL (реализация компиляции которого компанией Microsoft называется MSIL), а также предоставляет MSIL-программам (а следовательно, и программам, написанным на языках высокого уровня, поддерживающих .NET Framework) доступ к библиотекам классов .NET Framework, или так называемой .NET FCL (англ. Framework Class Library).

Среда CLR является реализацией спецификации CLI (англ. Common Language Infrastructure), спецификации общеязыковой инфраструктуры компании Microsoft.

Приницп CLR в чем? В том, что на выходе (после компиляции) у тебя машиннонезависимый байт-код (ну лишь в некоторых случаях могут присутствовать машиннозависимые вставки — для ускорения работы прораммы). Вот при запуске программы, этот байт-код интерпретируется виртуальной машиной CLR.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

что это такое и сколько это стоит?
помогите опознать что это такое и сколько это стоит?

Что это такое и как это создается?
Здравствуйте! Как создать эти жирные ссылки, показанные на картинке?

Django: Что это такое вообще? Что я пропустил в изучении Python?
Какой язык используется в фигурных скобках? Это разве python? Если кто знает то дайте мне ссылку.

Что это за ошибка, когда маткад не понимает, что такое у
Помогите плиз не понимаю что за ошибка маткад не понимает что такое у

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *