История и альтернативы платформы .NET

Недавно мне повезло пообщаться с Крисом Бэйконом, который написал DotNetAnywhere (альтернативный вариант .NET Runtime), и я остроумно заметил:


… ты, наверное, один из тех немногих, кто создал собственную среду выполнения .NET, и это круто!

если исключить тех, кто на зарплате, т.е. инженеров Microsoft/Mono/Xamarin, их очень немного.

o2bl_ggdz0htylyufnlr8lmkiho.jpeg

И тут я задумался:, а сколько всего сред выполнения .NET существует? Сначала я составил собственный список, а затем подключил к этому делу команду высокооплачиваемых исследователей — моих подписчиков:


#LazyWeb, fun Friday quiz, how many different .NET Runtimes are there? (that implement ECMA-335 https://t.co/76stuYZLrw)
— .NET Framework
— .NET Core
— Mono
— Unity
— .NET Compact Framework
— DotNetAnywhere
— Silverlight
What have I missed out?

— Matt Warren (@matthewwarren) September 14, 2018

В рамках этого поста под средой выполнения .NET я подразумеваю всё, что реализовано на базе стандарта ECMA-335 для .NET (подробную информацию см. здесь). Не знаю, есть ли более точное определение или какой-то способ официально подтвердить соответствие, но на практике это означает, что среда выполнения поддерживает exe/dll файлы .NET, созданные любым компилятором C#/F#/VB.NET.

Как только список был готов, я залез в Википедию (см. список источников). В результате получилась следующая хронологическая последовательность:

qmgqzx15ddp4oohkdfcf7gysldg.jpeg

Timeline maker
(Для интерактивной версии пройдите по ссылке)

Если я пропустил какие-то среды выполнения, дайте знать.

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


  1. Фреймворки .NET от Microsoft
  2. Другие среды выполнения Microsoft
  3. Среды выполнения Mono/Xamarin
  4. Среды выполнения с AOT-компиляцией
  5. Проекты сообществ
  6. Исследовательские проекты

Оставшаяся часть поста посвящена детальному описанию разных сред выполнения. Почему они появились, что они могут и зачем их сравнивать.

Первоначальный .NET Framework от Microsoft появился в конце 90-х и с тех пор становился только эффективнее. Недавно компания несколько сменила курс, объявив о выходе фреймворка .NET Core, отличающегося кроссплатформенностью и открытым исходным кодом. Кроме того, разработав спецификацию .NET Standard, Microsoft обеспечила совместимость различных сред выполнения.


Спецификация .NET Standard обеспечивает совместное использование кода. Она определяет набор API, которые должны быть доступны во всех реализациях .NET для соответствия стандарту. Это обеспечивает единообразие всех сред выполнения .NET и предотвращает раздробленность в будущем.

Небольшое отступление: если хотите больше узнать об истории .NET, рекомендую послушать Андерса Хэйлсберга или посмотреть выступление Ричарда Кэмпбелла, — это действительно крутой рассказчик.


(Также доступен подкаст. Кроме того, Кэмпбелл пишет книгу по этой же теме. Если хотите больше узнать об истории развития всей экосистемы .NET, а не только сред выполнения, обратите внимание на страницу Legends of .NET).


Другие среды выполнения Microsoft

Помимо основного .NET Framework для широкого применения, Microsoft выпустила другие версии среды для специальных целей.


.NET Compact Framework

Фреймворки Compact (.NET CF) и Micro (.NET MF) были попытками создать сокращённые версии среды выполнения для устройств с ограниченными ресурсами. Например, .NET CF:


… создан для мобильных или встраиваемых устройств с ограниченным количеством ресурсов, таких как КПК, мобильные телефоны, промышленные контроллеры, ТВ-приставки и т.д. Фреймворк .NET Compact использует некоторые из библиотек того же класса, что и полная версия .NET, а также несколько библиотек, созданных специально для мобильных устройств, например элементы управления .NET Compact. Однако библиотеки не являются точной копией тех, что используются в .NET Framework. Они уменьшены, чтобы занимать меньше пространства.


