Компиляция языка высокого уровня в машинный код

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

но это было найдено в одном из моих лекционных листов, поэтому я был бы признателен, если бы кто-то мог объяснить дальше и исправить меня, если Я ошибаюсь, или скриншот ниже.

Slide

3 ответов


слайд-ошибочна...

существует сопоставление 1-к-1 между сборкой и машинным кодом. Сборка-это текстовое представление информации, а машинный код-двоичное представление.

некоторые машины, однако, поддерживают дополнительные инструкции по сборке, но какие инструкции включены в производимый код сборки по-прежнему определяются во время компиляции, а не во время выполнения. Вообще говоря, однако, это определяется процессором в системе (intel, amd, ti, nvidia и т. д..) не производитель, у которого вы покупаете всю систему.


этот слайд путает байт-код с текстовой сборкой. Сборка-это читаемая человеком версия байт-кода или машинного кода. Машинный код-это то, что оборудование может работать напрямую. Байт-код далее компилируется в машинный код, он является низкоуровневым, но общим.

некоторые языки используют байт-код, который translsted во время выполнения еще ниже в машинный код уровня. Одним из примеров этого является java, где файлы классов иногда компилируются в машинный код ASA runtime оптимизация. Другой-cuda, где каждый gpu nvidia имеет другой набор инструкций, но компилятор cuda генерирует байт-код, который драйвер cuda для каждого gpu может затем перевести.

другой вариант заключается в том, что он говорит о том, как процессоры intel переводят машинный код во время выполнения во внутренний микрокод, а затем запускают его, это полностью невидимо для программного обеспечения, включая ОС.


слайд сильно ошибался во многом.

значительно упрощенная версия того, что на самом деле происходит в примере, приведенном в слайд-компиляции C++ - объяснил бы, что существует четыре этапа компиляции для создания и исполняемого файла из файла исходного кода:

  1. предварительная обработка
  2. компиляция "proper"
  3. сборка
  4. связь

в предварительная обработка фаза, директивы препроцессора, такие как #include и #define полностью развернуты, а комментарии удалены препроцессора, создание "postprocessed"C++. Слайд полностью опускает это.

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

вопреки слайдов, язык ассемблера заявления не "чтение ОС" и они преобразуются в машинный код во время выполнения. Скорее, они читаются сборщик, который выполняет свою работу (следующий абзац) во время компиляции.

на сборка фаза, операторы языка ассемблера с предыдущего этапа превращается в объектный код (инструкции двоичного машинного кода, которые понимает процессор, в сочетании с метаданными, которые понимают ОС и компоновщик) ассемблером.

на связь фаза, объектный код из предыдущей фазы связан с другими файлами объектного кода и общими/системными библиотеками для формирования исполняемого файла.

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

еще одна ошибка заключается в том, что разные марки машин делают не имейте их "собственные коды машины". То, что определяет, какие машинные коды понимаются машиной, - это CPU. Если две машины имеют один и тот же процессор (например, a компания Dell ноутбук и Toshiba ноутбук с то же самое Intel i7-3610QM CPU), то они понимают те же машинные коды. Более того, два процессора с одинаковой ISA (архитектурой набора инструкций) понимают одни и те же машинные коды. Кроме того, новые процессоры, как правило, обратно совместимы со старыми процессорами в той же серии. Например, более новый Intel i7 CPU понимает все инструкции, которые старше Intel Pentium 4 понимает, но не наоборот.

надеюсь, я ударил несколько лучший баланс между простотой и правильностью, чем слайд выше, который терпит неудачу.