One morning you wake up find out you have access to God’s developer console. What’s the first thing you do with this power?
Discussion
♦ 154 + W 479 & Share
^ BEST COMMENTS ▼
I like forks • 5h
hehe3301 • 7h
sudo rm -rf oceans/*/contents/
*.plástic
sudo rm -rf people/*/*.cáncer sudo rm -rf v
Проходит. Только незаметно.
Когда дело доходит до кодогенерации под целевой процессор - да, прямо в машинные коды.
> Проходит. Только незаметно.
Нет. Это было на заре развития, когда компилятор C генерировал ассемблерный листинг и скармливал его ассемблеру для кодогенерации. Это время давно прошло.
Вообще "ассемблер" это жаргонизм, если это слово используют, подразумевая "язык ассемблера".
Язык ассемблера это низкоуровневый язык программирования, в котором используются символьные имена инструкций, операндов, констант, макросы и многое другое, чего просто не существует на уровне машинного кода.
А непосредственно (макро-)ассемблер это программа, которая транслирует программу на своём языке (языке ассемблера) в объектный код. В комплекте с ассемблером обычно поставляется компоновщик, который позволяет объединять сгенерированные ассемлером файлы объектного кода в библиотеки. А так же редактор связей (линкер), который из объектного кода и, возможно, библиотек создаёт исполняемый файл.
я в своё время писал на х86-ассемблере напрямую в debug.com, там всё было вполне однозначно.
"компилятор C генерировал ассемблерный листинг и скармливал его ассемблеру для кодогенерации" - имеется в виду, что раньше ты писал код на С (что-то типа
int x = 0; x = x+1;),
он переваривал его в ассемблер (что-то типа
org 100h
mov dx,msg
mov ah,9
int 21h
mov ah,4Ch
int 21h
msg db 'Hello, World!',0Dh,0Ah,'$'),
который потом превращался в машинный код, который я записать не могу, но выглядит он как-то так:
00100101
10100100
01110101
...
Сейчас же С просто сразу все превращает в 0 и 1.
На уровне ЯВУ невозможно, потому что оптимизации зависят от процессора. На уровне машинного кода?
Например, если программа выполняет арифметические действия без побочных эффектов и результат записывает в переменную и потом никогда её не читает (локальная переменная функции и выход из функции после вычислений), то всё это вычисление можно соптимизировать нафик.
Оптимизации, которые зависят от процессора, выполняются непосредственно перед кодогенерацией. Вообще у компилятора дофига разных этапов обработки исходника: лексический анализ, семантический, оптимизации разные. Кодогенерация самый последний этап непосредственно компиляции. Потом там ещё полученный объектный код может причёсывать, выкидывая из него статические глобальные переменные, к которым нет обращений и тому подобное.
А именно часть "Компили́ровать — проводить трансляцию машинной программы с предметно-ориентированного языка на машинно-ориентированный язык"