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

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

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

Слайд


person Karim K.    schedule 25.07.2014    source источник
comment
Простой. Это объяснение в корне неверно.   -  person cHao    schedule 26.07.2014
comment
Где ты взял этот слайд? это совершенно неправильно.   -  person Mysticial    schedule 26.07.2014
comment
Ради интереса... Кто дал тебе эти слайды? Они настолько неправы, что это почти смешно   -  person Kris    schedule 26.07.2014
comment
Лектор мог иметь в виду управляемые языки (например, Java или C#), которые компилируются в машинно-независимый байт-код, который затем транслируется в собственный машинный код во время выполнения. Это, конечно, еще не оправдание для столь вводящего в заблуждение слайда.   -  person ComicSansMS    schedule 26.07.2014
comment
@ComicSansMS: Но тогда они не должны называть C++ в качестве примера на слайде.   -  person Bill Lynch    schedule 26.07.2014
comment
@Шарт Конечно. Слайды сейчас просто полная ерунда. Я просто пытался восстановить то, что могло побудить лектора сделать такие абсурдные заявления.   -  person ComicSansMS    schedule 26.07.2014
comment
Сборка произвольная для компов, это не более чем куча ctrl-h MOV 10110110 для компов, для них одно и то же. Сборка как инструмент и концепция предназначена только для людей.   -  person Charles Clayton    schedule 26.07.2014
comment
Если вы получили слайд от своего лектора, немедленно бросайте его.   -  person n. 1.8e9-where's-my-share m.    schedule 26.07.2014
comment
@н.м. Не сразу. Ударьте лектора перед уходом: P ... @_OP Ну, серьезно, ваша лекция может относиться к c++-cli вместо обычного c++.   -  person πάντα ῥεῖ    schedule 26.07.2014
comment
К сожалению, я узнал от своего доктора, что теперь я действительно сомневаюсь, что он доктор из университета... @πάνταῥεῖ ῥεῖ Я работаю над бомбой, больше не нужно беспокоиться о неправильных слайдах!   -  person Karim K.    schedule 26.07.2014
comment
@КаримК. Будьте осторожны, бросая бомбу или пытаясь дать пощечину своему учителю! Вы представили этот слайд без какого-либо дополнительного контекста. Это может иметь (некоторый) смысл в этом контексте. Но я бы все же сказал, что это не очень хорошее объяснение тому, чему док хотел вас научить.   -  person πάντα ῥεῖ    schedule 26.07.2014
comment
Попробуйте применить этот слайд к интерпретируемым языкам, таким как BASIC или LISP. Это не работает, потому что ОС не касается вашей программы, это делает интерпретатор.   -  person Thomas Matthews    schedule 26.07.2014
comment
@πάνταῥεῖ ῥεῖ i.imgur.com/vfpXVFn.png ... Вы все еще так думаете ? Кстати, я получил это из другого слайда.   -  person Karim K.    schedule 26.07.2014


Ответы (3)


Ваш слайд в основном неправильный...

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

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

person Bill Lynch    schedule 25.07.2014
comment
Каждая машина, такая как Toshiba, Dell или HP, имеет свой машинный код blabla (слева), также полный bs. - person quantdev; 26.07.2014
comment
Ну развеяли столько сомнений! Но у меня есть еще один вопрос, на который я не нашел ответа, в этой части Каждая машина, такая как Toshiba и Dell или HP, имеет свои собственные машинные коды, скажем, я пишу код C++, на каком этапе он преобразуется в машину -код, относящийся к (процессору Intel/AMD)? Разве у каждого процессорного семейства или бренда нет собственного машинного кода? - person Karim K.; 26.07.2014
comment
@КаримК. Как объяснил Шарт, каждая архитектура процессора имеет собственный набор инструкций по сборке. Apple Macintosh и HP могут использовать одну и ту же архитектуру с одними и теми же инструкциями, так что вы будете компилировать один и тот же код C++ на каждом и в конечном итоге получите одну и ту же сборку при компиляции. - person scohe001; 26.07.2014
comment
@ Джош, ты имеешь в виду выходной файл, когда сказал «Ассамблея» в конце своего комментария? Такое использование может добавить немного путаницы. - person Steve; 26.07.2014
comment
@КаримК. Кроме того, как только код скомпилирован в сборку, он затем собирается ассемблером, который создает двоичный файл, который ваш процессор может прочитать и выполнить. - person IllusiveBrian; 26.07.2014
comment
@Namfuak: ваша операционная система читает двоичный файл. Ваш процессор не знает, что делать с ELF, COFF и т. д. - person Bill Lynch; 26.07.2014
comment
@Namfuak: Ассемблерная часть даже не нужна - она ​​просто позволяет компилятору использовать существующий ассемблер (читай: быть ленивым) и облегчает людям просмотр того, что создается. Но вполне возможно пропустить этот шаг, и некоторые компиляторы пропускают его, если только вы не попросите их перевести код на ассемблер. - person cHao; 26.07.2014
comment
@Josh Итак, компилятор C ++ для, скажем, процессора x64 отличается от компилятора C ++ для процессора x32? - person Karim K.; 26.07.2014
comment
@КаримК. 'Итак, компилятор C++ для...' Да, серверные части, генерирующие машинный код, отличаются и должны быть указаны. Внешний интерфейс, обрабатывающий синтаксический анализ используемого языка, может остаться прежним. - person πάντα ῥεῖ; 26.07.2014
comment
@cHao: списки языков ассемблера очень полезны, особенно в области встраиваемых систем. Их можно использовать при оптимизации, чтобы увидеть, как компилятор генерирует код. Они также полезны для отладки, когда компилятор генерирует код, не соответствующий исходному листингу. - person Thomas Matthews; 26.07.2014

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

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

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

person tohava    schedule 25.07.2014
comment
+1 Это очень хорошо объясняет, что я сейчас подозреваю насчет этого слайда. - person πάντα ῥεῖ; 26.07.2014

Слайд во многом ошибочен.

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

  1. Предварительная обработка
  2. Компиляция «правильная»
  3. сборка
  4. Связывание

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

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

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

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

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

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

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

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

person Emmet    schedule 25.07.2014
comment
Небольшой комментарий: этап translation может преобразовывать операторы языка высокого уровня непосредственно в объектный файл или машинный код, пропуская этап языка ассемблера. Так делают многие компиляторы и трансляторы (из-за нетерпеливых людей и процессов сборки). - person Thomas Matthews; 26.07.2014
comment
Конечно, но это классическая разбивка в форме, которая кажется подходящей для уровня ОП. Если бы я добавил все «если», «и» и «но» и начал говорить о единицах перевода и IPO, это заняло бы не несколько абзацев, а как минимум одну книжную полку. - person Emmet; 26.07.2014