6

Вещи, которые отвечающая уже знаем, но здесь это в любом случае, чтобы показать мой мыслительный процесс:Как компилятор «знает», как переводить код на конкретную сборку процессора?

Перехода от ЯВЫ в машинный код, здесь неровное множество событий, которое имеет место (есть Linkers и другие вещи, но давайте игнорировать, что на данный момент):

ЯВУ -> Compiler -> Assembler ----> Машинный код

в зависимости от того, какое оборудование я покупаю, это может иметь другой процессор (Intel, SPARC, ARM и т.д. .). Язык ассемблера специфичен для процессора. Поэтому, когда код отправляется из компилятора -> Ассемблер, код сборки, который генерируется, является специфичным для процессора.

Как добраться до точки:

Например: У меня ОС Windows на моем оборудовании. И я получаю, скажем, «компилятор C для Windows 7 64bit». И у меня также есть Ubuntu на одном аппаратном обеспечении, и я получаю компилятор C для Ubuntu 64 бит.

  1. У меня могут быть одинаковые ОС на разных аппаратных средствах с различной архитектурой процессора или на разных ОС на одном и том же оборудовании (например, в примере выше). Когда я загружаю компилятор C, почему компиляторы перечислены как ОС? Вместо конкретного процессора? Поскольку вся точка компилятора заключается в том, чтобы перевести HLL на Assembly, которая является специфичной для процессора, и не Специфическая ОС.

  2. Предполагая, что 1. как это делается, и когда я загружаю компилятор, предназначенный для Windows 7 и для Ubuntu, как компилятор знает, какой процессор конкретный код сборки для генерации? Включен ли компилятор с различными ассемблерами, специфичными для процессора?

+0

Вкратце, ОС предоставляет низкоуровневые программные услуги, драйверы , и т. д., который использует компилятор. Таким образом, компилятор является специфичным для ОС. Компилятор знает, какой код следует генерировать, потому что он был просто разработан с использованием этих знаний. Компилятор для архитектуры x86, например, имеет неявные знания, встроенные автором компилятора набора команд x86. – lurker

+0

Я не обращал внимания на то, что когда вы входите в окончательную компоновку и формат исполняемого файла, очевидно, что исполняемый формат очень специфичен для ОС. ОС интерпретирует двоичный исполняемый файл, определяя критическую информацию из файла и определяя, где и как загружать и выполнять программу. – lurker

ответ

5

Несколько факторов играют в этом. Для настольных компьютеров используется практически только две архитектуры: 32 бит - x86 (с различными расширениями), 64 бит - x86-64. Поэтому много программного обеспечения может просто игнорировать эту проблему и указывать только «битность». Это особенно актуально для Windows до Windows RT/8, которые даже не пытаются поддерживать какие-либо другие архитектуры.

Хотя компилятор должен знать о архитектуре процессора, практически все интересные программы должны так или иначе взаимодействовать с операционной системой. И даже если ваш код не взаимодействует с ОС, компилятор должен знать, какой формат файла использовать для двоичных файлов, с которыми связаны библиотеки и т. Д. Библиотека времени выполнения также зависит от ОС и обычно поставляется вместе с компилятором.

Что касается того, как компилятор знает, какие команды нужно генерировать: либо загруженный вами бинарный файл специально настроен для одной архитектуры (независимо от того, ссылается ли вы на указанную вами страницу), а не может сгенерировать код для другие архитектуры, или у нее действительно есть несколько бэкэндов, составленных в.

Тем не менее, многие компиляторы не объявили «<language> компилятор для <operating system>». Авторы-компиляторы, как правило, гораздо более педантичны в определении наборов инструкций, а также дистрибуторов. Только ребята из окон очень неряшливы, потому что примерно год назад это была не полезная информация.

0

Для фактических вычислений, таких как добавление двух чисел, требуется только аппаратное обеспечение, и вы действительно получите одинаковый машинный код под Windows и под Linux.

Интересный «клей» предоставляется библиотеками платформ, например. стандартная библиотека C, которая предоставляет функцию «печатать символы на стандартном выходе». Код вызова функции также полностью определяется аппаратным обеспечением (хотя существуют некоторые соглашения, которые различаются между Windows и Linux, например, где нужно поместить аргументы функции, но это всего лишь условные обозначения). Интересное специфическое для платформы «мясо» обеспечивается реализацией из этих библиотек. Например, как осуществляется printf? Различные коды генерируются в Linux и Windows, но различия не в типах инструкций, а скорее в том, как вы разговариваете с операционной системой.

Опять же, это в основном вопрос конвенции, и нет существенных различий в фактическом машинный код программ для разных операционных систем на одном и том же оборудовании. Разница заключается лишь в том, как заставить операционную систему выполнять определенные функции от вашего имени, такие как ввод/вывод, предоставление вам памяти, время и т. Д.