The_Unknown_Member Ответов: 1

[.net] как выполняется код MSIL без компиляции ?


Мне интересно, как MSIL работает без предварительной компиляции ? Как я знаю, .NET использует JIT-компилятор, а JIT-компилятор является одновременно интерпретатором и компилятором, который запускается после запуска программы (во время выполнения). Так как же выполняется MSIL ?

Что я уже пробовал:

Задавая вопрос здесь, в CodeProject.com

Richard MacCutchan

Вы сами ответили на свой вопрос. Он переходит в JIT-компилятор, который интерпретирует и выполняет его.

The_Unknown_Member

@Richard MacCutchan не могли бы вы также объяснить мне, как выполняется ассемблерный код ? Например, предположим, что у нас есть программа из 100 строк ассемблерного кода, и когда этот ассемблерный код начинает собираться из ассемблера в машинный код, он делает это строка за строкой или делает все сразу ?

Richard MacCutchan

Google найдет для вас много информации о MSIL и JIT.

1 Ответов

Рейтинг:
1

OriginalGriff

Цитата:
Так как же выполняется MSIL ?
Существует множество ресурсов в интернете, которые объясняют это: Процесс Выполнения Кода[^] дает хороший обзор, но Google может найти для вас более подробную информацию.
Цитата:
Не могли бы вы также объяснить мне, как выполняется ассемблерный код ? Например, предположим, что у нас есть программа из 100 строк ассемблерного кода, и когда этот ассемблерный код начинает собираться из ассемблера в машинный код, он делает это строка за строкой или делает все сразу ?

Это никогда не бывает так просто.
MSIL (теперь называемый CIL, Common Intermediate Language) - это фактически ассемблерный код, истинная родная программа на ассемблере никогда не создается для проектов .NET. Если вы имеете в виду реальный ассемблерный код, как в "собственном процессорном ассемблере", то он (своего рода) обрабатывается строка за строкой для получения полного исполняемого файла (но строчный бит неверен, потому что есть прямые и обратные ссылки, которые нужно учитывать, и ассемблеры обычно обрабатывают многоходовую обработку в результате).
MSIL преобразуется в машинный код (т. е. двоичный код, который может выполняться непосредственно на реальном процессоре) JIT-компилятором метод за методом, а не строка за строкой (за исключением того, что он также может быть полностью скомпилирован с помощью предварительной компиляции с использованием NGEN, но это менее распространено).

А JIT выполняется только один раз: скомпилированные результаты сохраняются и используются повторно.


The_Unknown_Member

"MSIL преобразуется в машинный код (т. е. двоичный код, который может выполняться непосредственно на реальном процессоре) JIT-компилятором на основе метода За методом, а не строка за строкой"

А после этого как выполняется машинный код ? Это строчка за строчкой ? Потому что я думаю, что если бы это не было строка за строкой, то у нас не было бы времени выполнения

OriginalGriff

Нет, не построчно - процессоры не имеют представления о строках, и одна строка C # или даже CIL может быть количеством машинных инструкций, в зависимости от строки и от фактического процессора, выполняющего код. Процессоры работают с инструкциями машинного кода, которые представляют собой двоичные значения, которые исполнительный блок «декодирует» в различные операции: «переместить в этот регистр», «добавить этот регистр», «сохранить в этом адресе памяти». Или даже «скопируйте количество байтов в этом регистре из адреса памяти, на который указывает смещение этого регистра этим регистром, в адрес памяти, на который указывает смещение другого регистра в совершенно другом регистре, если установлен флаг переноса» в крайних случаях . Выполнение на уровне процессора всегда выражается в машинном коде, ничего больше. За исключением того, что ... если вы примете красную таблетку, вы обнаружите, что кроличья нора намного глубже, а машинный код часто аппаратно интерпретируется процессорами микрокода, которые делают вид, что действительно понимают машинный код. Слои могут стать довольно глубокими, если вы начнете искать «окончательный кремниевый» слой исполнения.

Если бы я был на вашем месте, я бы просто оставил это в покое на данный момент и работал с абстракциями более высокого уровня C# и CIL: это начинает становиться мутным, когда вы погружаетесь еще глубже, и вы получаете чертовски много "лжи детям" на пути вниз. :смеяться: