aminought
@aminought

Как работает C#?

Здравствуйте. Изучая C#, пытаюсь как-то сравнивать его с Java и не могу понять некоторые моменты, которые мне кажутся ясными в Java.
1. Насколько я знаю, в Java есть JVM, которая загружает файлы .class, содержащие байт-код, и запускает их. В мире C# есть CLR, который обрабатывает MSIL. А откуда берётся этот MSIL? Куда компилируются .cs? Всё, что я нашёл, - это только .exe файл, а в каком моменте тогда работает виртуальная машина, и почему мы получаем на выходе .exe?
2. В мире C# существуют также такие понятия как .NET, Mono, Roslyn и т.д., можете ли вы структурированно разъяснить их смысл?

Не обязательно расписывать всё тут, можете просто дать ссылки на статьи, где собраны все эти понятия, я буду благодарен. Википедия не приветствуется, слишком всё разрозненно. Спасибо.
  • Вопрос задан
  • 4029 просмотров
Решения вопроса 1
@VZVZ
Reverse-Engineer, Software Developer, Architect
> Насколько я знаю, в Java есть JVM, которая загружает файлы .class, содержащие байт-код, и запускает их.
Поправка: обычно не .class, а .jar. А вот внутри .jar (это архив) - уже файлы .class. Ведь .class, как ясно из названия, содержит только 1 класс, нечто вроде .obj в C++. А в приложении может быть и несколько классов, + цифровая подпись, + прочее. Вот всё это и линкуется в .jar.
Один и тот же .jar работает везде там, где есть JVM в чистом виде. На десктопных линуксах работает. На Android не работает, там вместо этого .apk - другой формат.

> Куда компилируются .cs?
Гуглим csc.exe
Обычно все операции осуществляются в нем, т.е. из .cs может делать сразу .exe. Хотя возможно сперва сделать IL (нечто вроде ассемблера, но пока еще НЕ байт-кода, т.е. НЕ бинарное), а вот IL уже скомпилировать в байт-код (бинарный формат) с оберткой exe.

> В мире C# существуют также такие понятия как .NET, Mono, Roslyn и т.д., можете ли вы структурированно разъяснить их смысл?
В .NET Framework входят:
- компиляторы: для C# (тот самый csc.exe) и не только для C# (да, компиляторы именно входят в .NET, а не в Visual Studio);
- тот самый CLR;
- несколько библиотек классов, таких, как mscorlib.dll, System.Windows.Forms.dll (Winforms). библиотеки WPF. Такие библиотеки называются стандартными. Те библиотеки, которые в .NET не входят и их нужно таскать рядом с exe, называются сторонними (third-party), так как обычно они созданы не MS, а сторонними, "третьими", разработчиками.

Mono - платформа, позиционируемая как кроссплатформенная альтернатива .NET Framework. То есть всё перечисленное там своё и от MS ничего нет. IDE также своя - MonoDevelop.
На деле же, альтернатива эта от начала до конца очень сырая и вообще хилая. Например, Winforms/WPF там просто нету (может и можно прикрутить эти сборки из .NET, но на линуксе без вайна не заработает, да и MonoDevelop не содержит средств для удобной разработки под них). Вместо Winforms/WPF там GTK#, он реально кроссплатформенный, но до Winforms и тем более WPF ему очень далеко.

Roslyn - какой-то новый компилятор от MS, вроде бы альтернатива старому csc.exe. Ничего интересного лично я в нем не вижу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Рекомендую книгу Рихтера "CLR via C#"
Ответ написан
Комментировать
Nipheris
@Nipheris Куратор тега C#
А откуда берётся этот MSIL? Куда компилируются .cs?

cs компилируются компилятором. Есть стандартный csc, поставляется вместе с .net framework (НЕ со студией). Это "классический" компилятор от MS, написан на C++, с закрытым исходным кодом. Такой же есть и для Visual Basic. Кроме них есть еще Roslyn-компиляторы C# и VB, они open-source, их главное отличие в том, что они сами написаны на управляемых языках. Это значит, что у вас есть compiler-as-a-service. Это, в свою очередь, значит, что если вы хотите написать тулзу, обрабатывающую тем или иным образом исходный код, например на C#, вам не нужно самому писать парсер/компилятор, вы можете подключить модули Roslyn-компилятора и пользоваться ТЕМ ЖЕ компилятором (лексером/парсером/etc), что и используется непосредственно при сборке приложения. С классическим компилятором так не получится, он представляет из себя черный ящик: cs на входе, сборка на выходе.

Далее будем считать, что не учитываем в рассуждениях технологию .net native.
в каком моменте тогда работает виртуальная машина

она работает в момент запуска exe.
почему мы получаем на выходе .exe

в этом вопросе часто возникает путаница. Дело в том, что дотнетовские exe и dll - это т.н. сборки (assemblies), и они содержат метаданные и MSIL (!) исполняемый код. То, что у них расширения exe и dll - это потому, что MS для повышения совместимости и удобства использования, упаковала их в формат PE. Чтобы .net приложения можно было запускать также, как и нативные. НО реально в exe-файле есть только небольшой загрузчик, который запускает CLR, просит загрузить текущий файл как дотнет-сборку и передать управление на метод-точку входа. Почитайте про сборки в хорошей книге, и скачайте dotPeek, посмотрите что внутри дотнетовского exe. Это совсем не то, что в "обычном", нативном exe.

В мире C# существуют также такие понятия как .NET, Mono, Roslyn и т.д., можете ли вы структурированно разъяснить их смысл?

.NET это название и бренд платформы, .NET Framework, а теперь и .NET Core - реализации платформы от MS, Mono - open-source реализация НЕ от MS. .NET FW работает только на винде, .NET Core и Mono и на других платформах. Про Roslyn уже упомянул.
Ответ написан
Комментировать
GavriKos
@GavriKos
MSIL - это как раз результат компиляции c#. И именно он содержится в exe. Просто этот exe запускает .net машину и говорит ей где в exe MSIL.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы