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