Слайд во многом ошибочен.
Значительно упрощенная версия того, что фактически происходит в примере, приведенном на слайде — компиляция C++, — объясняет, что существует четыре этапа компиляции, которые необходимо создать и выполнить из исходного кода. файл:
- Предварительная обработка
- Компиляция «правильная»
- сборка
- Связывание
На этапе предварительной обработки директивы препроцессора, такие как #include
и #define
, полностью раскрываются, а комментарии удаляются препроцессором, создавая "постобработанный" C++. . На слайде это полностью отсутствует.
На этапе "правильной" компиляции постобработанный текст из предыдущего этапа преобразуется в язык ассемблера с помощью компилятора. К сожалению, мы используем один и тот же термин — компиляция — как для всей четырехшаговой процедуры, так и для этого одного шага, но так оно и есть.
В отличие от слайда, операторы языка ассемблера не «читаются операционной системой» и не преобразуются в машинный код во время выполнения. Скорее, они доступны для чтения ассемблеру, который выполняет свою работу (следующий абзац) во время компиляции.
На этапе ассемблера операторы языка ассемблера из предыдущего этапа преобразуются в объектный код (инструкции двоичного машинного кода, понятные ЦП, в сочетании с метаданными, которые ОС и компоновщик понимаю) ассемблером.
На этапе связывания объектный код из предыдущего этапа связывается с другими файлами объектного кода и общими/системными библиотеками для формирования исполняемого файла.
Во время выполнения ОС — в частности, загрузчик — считывает исполняемый файл в память и выполняет компоновку во время выполнения, где разрешаются ссылки на общие/системные библиотеки, и эти библиотеки загружаются в память (если они re еще не), чтобы ваш исполняемый файл мог их использовать.
Еще одна ошибка заключается в том, что машины разных марок не имеют свои «собственные машинные коды». Что определяет, какие машинные коды понимает машина, так это ЦП. Если две машины имеют одинаковый процессор (например, ноутбук Dell и ноутбук Toshiba с одним и тем же процессором Intel i7-3610QM), то они понимают одинаковые машинные коды. Более того, два процессора с одной и той же ISA (архитектурой набора инструкций) понимают одни и те же машинные коды. Кроме того, более новые ЦП, как правило, обратно совместимы со старыми ЦП той же серии. Например, более новый ЦП Intel i7 понимает все инструкции, которые понимает более старый Intel Pentium 4, но не наоборот.
Надеюсь, я нашел несколько лучший баланс между простотой и правильностью, чем слайд выше, который с треском проваливается.
person
Emmet
schedule
25.07.2014
ctrl-h MOV 10110110
для компов, для них одно и то же. Сборка как инструмент и концепция предназначена только для людей. - person Charles Clayton   schedule 26.07.2014