Andriy Shyrokoryadov

.Net developer, data scientist

Что такое .Net - вопрос №1 на собеседование C# / .NET

Текст к видео "Что такое .Net" на канале YouTube

Для определения чем является .Net изначально необходимо определить несколько понятий. Среди них среда выполнения (execution / runtime environment) и программное обеспечение (software). Средой выполнения можно назвать совокупность ресурсов необходимых для выполнения и в рамках которых выполняется программа. Например, к таким ресурсам можно отнести операционную систему, переменные окружения, доступ к определенным библиотекам необходимым для выполнения программы. Программное обеспечение это собственно программа, которую мы планируем запускать в среде выполнения. Пользователь взаимодействует с программой, программа взаимодействует с операционной системой, операционная система взаимодействует с аппаратными средствами компьютера. Программа может быть написана на интерпретируемом языке программирования либо на компилируемом языке программирования. В случае использования интерпретируемого языка программирования (например, PHP) программа взаимодействует со средой выполнения непосредственно в интерпретаторе языка. С другой стороны, при использовании компилируемого языка (например, C#) взаимодействие со средой выполнения реализовано посредством взаимодействия промежуточного кода, скомпилированного из исходного кода, со средой выполнения через подключаемые библиотеки. Так как наша тема посвящена .Net дальнейшее изложение материала будет основано на втором варианте, то есть на примерах с компилируемыми языками программирования.

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

Начнем с ответа на вопрос что являлось предшественником платформы .Net. До момента выпуска платформы .Net в 2002 году программисты приложений под операционную систему Windows довольно часто использовали программную модель COM (это аббревиатура на английском языке: Component Object Model). Очень большое число приложение было написано с использованием этой программной модели. Одним из преимуществ данной модели была возможность создания библиотек кода, которые могли быть использованы с разными языками программирования. Например, библиотека COM в языке C++ могла быть использована программистом Visual Basic. Недостатки программной модели COM послужили толчком для создания новой платформы, которой стала платформа .Net.

Таким образом мы плавно перешли к вопросу преимуществ платформы .Net по сравнению с программной моделью COM. Таких преимуществ несколько. На собеседовании будет достаточно если вы назовите 2-3 преимущества. Например:

  • Упрощенная модель установки программного обеспечения – в отличии от модели COM библиотеки .Net не регистрируются в системном реестре. Также несколько версий одной библиотеки .Net могут быть установлены на один компьютер. Более подробно об этом можно будет узнать, ознакомившись с ответом на вопрос, что такое Глобальный Кэш Сборок или на языке оригинала - Global Assembly Cache.
  • Совместимость с существующим кодом – существующее программное обеспечение COM может взаимодействовать с новым программным обеспечением .Net. Это взаимодействие также имеет и обратный характер – программное обеспечение .Net может работать с библиотеками COM.
  • Поддержка большого числа языков программирования – приложения .Net могут быть написаны, используя различные языки программирования (C#, Visual Basic, F#).

Последним в списке, но не последним по значению, является понимание того, из чего состоит платформа .Net. Технической основой .Net являются 3 ключевых элемента:

  • общеязыковая исполняющая среда (Common Language Runtime);
  • общая система типов (Common Type System);
  • общая спецификация языков (Common Language Specification);

В дополнение к вышеуказанным 3 элементом можно указать библиотеки базовых классов (Base Class Libraries).

Мы остановимся на каждом из этих ключевых элементов, но начнем с последнего – с библиотек базовых классов. Данные библиотеки доступны для каждого языка программирования .Net. Они содержат в себе функционал, без которых программирование современных приложений не представляется возможным. Ниже несколько примеров:

  • доступ к базам данных;
  • поточность;
  • доступ к файловой системе;
  • доступ к элементам графического интерфейса пользователя;
  • безопасность приложений;
  • доступ к различным программным интерфейсам приложения;

Для определения чем является общеязыковая исполняющая среда (Common Language Runtime) необходимо понимание что представляют из себя понятия IL (Intermediate Language), MSIL (Microsoft Intermediate Language) и CIL (Common Intermediate Language). По большому счету все три вышеперечисленные понятия означают одно и то же – промежуточный язык, который компилируется из исходных языков .Net (C#, Visual Basic). Если сравнить промежуточный язык скомпилированный из 2 исходных программ, написанных аналогично на C# и Visual Basic, то он будет такой же для 2 вариантов. Исходя из это следует важный вывод – независимо от того, какой из языков .Net будет использован, компилятор создаст идентичный промежуточный код. Возвращаясь к вопросу, чем является общеязыковая исполняющая среда – это среда, в которой выполняется промежуточный код. Промежуточный код хранится в библиотеках .dll или .exe. Кроме промежуточного кода в данных библиотеках содержится детальное описание использованных типов – так называемые мета данные. В среде .Net такие библиотеки называются сборкой (assembly).

Создавая приложения, вы с большой долей вероятности будет использовать уже созданные типы данных, а также создавать свои собственные типы. Когда речь идет о типах данных, то скорей всего имеется в виду один из элементов следующего списка: класс, интерфейс, структура, перечисление (enumeration), делегат. Общая система типов (Common Type System) это формальная спецификация, определяющая как типы данных должны быть определены, чтобы их можно было использовать в общеязыковой исполняющей среде в дальнейшем.

Ниже пара слов о каждом типе данных:

  • класс – основа объектно-ориентированного программирования; Класс может содержать различные члены: поля, свойства, конструкторы, события, методы. Класс имеет следующее характеристики: запечатан ли класс, является ли класс абстрактным или конкретным, реализует ли класс какие-либо интерфейсы, какая у класса видимость.
  • интерфейс – это список функционала, который должен быть реализованы классом
  • структура – не вдаваясь в подробности реализации данного типа данных, можно просто сказать, что это «легковесная» версия класса. Наиболее частое применение структур — это моделирование математических, физических или геометрических данных.
  • перечисление – это удобный способ создания пар «ключ-значение», которые легко использовать в различных частях нашего когда.
  • делегат – очень сильно упрощая делегатом можно назвать указатель на определённую функцию / метод в памяти, однако по сравнению с другими языками программирования в .Net делегат не является просто указателем на определенное место в памяти, а реализует в себе дополнительную полезную функциональность.

Как уже было сказано ранее существует несколько .Net языков программирования, которые для выполнения одного и того же действия используют разный стиль записи (синтаксис). Это не является проблемой, так как код так или иначе независимо от исходного языка программирования будет скомпилирован до идентичного промежуточного языка (intermediate language). Однако не все языки .Net имеют одинаковые возможности и часть языков могут (или не могут) поддерживать определенную функциональность. То есть можно сказать, что с точки зрения определенного функционала языки программирования .Net не совместимы. В этом случае возникает понятие общая спецификация языков (Common Language Specification). Общая спецификация языков определяет минимальный набор функционала, который должен быть поддерживаться каждым .Net компилятором, чтобы скомпилированный код можно было выполнить в общеязыковой исполняющей среде в дальнейшем. То есть общая спецификация языков это набор правил, которые относятся к элементам, которые выставлены «наружу» и могут быть использованы другими языками .Net (например, публичные методы классов). Общая спецификация языков не ограничивает использование функционала конкретного языка во внутренней имплементации (например, приватные методы).

В повседневной жизни программиста вам вряд ли придется задумываться над проблематикой общей системы типов и общей спецификации языков – это узкая сфера интересов программистов, которые программируют компиляторы. С другой стороны понимание, что происходит с кодом, написанным, например, в C#, во время компиляции и зачем это необходимо – полезно для вас как для профессионала. Дополнительно в ходе разговора о том, чем является .Net может возникнуть дополнительный вопрос чем является управляемый код и чем он отличается от неуправляемого кода. Отвечая на данный вопрос, достаточно будет дать 2 определения: для управляемого и неуправляемого кода. Итак, управляемый код – это код, который можно запустить на платформе .Net (например, код C#); библиотеки, которые содержат управляемый код, называются сборкой (assembly). В отличие от управляемого кода, неуправляемый код – это код, который не может быть непосредственно запущен на платформе .Net (например, неуправляемое приложение в C/C++).