.NET Micro Framework

Фреймворк .NET MF ещё меньше и:


… предназначен для устройств с ограниченным количеством ресурсов, которые обладают, по крайней мере, 256 Кб памяти и 64 Кб ОЗУ. Он включает уменьшенную версию .NET CLR и поддерживает разработку на C# и Visual Basic .NET, а также отладку (в эмуляторе или аппаратно) с помощью Microsoft Visual Studio. В NETMF реализован набор базовых библиотек .NET (около 70 классов и 420 методов). Добавлены специальные библиотеки для встроенных приложений. Это бесплатное ПО с открытым кодом, выпущенное под лицензией Apache License 2.0.

Для тех, кто хочет попробовать фреймворк в деле, Скотт Хансельман написал прекрасное руководство The .NET Micro Framework — Hardware for Software People.


Silverlight

Несмотря на то что платформа находится в режиме поддержки (или вообще умерла/движется к закату в зависимости от вашей точки зрения), интересно вернуться к первоначальному анонсу и посмотреть, для чего предназначалась Silverlight:


Silverlight — кроссплатформенный, кроссбраузерный модуль расширения на базе .NET, предназначенный для создания насыщенных интернет-приложений для браузеров. Предварительные сборки, выпущенные на этой неделе, поддерживают Firefox, IE и Safari на Mac и Windows.

В 2007 г. в Silverlight 1.0 были реализованы следующие возможности (платформа даже работала на Linux):


  • поддержка встроенных кодеков для проигрывания видеофайлов VC-1 и WMV, а также аудиофайлов в форматах MP3 и WMA в браузере…;
  • Silverlight поддерживает возможность постепенного скачивания и проигрывания медиаконтента с любого веб-сервера…;
  • Silverlight также опционально поддерживает встроенную потоковую передачу медиафайлов…;
  • с помощью Silverlight вы можете создавать многофункциональные пользовательские интерфейсы и анимацию, соединять векторную графику и HTML для создания привлекательного контента…;
  • Silverlight облегчает создание насыщенного интерактивного видеоконтента…


Среды выполнения Mono/Xamarin

Mono появился в результате попыток Мигеля де Икаса и других разработчиков заставить .NET работать на Linux (из Mono early history):


Для меня неважно, кто был первым, потому что я считаю Mono средством достижения цели: технологией, которая поможет Linux закрепиться на настольных компьютерах.

В этом же посте описано, как всё началось:


Что касается Mono, события происходили примерно следующим образом.
Как только в декабре 2000 г. вышла документация .NET, я заинтересовался этой технологией и начал изучать её, как и все, с интерпретатора байт-кода. Однако вскоре я столкнулся с проблемой — отсутствием спецификации для метаданных.
Последние изменения в ранних исходниках виртуальной машины вышли 22 января 2001 г. Примерно в это время я начал писать сообщения, используя список рассылки .NET, и просить недостающую информацию о формате файла метаданных.

Примерно в это же время Сэм Руби пытался убедить членов комитета ECMA опубликовать описание формата бинарного файла, что не входило в их планы. Не знаю, как всё развивалось, но к апрелю 2001 г. ECMA опубликовал описание формата файла.

Со временем Mono (сейчас Xamarin) распространился на другие платформы. Фреймворк работает на Android и iOS/Mac. В феврале 2016 г. Xamarin приобрела компания Microsoft. Стоит вспомнить и давнее сотрудничество между Mono/Xamarin и Unity, направленное на то, чтобы обеспечить поддержку C# в Unity. При этом Unity сейчас является членом .NET Foundation.

Я отнёс такие среды к отдельной категории, поскольку традиционно в .NET использовалась JIT-компиляция, но со временем появилось больше реализаций с AOT.
Насколько я могу судить, первым был фреймворк Mono, в котором AOT-компиляция появилась в 2006 году. Кроме того, Microsoft недавно выпустила .NET Native и сейчас они работают над CoreRT — средой выполнения .NET, оптимизированной под AOT-компиляцию.


Проекты сообществ

