LINUX.ORG.RU

Компиляция

 ,


0

0

В заметке "Как происходит компиляция" (автор Mike Diehl, перевод А.Тарасова) подробно объясняется ход процесса компиляции исходного текста в исполняемую программу. В первой части рассмотрены этапы компиляции, выполняемые компилятором GCC - обработка препроцессором, трансляция, ассемблирование и линковка. Во второй части процесс линковки рассмотрен более подробно. Также описаны системные вызовы Linux и то, как компилятор GCC проводит оптимизации.

>>> Подробности

Хотелось бы подробностей, как внутри устроен GCC. И как прикрутить свой фронтенд к кодогенератору GCC, вроде такого:http://languagemachine.sourceforge.net/gcc_interface.htm, + сравнение кодогенераторов GCC/LLVM/whatever

anonymous
()

А как собрать программку с другим libc? "заменить C runtime library" по умолчанию. Почему при сборке хелловорда линкуется с /lib/libc.so.6, как собрать с http://www.fefe.de/dietlibc/, например, и т.п.

anonymous
()
Ответ на: комментарий от question4

> 1. Зачем компилятор разворачивает цикл в 5 команд печати?

man unroll loops. jmp -- неудобная для кеша команда, "размотанные циклы" без jmp'ов работают быстрее.

> 2. В последней программе подряд идут pushl %ecx и popl %ecx. Зачем они нужны?

man stack frame, frame pointer.

хотя тема кодогенерации gcc не раскрыта, похоже на лишние инструкции. Многие пишут, что кодогенератор у gcc 2.93/gcc 3 получше, чем у gcc 4 -- "лишних инструкций" меньше.

anonymous
()
Ответ на: комментарий от Crew

> Последовательные команда быстрее цикла, т.к. не нужно помнить адрес возвращения в начало цикла и переходить туда.

потому что переход может сбросить кеш (или не сбросить, если сработает branch prediction). В целом, jmp и шитый код не удобны для кеша.

anonymous
()
Ответ на: комментарий от anonymous

> Классику надо читать. http://lib.mexmat.ru/books/2444

1986 год, при всём уважении к классикам. Сейчас можно посоветовать "Modern Compiler Implementation"
http://www.devincook.com/goldparser/articles/other-parsers.htm
, почитать в википедии про Packrat , PEG http://en.wikipedia.org/wiki/Parsing_expression_grammar , монадические парсеры,Tom, GLR парсеры и т.п
http://en.wikipedia.org/wiki/Comparison_of_parser_generators .

anonymous
()
Ответ на: комментарий от Orlusha

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

в православном GCC тоже есть промежуточный язык, из которого потом генерируется ассемблер конкретной целевой платформы. Это всё равно компиляция, хоть на входе будут и жаба с валой -- всё равно генерится сразу или трансляцией через си промежуточное представление, потом уже на выходе конкретный ассемблер. В итоге, чтобы перенацелить на новый процессор, не надо переписывать кодогенератор -- достаточно задать описание команд этого нового процессора на своём языке. Сравните, например, кодогенераторы OpenWatcom и GCC.

anonymous
()
Ответ на: комментарий от anonymous

> почитать в википедии про Packrat , PEG... [много умных слов skipped]

А нельзя ли более сжато тыкнуть на современные методы компилляции? Все эти восходящие грамматики, парсеры-распарсеры конечно интересно, но только в узких кругах широкой академической среды. Нам бы что-то, что уже доказанно превосходит другие техники и является перспективным подходом. Пожалуйста. :)

matumba ★★★★★
()

Сцуки! Я даже по сцылке кликнул. Довели.

anonymous
()
Ответ на: комментарий от dk2

>одна: loop

а как же присвоение счетчика ecx? так что как минимум две

anonymous
()
Ответ на: комментарий от anonymous

>> подряд идут pushl %ecx и popl %ecx

> хотя тема кодогенерации gcc не раскрыта, похоже на лишние инструкции. Многие пишут, что кодогенератор у gcc 2.93/gcc 3 получше, чем у gcc 4 -- "лишних инструкций" меньше.

То самое, что Торвальдс назвал "вставляет мусор"?

question4 ★★★★★
()
Ответ на: комментарий от question4

>одна: loop

хм..
когда я на асме проги писал loop была медленней чем:

@@1:
...
dec ax
jnz @@1

сейчас что, уже нет?

anonymous
()
Ответ на: комментарий от matumba

>Нам бы что-то, что уже доказанно превосходит другие техники и является перспективным подходом. Пожалуйста. :)

голова и руки. не за что.

anonymous
()
Ответ на: комментарий от anonymous

>Если if (i<=5) это две команды, а если цикл, то при оптимизации по >скорости как минимум три (mov+dec+jz/jnz) как минимум две. mov мог сделаться задолго до начала цикла и его можно не считать (действительно - зачем его считать, если он исполняется 1 раз а dec + jnz 20 миллионов раз?)

anonymous
()
Ответ на: комментарий от anonymous

> когда я на асме проги писал loop была медленней чем:

>@@1:

>...

>dec ax

>jnz @@1


> сейчас что, уже нет?


Неоднокрано слышал сетования ассемблерщиков, что зависит от процессора. Вплоть до того, что на 3-м пентиуме выгодно одно, на 4-м — другое. Не проверял.

question4 ★★★★★
()
Ответ на: комментарий от anonymous

>>Нам бы что-то, что уже доказанно превосходит другие техники и является перспективным подходом. Пожалуйста. :)

> голова и руки. не за что.


Да пытался уже! Лучше обычного конечного автомата пока не нашёл.
Хотя может это и есть идеал. :)

matumba ★★★★★
()
Ответ на: комментарий от question4

просто dec/jnz распараллеливаются по UV-пайпам и выполняются одновременно, за 1 такт. А loop чуть медленнее и требует ecx

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.