Некоторое время назад мне нужно было составить общее описание технологий Mono/.Net. Теперь, чтобы не пропадал труд, решил выложить его на open-life. Это не оригинальные материалы, а «компиляция», составленная из текстов, которые были найдены в internet. Весь материал разделил на несколько частей, сегодня первая, про .Net, т.к. зная, что такое дотнет, проще понять, что такое Mono. Да и про Rotor, наверняка, знают не все (я не знал).
.Net Framework
Net Framework — это платформа для разработки и исполнения приложений, которая создавалась с целью упрощения и ускорения написания программ. Одно из ключевых преимуществ данной технологии — возможность исполнения программ на любой ОС, для которой реализована .Net CLR.
Независимость .Net от ОС стала возможной благодаря тому, что .Net-программы компилируются в специальную форму, известную как универсальный промежуточный язык (CIL, common intermediate language), не привязанный к конкретному процессору. Когда программа запускается первый раз, .Net конвертирует CIL-код в оптимизированный машинный код для процессора, на котором он работает, и это объясняет, как один и тот же исполняемый файл можно поместить на какую угодно машину и оптимизировать для любой ситуации. Иными словами, .Net, так же как и Java, генерирует байт-код (IL), предназначенный для исполнения виртуальной машиной.
Наиболее распространенный .NET-язык называется С#, он был разработан для максимально удобного использования всех возможностей платформы. Но для .Net можно писать и на нескольких других языках программирования — Visual Basic, C++, Cobol, Eiffel, Perl, PHP, Python, Ruby, Tcl. Все они компилируются в тот же самый CIL-код, и полностью совместимы — над одним проектом может работать команда, где каждый программист пишет на своем любимом языке.
Первая версия Microsoft .NET Framework появилась в начале 2002 г., но её разработка велась с конца 1990-х годов под именем Next Generation Windows Services (NGWS). В октябре 2000 года корпорации Microsoft представила для сертификации в ЕСМА (Европейская Ассоциация Производителей Компьютеров) язык программирования С# (Стандарт ЕСМА-334) и команды универсального промежуточного языка CIL (Стандарт ЕСМА-335). А в 2003 году эти спецификации были приняты и в ISO (Международной организацией по стандартизации).
Очень часто, говоря об .Net, упоминается еще и проект Rotor. Rotor — усеченный вариант .Net CLR, который был адаптирован Microsoft для FreeBSD, Windows и Mac OS X. Исходные тексты Rotor распространяются на условиях Shared Source, которые явно запрещают его использование в коммерческих целях.
Основные компоненты платформы .Net — общеязыковая исполняющая среда (Common Language Runtime) и библиотека классов (Framework Class Library).
Common Language Runtime (CLR) — общеязыковая исполняющая среда, которая расположена поверх операционной системы и предоставляет виртуальную машину для исполнения байт-кода приложений — языка Common Intermediate Language (CIL или просто IL). Команды CIL компилируются в машинный код соответствующего типа процессора по запросу (JIT, just-in-time) в период выполнения. Обычно компиляция метода происходит один раз во время его первого вызова. Затем результат кэшируется в памяти, чтобы избежать задержек при повторных вызовах. ЛТ-компилятор выполняет оптимизацию кода специально для процессора, на котором исполняется этот код. Но существует возможность скомпилировать сборку и в родной (native) код для выбранной платформы.
В .NET включены сборки библиотеки классов .NET Framework Class library (FCL), содержащие определения нескольких тысяч типов, каждый из которых предоставляет некоторую функциональность. Наборы «родственных» типов собраны в отдельные пространства имен. Все .Net-приложения используют единую библиотеку классов FCL. Это упрощает интеграцию приложений и позволяет легче переносить приложения с одного языка на другой.
Еще к языкам можно добавить F# — функциональный язык от Microsoft. Его официальный выход запланирован вместе с C#4.0. Кстати некоторые добавки в C# (например кортежи) обязаны именно F#.
Ну и Nemerle — мультипарадигменный язык, разработанный в польском университете. Особенно сильный в задачах метапрограммирования.
Мне довелось пописать на обоих — очень интересные и не обычные языки. Про метапрограммирование в Nemerle я вообще молчу. Мозг поломать придется, но если имели опыт программирования на Haskell'е или чем-то подобном, то будет полегче:)
Во-первых, за прошедшие почти 10 лет с момента написания той статьи произошло достаточное количество событий. Например вышел .Net Framework 1.0 и последующие :)
Ну а во-вторых и так ясно, что все придумано до нас. Наша же задача найти это все и перевести на понятный далекому человеку язык.
Мне лично не приходилось иметь дело с LLVM, поэтому с удовольствием почитал бы об его особенностях. Тогда может и смог бы сформулировать отличия.
А из прочитанного об LLVM я правильно понял, что если не использовать внешних библиотек, а все собирать из исходников, то программа будет работать на всех поддерживаемых платформах?
Да. Насколько я понял, основная идея LLVM — создание виртуальной машины (back-end), выполняющей откомпилированную с помощью специального компилятора (front-end) в байт-код программу. Процессорозависимые оптимизации и прочая лабуда выполняются на месте (перед запуском или во время — не знаю, в детали не углубялся). Бэк-энды есть для разных платформ (точно собирается под виндой, линухом и макосью, про остальные не знаю), фронт-эндов пока мало, я запомнил только два: один — основанный на gcc (не знаю, какие из языков, поддерживаемых gcc, он поддерживает, наверное все?), второй — отдельный, для C/C++/ObjC — clang.
Собственно, о самой LLVM я знаю мало, мне интересовал только clang (потому что из него можно выдирать модули и использовать в разных целях).
Это немного разные вещи. LLVM — это из области компиляторов. Архитектура похожа на gcc — бэкэнды, фронтенты и т.д.
.NET же позволяет взаимодействовать программам на разных ЯП, например. Т.е. в некоторой степени стирается разница между языками.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Ну и
Мне довелось пописать на обоих — очень интересные и не обычные языки. Про метапрограммирование в Nemerle я вообще молчу. Мозг поломать придется, но если имели опыт программирования на Haskell'е или чем-то подобном, то будет полегче:)
Ну а во-вторых и так ясно, что все придумано до нас. Наша же задача найти это все и перевести на понятный далекому человеку язык.
А из прочитанного об LLVM я правильно понял, что если не использовать внешних библиотек, а все собирать из исходников, то программа будет работать на всех поддерживаемых платформах?
Собственно, о самой LLVM я знаю мало, мне интересовал только clang (потому что из него можно выдирать модули и использовать в разных целях).
.NET же позволяет взаимодействовать программам на разных ЯП, например. Т.е. в некоторой степени стирается разница между языками.