LINUX.ORG.RU

Компиляция

 ,


0

0

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

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

Азбука, понравилась и сама и перевод.

GAMer ★★★★★
()

В помошь студенту первокурснику?

los_nikos ★★★★★
()

>подробно объясняется ход процесса компиляции исходного текста в исполняемую программу.

Новость составлял петросян? :)

AX ★★★★★
()

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

onemore
()

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

Хорошо блин сказано :)

anonymous
()

Анонимусу не понравилось.

anonymous
()

хм сначала думал какая-то пионерия, но норм думаю многим понравится пригодится, хотя тема раскрыто не доконца

fura13 ★★★
()

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

anonymous
()

такое на 1-м курсе дается, хотя нет - это на и на 1-й курс не тянет, это статья для ПТУ-ников?

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

У Вас слишком лестные представления об уровне ПТУ-шников, по крайней мере, большинства из них. Ко мне приходят студенты, закончившие третий курс, и им именно такие вещи и приходится объяснять...

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

> такое на 1-м курсе дается нам не давалось и что? кто Вам сказал, что экономистам это на 1-ом курсе будет даваться? а на втором? а нахера это вообще экономистам в университете? а для общего развития или в личных интересах почему бы нет

anonymous
()

Наконец выяснил что i <=5 gcc заворчивает в одну ассемблерную команду(даже при нулевом уровне оптимизации), а некоторые программеры уверены что в две.

some_x
()

>как компилятор GCC проводит оптимизации

c опцией --fdump-tree-all можно конкретно посмотреть, на каких стадиях что оптимизируется, а данные статьи будут полезны разве что школьникам

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

>Наконец выяснил что i <=5 gcc заворчивает в одну ассемблерную команду(даже при нулевом уровне оптимизации), а некоторые программеры уверены что в две.

Если if (i<=5) это две команды, а если цикл, то при оптимизации по скорости как минимум три (mov+dec+jz/jnz)

anonymous
()

Ходил по ссылке.

Автору, переводчику и автору новости большое спасибо. Хорошие статьи.

AndreyKl ★★★★★
()

Для неспециалистов-начинающих — самое то.

Кто-нибудь может ответить на 2 вопроса по статье http://rus-linux.net/lib.php?name=MyLDP/algol/compilation/compilation-2.html ?

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

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

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

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

> Хорошо блин сказано :)

Это какбэ намёк, что оставшуюся часть занимает мусор и вирусы. ;-)

atrus ★★★★★
()

Единственный недостаток статьи: чтобы разобраться в абзаце про a.out и ELF нужно заранее это знать :)

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

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

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

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

А мне тоже понравилось. Хорошая статья.

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

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

большинство современных процессор ускоряют обработку инструкций с помощью конвейра, инструкции типа jmp появляющиеся при использование цикла опустошают конвейр и тем самым замедляют работу

anonymous
()

про стрейс хорошо сказано, давно его юзаю для диагностики любых программ, если встроенных средств логирования не хватает

gr_buza ★★★★
()

Клево. Авторам - спасибо!

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

По твоей "логике" любой начинающий "двоечник-недоучка", в том числе и ты когда тока начинал (если вообще начинал..)

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

> про стрейс хорошо сказано, давно его юзаю для диагностики любых программ, если встроенных средств логирования не хватает

Ты лучше прошивку от старого пятака дизассемблируй и перепиши на асме, а то новый покупать жаба душит ;)

Gharik
()

> extern int puts (__const char *__s);

> Здесь puts() объявлена как внешняя функция (extern), возвращающая целочисленной значение и принимающая массив постоянных символов в качестве параметра

Эээ, исправьте "массив постоянных символов". Это указатель на строку. Ключевое слово __const лишь указывает, что внутри puts() эта пересенная является константой.

> Результат трансляции можно увидеть с помощью ключа -S:

> gcc -S test.c

> Будет создан файл с именем test.s

Виндовс наша ОС?! gcc выдаёт файл test.S. Именно большая "S".

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

> инструкции типа jmp появляющиеся при использование цикла опустошают конвейр

Месье не в курсе про predictable execution?

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

> За "компиляцию" и "линковку" - не зачёт. Ибо "сборка" и "связывание".

С задних парт комменты двоечников не принимаются!
Устоявшаяся терминология - "компилляция" и "сборка". Это какой-то буржуй-недоучка назвал link, хотя по сути происходит именно assembling.

matumba ★★★★★
()

Пробежался по диагонали, натыкаюсь на фразу: "Я не силен в языке ассемблера, однако....". ГА-ГА-ГА! "И эти люди запрещают мне ковыряться в носу!". :)))))))

Как можно говорить о компилляции, если "не силён" в её базовой части? А мож там и не ассемблер вовсе, а какие-нть жабокоды! :)
Ладно, для начинающих сойдёт.

matumba ★★★★★
()

Пробежал глазами. Неплохо. Некоторым это может пригодиться.

Igron ★★★★★
()

Хорошие статьи на лоре? Фантастика!

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

>Виндовс наша ОС?! gcc выдаёт файл test.S. Именно большая "S".

Остынь красноглазик, маленькую "s" он выдаст, а большими "S" обычно именуют рукописные файлы

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

>Месье не в курсе про predictable execution?

вообще это называется branch prediction, умник

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

> про стрейс хорошо сказано, давно его юзаю для диагностики любых программ

Ыыыы... Я им искал конфиг с указанием местоположения шрифтов в RedHat 8 - первый в котором был gnome2/gtk2/fontconfig в качестве базовых компонентов DE.

no-dashi ★★★★★
()
Ответ на: комментарий от Killy

> За "компиляцию" и "линковку" - не зачёт. Ибо "сборка" и "связывание".

У Вас проблемы с терминологией, сэр?

Compiling -- компиляция

Linking -- компоновка (в старых материалах "связывание"; о том, почему сейчас так не говорят -- ниже)

Building -- сборка.

От термина "связывание" отказались, когда появился термин "binding" -- "привязка", который иногда переводится как "связывание". Однако это совсем не "linking", и решили не рисковать. Говорю с уверенностью по крайней мере по поводу микрософта и сана. У GNU, насколько мне известно, своей концепции локализации нет.

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

> Как можно говорить о компилляции, если "не силён" в её базовой части? А мож там и не ассемблер вовсе, а какие-нть жабокоды! :) Ладно, для начинающих сойдёт.

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

Orlusha ★★★★
()

> ... окружение Make ...

> ... линковка... линковщик...

> ... для организации и компиляции исходных файлов ...

> ... Линковщик Linux чрезвычайно мощный ... (вообще-то "имеет очень много возможностей" -- прим. Orlusha)

Злобственно... :(

Orlusha ★★★★
()

вопросы на тройку:
чем занимается /sbin/ldconfig
как работает PRELINK

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