Компиляторы для конкретной ОС? - PullRequest
0 голосов
/ 10 декабря 2018

Я понимаю, что делает компилятор, поскольку он берет исходный код и компилирует его в машинный код, понятный компьютеру.Однако мне интересно одно: этот машинный код специфичен для каждой операционной системы?Нужно ли писать другой компилятор для одного и того же языка в операционных системах Mac, Windows и Linux?Пожалуйста, уточните, если ответ - да, нет или между ними.

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Это зависит.

Компилятор, генерирующий машинные инструкции, машина (или архитектура ): ARM и x86 имеют разные наборы команд, поэтомумашинный код для каждого будет очень разным, но он не будет обязательно зависимым от ОС (хотя обычно так бывает, потому что разные ОС имеют разные соглашения о вызовах и т. д.) Компонент linker почтивсегда зависит от ОС, поскольку именно это создает исполняемый файл для этой ОС.Не все системы компиляторов отделяют компилятор от компоновщика - если это одна программа, то это будет зависеть от ОС.

Однако существуют ОС / машинно-независимые компиляторы: в первую очередь Java (и другие на основе JVM).языки, такие как Scala или Groovy).Это связано с тем, что компиляторы Java генерируют байт-код для JVM и выполняются средой выполнения Java (которая является для конкретной ОС и процессора).Но компилятор Java (написанный на Java) может работать на любой машине и генерировать код, который будет работать на любой машине.

0 голосов
/ 01 мая 2019

Имейте в виду, что компиляторы, работающие на одной ОС, могут генерировать код для другой ОС.

Так что, если я напишу компилятор для ОС A, а он может сгенерировать ядро ​​для ОС B, то я могу скомпилировать этокомпилятор написан для A, но вывод для B. тогда у меня есть компилятор для B. Технически некоторые могут не называть его одним и тем же компилятором.

0 голосов
/ 10 декабря 2018

Вывод из компиляции содержит две вещи 1. Вызовы подпрограмм библиотеки операционной системы 2. Собственный машинный код для выполнения вашей «бизнес-логики»

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

Вызовы в библиотечных подпрограммах - это то, где все рушится.Вот почему WINE существует в Linux - он дает вам некоторые «эмулированные» / «переведенные» подпрограммы, которые работают в Linux, чтобы дать вам возможность запустить программу Windows в чужой операционной системе.

Итак, ответдействительно, не совсем.Вместо абсолютного да или нет.

...