Что такое clr fcl bcl cli il
BestProg
Содержание
Поиск на других ресурсах:
.NET Framework служит средой для поддержки, разработки и выполнения распределенных приложений, которые базируются на компонентах (элементах управления).
Приложения (программы) можно разрабатывать на разных языках программирования, которые поддерживают эту технологию.
.NET Framework обеспечивает:
Библиотека базовых классов включает в себя определение разнообразных примитивов, которыми могут быть: потоки, графические API-интерфейсы, реализация баз данных, файловый ввод-вывод и прочее.
3. Какой принцип действия общеязыковой среды выполнения CLR ( Common Language Runtime )?
Основное назначение CLR – превратить промежуточный код MSIL в исполнительный код в процессе выполнения программы.
Рис. 1. Процесс преобразования исходного кода в код на языке MSIL ( CIL или IL ) и создание файла сборки ( *.dll или *.exe )
Исполнительная среда CLR отвечает за определение места размещения сборки (assembly).
Запрашиваемый тип, который размещается в сборке (например, класс ArrayList или другой тип), определяется в двоичном файле ( *.dll или *.exe ) с помощью считывания метаданных этого файла.
После этого CLR размещает в памяти считанный из сборки тип.
Затем CLR превращает CIL-код в соответствующие инструкции, которые подстраиваются под конкретную платформу (в зависимости от ПК, операционной системы и т.п.). Кроме того, на этом этапе происходят необходимые проверки на предмет безопасности.
Последним происходит выполнение запрашиваемого программного кода.
4. Что такое промежуточный язык MSIL ( Microsoft Intermediate Language ) или CIL ( Common Intermediate Language )?
MSIL есть псевдокодом. MSIL определяет набор инструкций, которые:
Фактически, MSIL – это язык переносного ассемблера
Сборка предназначена для сохранения пространств имен ( namespaces ). Пространства имен содержат типы. Типами могут быть классы, делегаты, интерфейсы, перечисления, структуры.
Сборка может содержать любое количество пространств имен. Любое пространство имен может содержать любое количество типов (классов, интерфейсов, структур, перечислений, делегатов).
6. Что размещается в сборках?
7. Что такое манифест ( manifest )?
Манифест – это описание самой сборки с помощью метаданных.
В манифесте размещается информация:
Если в исходном коде используются библиотеки базовых классов (например из сборки mscorlib.dll ), то они загружаются с помощью загрузчика классов.
После этого приложение выполняется.
9. Какие существуют виды сборок?
Существует два вида сборок:
В многофайловой сборке один из модулей есть главным ( primary ).
10. В каком файле размещается главная сборка библиотеки MS Visual Studio?
Главная сборка размещается в файле “ mscorlib.dll ”.
Типами могут быть классы, интерфейсы, структуры, перечисления, делегаты.
12. Какое назначение общеязыковой спецификации CLS?
14. Что такое пространство имен ( namespace )?
Пространство имен предназначено для объединения группы типов, которые связаны между собою с семантической точки зрения. Типы размещаются в сборках ( assembly ). Под типами понимаются классы, делегаты, интерфейсы, структуры, перечисления.
Примеры названий пространств имен:
Например, в пространстве имен System.Data размещаются основные типы для работы с базами данных, в пространстве имен System.Collections размещаются основные типы для работы с коллекциями.
Рис. 3. Вызов утилиты Object Browser
Рис. 4. Окно Object Browser с выделенной сборкой mscorlib.dll
Рис. 5. Сборка mscorlib и список пространств имен, которые входят в нее
Аналогично раскрывается любое из пространств имен. В пространствах имен описываются типы. В типах описываются методы, свойства, константы и т.п.
Рис. 6. Содержимое класса BinaryReader
Примеры подключения пространств имен:
После подключения пространства имен можно обращаться к типам, которые в них реализованы.
Программирование: теория и практика
Рубрики
Свежие записи
При использовании материалов сайта, ссылка на сайт обязательна.
В качестве примера приведу текст программы, выводящий на экран возраст объекта:
исходный текст программы, чтобы было понятно:
Что такое CLR?
CLR (Common language runtime) — общеязыковая исполняющая среда. Она обеспечивает интеграцию языков и позволяет объектам благодаря стандартному набору типов и метаданным), созданным на одном языке, быть «равноправными гражданами» кода, написанного на другом.
Другими словами CLR этот тот самый механизм, который позволяет программе выполняться в нужном нам порядке, вызывая функции, управляя данными. И все это для разных языков (c#, VisualBasic, Fortran). Да, CLR действительно управляет процессом выполнения команд (машинного кода, если хотите) и решает, какой кусок кода (функцию) от куда взять и куда подставить прямо в момент работы программы. Процесс компиляции представлен на рисунке:
Компилятор, помимо ассемблера IL создает полные метаданные.
Метаданные — набор из таблиц данных, описывающих то, что определено в модуле. Также есть таблицы, указывающие на что ссылается управляемый модуль (например, импортируемые типы и числа). Они расширяют возможности таких технологий как библиотеки типов и файлы языка описания интерфейсов (IDL). Метаданные всегда связаны с файлом с IL кодом, фактически они встроены в *.exe или *.dll.
Таким образом метаданные это таблицы, в которых есть поля, говорящие о том, что такой-то метод находится в таком-то файле и принадлежит такому-то типу(классу).
Вот как выглядят метаданные для моего примера (таблицы метаданных просто преобразованы в понятный вид с помощью дизассемблера ILdasm.exe. На самом деле это часть *.exe файла программы:
Разобравшись с основными понятиями, давайте посмотрим из чего же состоит тот самый управляемый модуль (или просто наш файл ConsoleApplication_Test_Csharp.exe, который выполняет вывод на экран возраста объекта):
Заголовок показывает на каком типе процессора будет выполняться программа. РЕ32 (для 32 и 64 битных ОС) или РЕ32+ (только для 64 битных ОС)
Заголовок CLR — содержит информацию, превращающую этот модуль в управляемый (флаги, версия CLR, точки входа в Main())
Метаданные — 2 вида таблиц метаданных:
1) определенные в исходном коде типы и члены
2) типы и члены, имеющие ссылки в исходном коде.
Код IL — Код, создаваемый компилятором при компиляции кода на C#. Затем IL преобразуется в процессорные команды (0001 0011 1101… ) при помощи CLR (а точнее JIT)
Работа JIT
И так, что же происходит, когда запускается впервые программа?
Сперва происходит анализ заголовка, чтобы узнать какой процесс запустить (32 или 64 разрядный). Затем загружается выбранная версия файла MSCorEE.dll ( C:\Windows\System32\MSCorEE.dll для 32разрядных процессоров)
После чего вызывается метод, расположенный MSCorEE.dll, который и инициализирует CLR, сборки и точку входа функции Main() нашей программы.
Для выполнения какого-либо метода, например System.Console.WriteLine(«Hello „), IL должен быть преобразован в машинные команды (те самые нули и единицы) Этим занимается Jiter или just-in-time compiler.
Сперва, перед выполнением Main() среда CLR находит все объявленные типы (например тип Console).
Затем определяет методы, объединяя их в записи внутри единой “структуры» (по одному методу определенному в типе Console).
Записи содержат адреса, по которым можно найти реализации методов (т.е. те преобразования, которые выполняет метод).
При первом обращение к функции WriteLine вызывается JiT-compiler.
JiTer ‘у известны вызываемый метод и тип, которым определен этот метод.
JiTer ищет в метаданных соответствующей сборки — реализацию кода метода (код реализации метода WriteLine(string str) ).
Затем, он проверяет и компилирует IL в машинный код (собственные команды), сохраняя его в динамической памяти.
После JIT Compiler возвращается к внутренней «структуре» данных типа (Console) и заменяет адрес вызываемого метода, на адрес блока памяти с исполняемыми процессорными командами.
После этого метод Main() обращается к методу WriteLine(string str) повторно. Т.к. код уже скомпилирован, обращение производится минуя JiT Compiler. Выполнив метод WriteLine(string str) управление возвращается методу Main().
Из описания следует, что «медленно» работает функция только в момент первого вызова, когда JIT переводит IL код в инструкции процессора. Во всех остальных случаях код уже находится в памяти и подставляется как оптимизированный для данного процессора. Однако если будет запущена еще одна программа в другом процессе, то Jiter будет вызван снова для того же метода. Для приложений выполняемых в х86 среде JIT генерируется 32-разрядные инструкции, в х64 или IA64 средах — соответственно 64-разрядные.
Оптимизация кода. Управляемый и неуправляемый код
IL может быть оптимизирован, т.е. из него будут удалены IL — команды NOP (пустая команда). Для этого при компиляции нужно добавить параметры
Чем же отличается управляемый код от неуправляемого?
Неуправляемый код компилируется для конкретного процессора и при вызове просто исполняется.
В управляемой среде компиляция производится в 2 этапа:
1) компилятор переводит C# код в IL
2) для исполнения нужно перевести IL код в машинный код процессора, что требует доп. динамической памяти и времени (как раз та самая работа JIT).
Взаимодействие с неуправляемым кодом:
— управляемый код может вызывать направляемую функцию из DLL посредствам P/Invoke (например CreateSemaphore из Kernel32.dll).
— управляемый код может использовать существующий COM-компонент (сервер).
— неуправляемый код может использовать управляемый тип (сервер). Можно реализовать COM — компоненты в управляемой среде и тогда не нужно вести подсчет ссылок интерфейсов.
Параметр /clr позволяет скомпилировать Visual С++ код в управляемые IL методы (кроме когда, содержащего команды с ассемблерными вставками ( __asm ), переменное число аргументов или встроенные процедуры ( __enable, _RetrurAddress )). Если этого сделать не получится, то код скомпилируется в стандартные х86 команды. Данные в случае IL кода не являются управляемыми (метаданные не создаются) и не отслеживаются сборщиком мусора (это касается С++ кода).
Система типов
В дополнение хочу рассказать о системе типов CTS, принятой Microsoft.
CTS (Common Type System) — общая система типов в CLR (тип, по-видимому — это аналог класса C#). Это — стандарт, признанный ECMA который описывает определение типов и их поведение. Также определяет правила наследования, виртуальных методов, времени жизни объектов. После регистрации ECMA стандарт получил название CLI ( Common Language Infrastructure)
— CTS поддерживает только единичное наследование (в отличие от С++)
— Все типы наследуются от System.Object (Object — имя типа, корень все остальных типов, System — пространство имен)
По спецификации CTS любой тип содержит 0 или более членов.
Поле — переменная, часть состояния объекта. Идентифицируются по имени и типу.
Метод — функция, выполняющая действие над объектом. Имеет имя, сигнатуру(число параметров, последовательность, типы параметров, возвр. значение функции) и модификаторы.
Свойство — в реализации выглядит как метод (get/set) а для вызывающей стороны как поле ( = ). Свойства позволяют типу, в котором они реализованы, проверить входные параметры и состояние объекта.
Событие — обеспечивает механизм взаимного уведомления объектов.
Public — метод доступен любому коду из любой сборки
Private — методы вызывается только внутри типа
Family (protected) — метод вызывается производными типами независимо от сборки
Assembly (internal) — метод вызывается любым кодом из той же сборки
Family or Assembly
(protected internal) — метод вызывается производными типами из любой сборки и + любыми типами из той же сборки.
CLS (Common Language Specification) — спецификации выпущенная Майкрософт. Она описывает минимальный набор возможностей, которые должны реализовать производители компиляторов, чтобы их продукты работали в CLR. CLR/CTS поддерживает больше возможностей, определенных CLS. Ассемблер IL поддерживает полный набор функций CLR/CTS. Языки (C#, Visual Basic) поддерживает часть возможностей CLR/CTS (в т.ч. минимум от CLS).
Пример на рисунке
Пример проверки на соответствие CLS
Атрибут [assembly: CLSCompliant(true)] заставляет компилятор обнаруживать любые доступные извне типы, содержащие конструкции, недопустимые в других языках.
Первое предупреждение: UInt32 Abc() возвращает целочисленное целое без знака. Visaul Basic, например, не работает с такими значениями.
Второе предупрждение: два открытых метода Abc() и abc() — одиноквые и отличаются лишь регистром букв и возвращаемым типом. VisualBasic не может вызывать оба метода.
Убрав public и оставив только sealed class SomeLibraryType оба предупреждения исчезнут. Так как SomeLibraryType по-умолчанию будет internal и не будет виден извне сборки.
Кто может объяснить что такое CLR?
Может кто нибудь объяснить асинхронность?
Здравствуйте, как я не пытался понять, что на самом деле происходит при асинхронном вызове, так и.
Дмитрий3241, я понимаю и никаких претензий не предъявляю 🙂 Я бы просто дал ссылки на английскую википедию, там об этом пишется, хоть и не полностью.
Когда компилируется C# код в *.exe в студии, получается не файл с ассемблерными инструкциями для процессора, а с инструкциями для виртуальной машины, которой является CLR. Код с инструкциями отдается на растерзание JIT-компилятору. Он его компилирует и выполняет уже на понятном процессору языке. Этим достигается кросплатформенность и намного уменьшенные исполнительные файлы.
Утрированно и образно это выглядит так:
— CLR на каждой отдельной платформе/ОС знает как обращаться именно со своей платформой.
— В коде (который в *.exe файле) написано не именно как сделать какую-то операцию, а то, что её нужно сделать, а CLR уже разбирается как это делать. К примеру, в файле не написано как записывать данные в память. Там просто написано «записать ЭТИ данные ТУДА», а CLR сама решает как это сделать, т.к. она знает больше о платформе, чем код из исполняемого файла.
В итоге один и тот же код может работать на разных платформаф, т.к. он не привязан «знанием» только одной платформы.
Рассказал всё очень образно, так что не пинайте сразу
Кто может объяснить,как построить такое?
В инете ничего дельного не нашел.Смущает то,что здесь дано 3 условия и модули
Понятия приложения, проекта, решения
.NET Framework не налагает никаких ограничений на возможные типы создаваемых приложений. Тем не менее, давайте рассмотрим некоторые наиболее часто встречающиеся типы приложений:
Приложение, находящееся в процессе разработки, называется проектом. Несколько приложений могут быть объединены в решение (solution).
Создание первого проекта
В поле Project types следует выбрать Visual C#, в поле Templates – Console Application.
В строчке Name введите имя приложения Hello. Обратите внимание на то, что это же имя появится в строчке Solution Name. Уберите галочку в поле Create directory for Application (пока мы создаем простое приложение, и нам нет необходимости усложнять его структуру).
В строке Location определите положение на диске, куда нужно сохранять ваш проект. И нажмите кнопку OK. Примерный вид экрана изображен на рис 1.2
Компилятор в качестве результата своего выполнения создает так называемую сборку – файл с расширением exe или dll, который содержит IL-код и метаданные.
Основное пространство экрана занимает окно редактора, в котором располагается текст программы, созданный средой автоматически. Текст представляет собой каркас, в который программист будет добавлять нужный код. При этом зарезервированные слова отображаются синим цветом, комментарии – зеленым, основной текст – черным.
Текст структурирован. Щелкнув на знак минус, мы скроем блок кода, щелкнув на знаке плюс – откроем.
Откроем папку, содержащую проект, и рассмотрим ее структуру (см. рис.1.3). Файлы, выделенные жирным шрифтом, появятся только после компиляции.
На данном этапе особый интерес для нас будут представлять следующие файлы:
Теперь рассмотрим сам текст программы.
using System – это директива, которая разрешает использовать имена стандартных классов из пространства имен System непосредственно без указания имени пространства, в котором они были определены.
Ключевое слово namespace создает для проекта свое собственное пространство имен, которое по умолчанию называется именем проекта. В нашем случае пространство имен называется Hello. Однако программист вправе указать другое имя. Пространство имен ограничивает область применения имен, делая его осмысленным только в рамках данного пространства. Это сделано для того, чтобы можно было давать имена программным объектам, не заботясь о том, что они совпадут с именами в других приложениях. Таким образом, пространства имен позволяют избегать конфликта имен программных объектов, что особенно важно при взаимодействии приложений.
Добавим в метод следующий код:
Для запуска программы следует нажать клавишу F5 или выполнить команду Debug-Start Debugging.Если программа выполнена без ошибок, то сообщение выведется в консольное окно, которое мелькнет и быстро закроется. Чтобы просмотреть сообщение в нормальном режиме нужно нажать клавиши Ctrl+F5 или выполнить команду Debug-Start Without Debugging.В нашем случае откроется следующее консольное окно:
Если код программы будет содержать ошибки, например, пропущена точка с запятой после команды вывода, то после нажатия клавиши F5 откроется диалоговое окно, в котором выведется сообщение о том, что обнаружена ошибка, и вопрос, продолжать ли работу дальше. Если вы ответите Yes, то будет выполнена предыдущая удачно скомпилированная версия программы. Иначе процесс будет остановлен и управление передано окну списка ошибок Error List.
Сегодня мы более подробно рассмотрим, каждый из этих компонентов.
CLR
На компьютере храниться в виде файла динамической библиотеки mscoree.dll, в проекте данная сборка подключается автоматически.
Какие задачи решает CLR?
На рисунке видно, что версии среды 3.0, 3.5 — не существует. Поэтому важно понимать, что версия платформы и версия среды — это разные вещи.
CTS (Common Type System) – система общих типов.
Это детальное описание (спецификация) всех типов данных и программных конструкций, поддерживаемых исполняющей средой.
В частности описываются такие моменты, как взаимодействие между типами и их представление в формате метаданных. А так же определяет способы объявления, использования и управления типами в среде CLR, а так же обеспечивает многоязыковую поддержку.
Важно знать то, что CTS предоставляет разработчикам 5 типов. О них я уже писал ранее, но повторюсь ещё раз.
Типы: класс, интерфейс, делегат, структура, перечисление. Каждый тип может содержать любое количество членов.
Какие задачи решает CTS?
И хотя в любом языке, у каждого типа свое ключевое слово, но стоит понимать, что все они в итоге соответствуют одному и тому же типу, который храниться в сборке mscorlib.dll.
Например: в CTS описан тип Int32, который храниться в библиотеки mscorlib.dll. И хотя в языке c# он будет иметь ключевое слово int, а допустим в Visual Basic — Integer. Все эти ключевые слова, всего лишь псевдонимы, к одному и тому же типу Int32.
И ещё важно понимать, что, не смотря на то, что для c# указано ключевое слово int, мы так же можем использовать и Int32.
// int a = 5;
// System.Int32 b = 10;
CLS
Как видно из описания, понимание CLS требуется в основном разработчикам компиляторов, рядовым разработчикам данная информация вряд ли пригодиться.
В итоге мы получаем примерно вот такую структуру:
Основной или главной сборкой данной библиотеки является файл динамической библиотеки — mscorlib.dll
Данная библиотека подключается автоматически во время создания проекта, так же стоит понимать, что существуют и другие файлы сборки базовых библиотек.
Framework Class Library (FCL)
В принципе можно сказать, что Framework Class Library включает в себя библиотеку базовых классов BCL, которая, по сути, является её ядром.
.NET Framework = CLR + FCL
Такую официальную формулировку так же приводят: MSDN, Wiki и многие другие авторы книг.
Но мы знаем, что FCL включает в себя библиотеки базовых классов. И правильнее формулировка должна звучать так:
.NET Framework = CLR + Libraries (FCL, BCL)
Но тут конечно можно долго спорить.