Компилятор Just in Time платформы .net создает язык ассемблера или двоичный код? Другими словами, должен ли вывод JIT-компилятора проходить через ассемблер, прежде чем он будет нацелен на процессор. Если JIT создает язык ассемблера, есть ли способ увидеть этот вывод на языке ассемблера?
2 ответа
Когда вы компилируете программу .NET, генерируется MSIL (теперь он может называться CIL). MSIL - это «байт-код» - что-то вроде немного более высокого уровня ассемблера, который не предназначен для работы на каком-либо реальном процессоре.
Это должно быть "точно вовремя" скомпилировано (JITted) в собственный код. Ваш процессор понимает только нативный код. Нативный код зависит от архитектуры, то есть нативный код ARM не будет работать на x86, и наоборот.
Объектный код - это то, что ассемблер или компилятор выводит до того, как он проходит через процесс, называемый связыванием. В целом упрощение связывания позволяет коду использовать подпрограммы, функции и API в других библиотеках (например, .dll), средах (например, COM и т.д.) И самой операционной системе - после компоновки у вас есть исполняемый файл, который вы можете использовать. Объектный код также зависит от архитектуры.
JIT-компилятор не вызывает отдельную программу для создания ассемблера (во всяком случае, не в Windows) - промежуточный читаемый текстовый файл "на языке ассемблера" не создается. Я уверен, что он просто напрямую генерирует двоичные инструкции. Вы можете перепроектировать и разобрать его, как любой другой .exe. Это очень сложно и обычно много работы.
Весь код, будь то текст, источник, нативный, машина, сборка, объект и т.д., Представляет собой поток двоичных данных. Это заканчивается как таковое в памяти процессора, когда это загружено. При хранении в файле он обычно переносится в исполняемый формат (Portable Executable или PE в Windows), который также содержит дополнительные данные, помещаемые в другое место в ОЗУ при загрузке по запросу выполнения из ОС, например статические данные, на которые ссылается программа (постоянные целые и строки, ресурсы, такие как значки и т. д.), используемые им библиотеки DLL и другие вещи. Ссылки на формат PE легко доступны.
JIT-компилятор .NET Framework "читает" байт-код и создает чистый двоичный машинный код: http://msdn.microsoft.com/en-us/library/ht8ecch6(v=vs.71).aspx
Прежде чем вы сможете запустить промежуточный язык Microsoft (MSIL), он должен быть преобразован JIT-компилятором .NET Framework в собственный код, который представляет собой специфичный для ЦП код, работающий на той же компьютерной архитектуре, что и JIT-компилятор. , Поскольку общеязыковая среда выполнения предоставляет JIT-компилятор для каждой поддерживаемой архитектуры ЦП, разработчики могут написать набор MSIL, который можно JIT-компилировать и запускать на компьютерах с различными архитектурами.