LINUX.ORG.RU

Этапы сборки программы

 


0

1

Чуваки, объясните, почему в одних источниках утверждают что сборка программы состоит из препроцессинга, компиляции и ассемблирования, и компановки, а другие утверждают, что имеет место быть препроцессинг, компиляция и компановка. Но дело в том что они описывают ассемблирование, как преобразования текста программы понятный человеку в машинный код. А компиляцию они описывают, как преобразования текста на Си ,к примеру, в текст на assembler AT&T. И если выкинуть Ассемблирование, то не произойдет преобразование текста в машинный код.

Где кто обманывает?


Кинье ссылку на литературу чтобы углубиться в знаниях по работе Gcc. Чтобы понять что такое таблица символов, и прочее

LGH
() автор топика

смотря что такое тут сборка. в академической традиции сборка это linking, и делают его линкеры, они же сборщики, они же компоновщики. задача сборщика - из обьектных файлов(выхлопа комплятора) собрать загружаемый образ программы, повычислив всякие адреса, что вычисляются только на этапе сборки, и не могут быть вычислены при компиляции. например адреса точек входа в функции из других модулей, адреса переменных оттуда же и проч.

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

alysnix ★★★
()

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

Тут вопрос традиции, не обмана.

Компоновка пишется через «о». И это единственная из перечисленных тобой стадий, которая в случае gcc обычно явно вызывается раздельно (из мейкфайла при этом вызывается тот же gcc со специальным ключом, и ему скармливается список готовых объектных модулей, gcc вызывает компоновщик (линкер), на выходе получается готовый двоичный файл.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

препроцессинг не во всех языках есть. вот если есть в языке препроцессирование и директивы препроцессора, то он есть…а если их нет…то его стало быть и нет.

ассемблирование есть там, где компилятор генерит ассемблерное представление, а не какое-то иное.

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

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

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

LGH
() автор топика
Ответ на: комментарий от alysnix

Я упомянул в тексте Си…. извините, что ненастолько явно, чтобы было понятно. Сори вобщем

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

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

Когда я делаю

gcc file.c -S 
Это компиляция?

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

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

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

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

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

Потому что по определению перевод текста из на высокоуровневом языке в машинный-это ассемблирование. Значит ассемблирование имеет место всегда на Си?

ты типа с ума сошел. ассемблирование это перевод из текста на языке ассемблера в бинарный код. если нет текста на ассемблере то нет и асемблирования. что такое ассемблер - смотри определения.

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

Значит стадии сборки программы это препроцессинг, ассемблирование, и компановка? Так?

не так. препроцессинг(хотя это детали), компиляция, компоновка. «ассемблирование» зависит от метода реализации кодогенерации в компиляторе. можно генерить сразу в бинарный код, можно в какое-то общеупотребительное промежуточное представление для которого есть простые способы преобразования в бинарный код. например текст на асме, ir llvm, или еще что.

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

можешь запустить gcc с ключом -S и посмотреть на этот ассемблерный текст

при LTO ты там не увидишь того, что ожидаешь

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

компановка

КомпОновка.

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

Ну и что-то похоже, тебя тянет на схоластику. В большинстве случаев вопрос о наличии ассемблерного представления не сильно важен. Пиши код. Практика, практика!

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

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

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

один из путей понять есть ознакомление с эволюцией метода.

  1. были схемы физической коммутации

  2. появление хранимой в стираемой/переписываемой памяти состояний сообразно которым шло исполнение процесса вычисления.

  3. занос тумблерами в память указанных в п.2 .

  4. появление программы которая транслировала знаки с ленты в память состояний - это Грэйс Хопер и первые флоуматики

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

  1. появление в трансляторах(а скорее поглощение трансляторами появивщихся предтрансляторов возможности препроцессинга ибо сам препроцессинг это предварительная трансляция во вход исходного транслярора некоторой «скорописи»

  2. появление перемещяемых(в дополнение к уже используемым абсолютным объектным) объектных кодов - что позволяем сделать отдельный этап сборки - в виде линковки.

зы. само слово ассемблирование - есть сборка.

  1. выделение из трансляции двух крайностей и игра с их сочетаниями - компиляция как трансляция завершённого входа и интерпретация как эмуляция расширенной интерпретатором(транслирующим «одностроки») исходной машины A в расширенную машину A’

  2. при появлении возможности/необходимости свёртка двух последовательных трансляций в одну - в частности компиляция исходного языка с разу либо в перемещаемые обьекники(характерно для Сишек) либо сразу в исполняемый код ( ТурбоПаскали) - и там и там было модно выбрасывать этап ассемблерных листингов ибо это зверинец микромашин.

  3. всяческие жид-компиляции которые делали компиляцию в рассрочку. (P-code, смолтоки селфы, суперкомпиляции и прочая прочая , хот-споты и т.п.)

..to be continue in XXII centure

qulinxao3
()
Ответ на: комментарий от LGH
$ man gcc
-c  Compile or assemble the source files, but do not link.  The linking stage simply is not done.  The ultimate output is in
           the form of an object file for each source file.

           By default, the object file name for a source file is made by replacing the suffix .c, .i, .s, etc., with .o.

           Unrecognized input files, not requiring compilation or assembly, are ignored.

       -S  Stop after the stage of compilation proper; do not assemble.  The output is in the form of an assembler code file for each
           non-assembler input file specified.

           By default, the assembler file name for a source file is made by replacing the suffix .c, .i, etc., with .s.

           Input files that don't require compilation are ignored.
anonymous
()
Ответ на: комментарий от anonymous

Я просто хотел понять, чтобы не плавать в понятиях...

Если суммировать все что тут имеется из написанного , то еомпиляция компиляция-это преобразования текста программы на языке программированмя в машинный код. А Ассемблирование, -это преобразования текста на Ассемблере в машинный код.

gcc file.s 



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

Но если

gcc file.c


То будет компиляция и компоновка, но этапа ассемблирования не будет.

Наверное опять тупанул. Сори конечно, что понял ваши объяснения криво

LGH
() автор топика

Чтобы точно сказать что делает конкретная реализация конкретного языка программирования надо просто посмотреть его исходный текст. Никто не обманывает, просто это высказывания разной степени точности.

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

Никто не обманывает, просто это высказывания разной степени точности.

Во! Анонимус сформулировал точнее, чем я.

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

Ок. Скажите тогда еще, чтобы не заводить отдельную тему, что для компилятора gcc нижнее подчеркивание в именах функций? Погуглил, но как всегда ясного ответа не увидел

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

Работают так же, как буквы. Но имена, которые начинаются с двух нижних подчёркиваний, и имена, начинающиеся с подчёркивания и большой буквы, стандарт резервирует для реализации языка. (Это значит, что компилятору разрешается использовать любые такие имена для чего угодно и не беспокоиться, что ваша программа их определяет для себя.)

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

почему конкретного языка, конкретного компилятроа

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

Погуглил, но как всегда ясного ответа не увидел

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

int _; 

тут объявлена переменная с именем _.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 2)
Ответ на: комментарий от alysnix

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

anonymous

Вроде теперь немного все увязалось

Спасибо всем

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