Однако не все среды выполнения .NET были разработаны Microsoft или компаниями, купленными ею впоследствии. Существуют проекты, реализованные сообществами.


  • Самым старым из них является DotGNU Portable.NET. Его разработка началась одновременно с Mono с целью «создать набор бесплатных инструментов для компиляции и выполнения приложений в рамках CLI…».
  • Во-вторых, назову DotNetAnywhere, разработанный всего одним человеком, Крисом Бэйконом. DotNetAnywhere известен тем, что служил первоначальной средой выполнения для проекта Blazor. Кроме того, это великолепная возможность взглянуть на то, что составляет .NET-совместимую среду выполнения без необходимости продираться через миллионы строк кода, образующих CoreCLR!
  • Затем идёт CosmosOS (проект на GitHub), который представляет собой не просто среду выполнения .NET, но управляемую операционную систему. Если хотите узнать больше, советую почитать этот раздел FAQ или заглянуть «под капот». Ещё одной подобной попыткой является SharpOS.
  • Наконец, недавно я наткнулся на CrossNet. Эта среда выполнения «анализирует сборки .NET и генерирует неуправляемый код C++, который может быть скомпилирован любым компилятором C++». Чтобы узнать больше, взгляните на документацию и пример сгенерированного кода.


Исследовательские проекты

Теперь перейдём к совсем малоизвестным средам выполнения .NET. Это исследовательские проекты Microsoft, запущенные с целью посмотреть, насколько можно расширить функционал управляемой среды выполнения и какие задачи можно решить с его помощью. Некоторые результаты исследований появились в коммерческих реализациях среды .NET, например Span вырос из проекта Midori.


Shared Source Common Language Infrastructure (SSCLI) (или Rotor)


Реализация CLI (основы .NET) от Microsoft, в которой исходный код доступен по лицензии Shared Source. Хотя SSCLI не подходит для коммерческого использования из-за особенностей лицензирования, с её помощью программисты могут проанализировать особенности реализации многих библиотек .NET и создавать модифицированные версии CLI. Microsoft предоставляет Shared Source CLI в качестве эталонной реализации CLI, пригодной для образовательных целей.

Интересно, что выпустив Rotor, компания смогла выпустить проект Gyro, который даёт представление о том, как в среде выполнения .NET появились generics.


Midori


Midori — кодовое имя операционной системы с управляемым кодом, которая разрабатывалась Microsoft совместно с Microsoft Research. Сообщалось, что она может стать коммерческой реализацией операционной системы Singularity, исследовательского проекта, начатого в 2003 г. для создания высоконадёжной операционной системы, в которой ядро, драйвера устройств и приложения состоят из управляемого кода. Она проектировалась для параллельных вычислений и могла запускать программу, распределённую по нескольким узлам одновременно. В ней так же была реализована модель безопасности на основе запуска приложений в изолированной среде. Microsoft предложила несколько возможных путей миграции с Windows на Midori. Работа над операционной системой была прекращена в 2015 году, хотя многие реализованные в ней идеи попали в другие проекты Microsoft.

Видимо, большинство идей из проекта Midori попали назад в .NET Framework. Подробнее об этом можно прочитать у Джо Даффи в серии статей о Midori:


  1. A Tale of Three Safeties
  2. Objects as Secure Capabilities
  3. Asynchronous Everything
  4. Safe Native Code
  5. The Error Model
  6. Performance Culture
  7. 15 Years of Concurrency


Singularity (операционная система) (также Singularity RDK)

Singularity — экспериментальная операционная система, которая разрабатывалась Microsoft Research между 2003 и 2010 гг. Предполагалось, что это будет высоконадёжная операционная система, в которой ядро, драйвера устройств и приложения состоят из управляемого кода. Средства внутренней безопасности используют безопасность типов вместо аппаратной защиты памяти.


Redhawk

И последняя, но не менее важная среда — Redhawk:
кодовое название для экспериментальной, минимальной версии среды выполнения с управляемым кодом, которая превратилась в CoreRT.


Ссылки на источники

Ниже приведены статьи Википедии, которые я использовал для создания хронологической шкалы:


© Habrahabr.ru