Для кого все же предназначен код, полученный из CIL (байт-кода .net)?

Компилируя исходный код на на .net-совместимом языке, получаем CIL, который впоследствии транслируется виртуальной машиной в, так сказать, "окончательный" код, предназначенный для конкретной платформы.
Обычно можно встретить формулировку вроде "компилируется JIT-компилятором в машинный код".

Однако так уж прямо в машинный ли?

Ведь "машинный код" подразумевает команды, которые процессор может выполнить непосредственно, безо всяких дополнительных преобразований от различного рода трансляторов. Если открыть страницу вики, посвященную Mono, в первом же абзаце можно увидеть, для каких операционных систем существуют реализации моно и какие архитектуры процессоров поддерживаются. То есть вы можете писать в Mono из-под винды, макос, линукса и написанная вами программа будет работать на всех ОС из списка по ссылке (а именно - Windows, Linux, BSD (FreeBSD, OpenBSD, NetBSD), Solaris, Mac OS X, Apple iOS, Wii).

Но сама операционная система может работать не с любой архитектурой процессора.
К чему я веду: если CIL действительно компилируется в машинный код, который уходит непосредственно процессору на исполнение, то зачем указывать список целевых операционных систем?
Может быть тогда все же CIL компилируется в код для операционной системы, которая уже занимается окончательным его переводом в машинный код для процессора?

Ведь даже если вспомнить книгу "Архитектура компьютера" Таненбаума, то там уровень машинных команд находится в самом низу, а над ним несколько других уровней, в частности, уровень 3 операционной системы
(схема)
5c8fa0e71ba70845437399.jpeg
  • Вопрос задан
  • 835 просмотров
Решения вопроса 1
saboteur_kiev
@saboteur_kiev
software engineer
Исполняемый файл - это не прямой набор инструкций. Он может иметь специальную структуру - .com, exe, линуксовые и юниксовые бинарники отличаются - CIL компилируется в машинный код, но в результате создается не просто байткод команд, а бинарник определенного формата, с которым умеет работать операционка - машинный код должен каким-то образом загрузиться в память, возможно даже не весь а частями, точка входа должна быть сообщена процессору и так далее.
Сейчас практически несуществует линейных программ, которые написаны таким образом, что выполняются в моносреде - все пишется из расчета многозадачных ОС.

Таким образом, в CLI обычный машинный код, который выполняется процессором, но который содержит определенные закладки, вызовы функций операционных систем для того, чтобы этот код успешно работал в определенной ОС, чтобы он не загребал под себя 100% CPU на пустые циклы и так далее.
Это не значит, что там немашиный код, это значит что машинный код написан для работы в определенных условиях и содержит определенные вызовы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
хорошо сформулированный вопрос, содержит не менее половины ответа (с)
тут так..
CIL действительно компилируется в машинный код
да, действительно
зачем указывать список целевых операционных систем?
не поверите, но минимальный ответ примерно таков - правильный формат исполняемого файла
ps да да, как подмечено Saboteur, и правильные обращения к ОС, тоже.. или даже на первом месте.. .. эмм.. для CIL.. того же Mono, да проверьте сами! ))
Ответ написан
Комментировать
Может быть тогда все же CIL компилируется в код для операционной системы, которая уже занимается окончательным его переводом в машинный код для процессора?

Нет такого понятия код для операционной системы. Операционная система -- точно такая же программа (в реальности -- комплекс программ), как и все остальные.
если CIL действительно компилируется в машинный код, который уходит непосредственно процессору на исполнение, то зачем указывать список целевых операционных систем?
CIL транслируется в машинный код рантаймом (например, моно) в момент непосредственно перед исполнением. И если рантайм не умеет работать на определенной ос, то и CIL там не заработает.
Т.о., при проектировании программы Вам необходимо знать, на каких ОС есть рабочий рантайм. Также, если Вы обращаетесь к сервисам ОС (неявно, через обертки .net, предоставляемые BCL, или явно -- через DllImport), Вам нужно знать, на какой ОС будет выполняться Ваше приложение, дабы учитывать возможности ОС.
Ответ написан
@Satangelus
В статье приведенной по ссылке подробно разбирается что и как под капотом net framework. Там Вы найдете ответ на Ваш вопрос.
https://habr.com/ru/post/90426/
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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