По мотивам Andrew Troelsen №1 - Помните ли вы?
Выписываю ключевые моменты первой главы замечательной книжки C# 6.0 and the .NET 4.6 Framework.
В чём причина появления платформы .NET и какими преимуществами она обладает?
Платформа увидела свет в далёком 2002 году и основной причиной её появления явилось необходимость в инструменте, превосходящем COM в гибкосте, простоте и функциональности. К преимуществам относятся:
- Поддержка нескольких ЯП- приложения .NET могут быть имплементированы с использованием C#, VB, F# и любого другого языка, компилятор которого умеет транслировать в MSIL;
- Единая shared среда исполнения при использовании нескольких ЯП, одним из аспектов которой является общий набор типов;
- Языковая интеграция- поддержка cross-language переиспользования, наследования, обработки ошибок и отладки кода;
- BCL (Base Class Library) как пример набора predefined имплементаций;
Из каких ключевых компонентов состоит платформа .NET
Такими компонентами являются CLR, CTS, CLS и BCL.
CLR (Common Language Runtime) - слой исполнения, основными задачами которого являются поиск, загрузка и управление .NET объектами, low-level детали управления памятью и потоками, application hosting и basic security checks.
CTS (Common Type System) - спецификация, описывающая все возможные типы данных и программные конструкции поддерживаемые runtime, определяет как эти сущности могут взаимодействовать между собой и детали их представления в формате .NET metadata.
CLS (Common Language Specification) - спецификация, содержащая в себе перечень общих типов и программных конструкций (соглашение), которые все .NET ЯП обязаны поддерживать для поддержки cross-language переиспользования.
BCL (Base Class Library) - библиотека, которая содержит в себе набор predefined имплементированные классы для разработки всего многообразия приложений и доступная для всех ЯП.
Преимущества ЯП C#
К основным преимуществам (а для кого-то и недостаткам) стоит отнести:
- Отсутствие необходимости использовать указатели в процессе разработки;
- Делегирование memory management сборщику мусора;
- Generic типы и поля для type-safe кода и DRY;
- Поддержка анонимных методов и как следствие inline функций;
- Декларация частичных (partial) типов across multiple code files;
- Strongly typed queries с использованием LINQ;
- Поддержка анонимных типов для моделирования структуры типа on fly;
- Возможность расширять имплементации с использованием extension methods;
- Поддержка опциональных параметров методов наравне с именованными аргументами;
Это далеко не полный список основных на мой взгляд преимуществ языка до .NET 4.0 включительно.
Если все .NET ЯП компилируются в MSIL, то чем обусловлено их и компиляторов многообразие?
Есть несколько ответов на данный вопрос.
Один из них кроется в самих разработчиках и их предпочтениях, будь то к синтаксису или читабельности кода. Представим ситуацию, что в качестве официального ЯП Microsoft выбрала бы наследника BASIC или FORTRAN. Уверен, мало кто был бы рад такому выбору, поэтому принимая во внимание, что для .NET runtime не имеет большого значения что именно предшествовало процессу получения MSIL кода, наличие многообразия ЯП выглядит вполне логичным решением.
Вторым, но не менее значимым аргументом в пользу этого решения является то, что каждый из ЯП имеет свои сильные и слабые стороны, будь то поддержка математических вычислений или же финансовых калькуляций. Когда сильные стороны языка совмещаются с возможностями доступными в платформе .NET - все в выигрыше.
Компиляция в MSIL
Независимо от выбранного ЯП в случае с .NET результатом компиляции всегда являются .NET binaries, хоть и совпадающие по расширению с unmanaged Windows binaries (_.dll или _.exe), однако не имеющие с ними во внутренней структуре ничего общего. Говоря о .NET binaries, они не содержат platform-specific инструкций, напротив platform-agnostic IL.
Объекты, содержащие MSIL код называют assembly. Именно они, аналогично java byte code используются в .NET runtime для компиляции в platform-specific инструкции используя JIT (Just in time) компилятор. Кроме исполняемого кода, в assembly так же находятся и метаданные, описывающие каждый объявленный тип и их члены.
Наконец, кроме MSIL инструкций и описания всех используемых типов assembly так же содержат метаданные описывающие их самих, называемые манифестом. Так, манифест содержит в себе текущий номер сборки (версию), culture information (используемая для локализации) и список всех используемых (reference) assembly, которые требуются для корректного исполнения оной в .NET runtime.
JIT и компиляция MSIL в platform-specific инструкции
Как уже говорилось ранее, assembly содержит в себе промежуточный код, который в дальнейшем компилируется JIT компилятором на лету (on fly) под ту архитектуру процесса, в рамках которой происходит исполнение приложения. Другими словами, одно и то же приложение в конечном итоге применяя разные оптимизации в зависимости от архитектуры и устройства (desktop и mobile, разные версии OS) компилируется в уже так называемый исполняемый platform-specific код. Результат компиляции же будет сохраняться JIT’ом в кеш, таким образом повторный вызов метода уже не потребует его повторной компиляции.
Для чего используются метаданные
Метаданные, другими словами “декларативное описание кода и структур”, преимущественно используются IntelliSense, Reflection, при late binding (определение имплементации в runtime, нежели на этапе компиляции) и сериализации, во время отладки.
Для чего используется атрибут CSLCompliant
С помощью данного атрибута можно пометить сборку как CLS совместимую (указать компилятору провести проверку) и как следствие, доступную для вызова из других .NET ЯП.
[assembly: CLSCompliant(true)]
Что такое CLR
Под CLR подразумевается набор сервисов, требуемых для выполнения скомпилированной единицы кода (Java Virtual Machine как пример). В основе .NET Runtime лежит библиотека mscoree.dll (Microsoft Core Engine), отвечающая за assembly location resolve и requested type finding. После этого CLR компилирует найденный тип из MSIL в platform-specific инструкции, проводит security checks и исполняет полученный код. В процессе выполнения приложения так же одной из основных сборок становится mscorlib.dll (BCL), содержащая в себе огромное количество базовых типов и имплементаций, общих для всех .NET ЯП.
Далее представлен high-level процесс компиляции, трансляции и запуска .NET приложения:
Используемая литература:
- C# 6.0 and the .NET 4.6 Framework, Andrew Troelsen;