Задать вопрос
@ldmitriy

Как работает .NET?

Когда я в Visual Studio нажимаю собрать проект(зеленая стрелка) что происходит?
Я понял так: компилятор преобразует код в промежуточный байт код, который называется CIL(MSIL). Этот код выполняется средой CLR, в которую входит JIT компилятор, в машинные коды. Получается exe.

В CLR не входит CIL?
JIT запускается каждый раз при сборке проекта или только один раз чтобы запомнить архитектуру платформы?
  • Вопрос задан
  • 1298 просмотров
Подписаться 3 Простой Комментировать
Решения вопроса 2
ayazer
@ayazer
Sr. Software Engineer
код превращается в IL, который уже будет превращаться в машинный по мере необходимости (см. JIT компиляцию). Т.е. по сути первый вызов метода будет происходить чуть дольше т.к. будет происходить оптимизация и компиляция IL кода под реальную аппаратную платформу. После чего все последующие вызовы будут выполняется быстрее. Если такой вариант по каким-то причинам не подходит - есть ngen который позволяет сразу скомпилировать код под известную платформу (выиграв на холодных запусках, по потеряв в переносимости). И в этом случае jit компиляция во время работы приложения уже выполнятся не будет.

В CLR не входит CIL?

не совсем понял вопрос. cil/msil/il - просто промежуточный в который превращается код на С#/F#/VN.NET/etc. Можно расценивать его как ассемблер для .нета. Мало того, никто не запрещает написать свой DSL, который будет генерировать IL, который в свою очередь будет работать везде где работает .нет

JIT запускается каждый раз при сборке проекта или только один раз чтобы запомнить архитектуру платформы?

оба варианта нет. jit компиляция = just-in-time и запускается прямо во время работы приложения. как-раз она и превращает IL код в нужный набор машинных кодов.
Ответ написан
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
*.cs и много другого компилируется в msil. Он выполняется на CLR.
Jit запускается каждый раз.
Опустить этот этап и много других можно предкомпилировав сборку
https://docs.microsoft.com/ru-ru/dotnet/framework/...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Когда вы нажимаете "зелёную кнопку" происходит следующее:
  1. Visual studio вызывает .NET SDK
  2. .NET SDK вызывает msbuild
  3. msbuild в определённый момент вызывает csc.exe (C# Compiler)
  4. csc.exe генерирует IL (aka MSIL, aka CIL) и заталкивает его в DLL-ки
  5. ^---- Это происходит при сборке проекта
  6. <-- В этот момент на .net framework можно было натравить Ngen и пропустить чать JIT-компиляции
  7. V---- А это при каждом запуске
  8. Затем .NET Runtime берёт эти сборки и передаёт IL-код JIT-компилятору
  9. Пока JIT в фоне компилирует IL в машинный код - рантайм интерпретирует IL
  10. Когда IL скомпилировался - рантайм берёт сгенерированный машинный код
  11. При этом в фоне JIT может собирать информацию о том, какие методы чаще вызываются, чтобы ещё их оптимизировать.


Ещё во время сборки проекта можно предварительно натравить JIT на код.
При запуске это позволит пропустить этап с интерпретацией и сразу запустить исполняемый код.
Эта фича называется ReadyToRun Compilation

Тут в одном из ответов посоветовали CLR via C# - я считаю, что это уже не самая актуальная книга, тк в .NET Core многое поменялось / дополнилось и могут отличаться нюансы.

Если хотите подробнее узнать про JIT - начните с этого доклада:
https://www.youtube.com/watch?v=H1ksFnLjLoY
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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