Рейтинг:
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: это начинает становиться мутным, когда вы погружаетесь еще глубже, и вы получаете чертовски много "лжи детям" на пути вниз. :смеяться: