В книге пишут, что при запуске программы она компилируется в машинных код из IL, и при каждом следующем до выключения компьютера или перезагрузки запуске программы будет запускаться уже скомпилированная программа, а иначе она заново из IL будет компилироваться в машинный код JIT-компилятором. Так ли это? Есть ли более подробная информация об этом процессе?
Asked
Active
Viewed 6,398 times
1 Answers
6
Когда среда CLR выполняет IL код, то происходит следующее: при вызове блока IL-кода JIT-компилятор проверяет и преобразует его в машинные команды которые он сохраняет в динамическом блоке памяти. Затем, он возвращается к структуре данных типа и заменяет адрес вызываемого метода адресом этого блока памяти и при следующем запросе повторная компиляция не будет выполнена, а будет использован уже скомпилированный код.
Теперь, непосредственно, ответ на ваш вопрос: нет, весь скомпилированный код хранится в динамической памяти, а это значит, что этот код уничтожается при выходе из приложения.
В тоже время, существует способ предварительной компиляции приложения в образ в машинном коде (Native Image) с помощью Native Image Generator (Ngen.exe)
Артём Оконечников
- 3,831
-
-
-
Под структурой данных тут понимается тип, а под «блоком IL-кода» метод этого типа. – Артём Оконечников Feb 25 '17 at 06:34
CLR via C#- Дж. Рихтер - более подробная информация. На вопрос "Так ли это?" ответ - it depends. Можно один раз сбилдить в машинный код для конкретной среды развертывания. Ещё очень много информации можно найти ту - Книги по C# и другая литература в разделеКниги для специалистов: внутренние механизмы и пыльные углы– Anton Komyshan Feb 24 '17 at 11:44