GCC - The Complete Reference (537669), страница 30
Текст из файла (страница 30)
Сама документация стандартов предоставляет разработчикам компиляторов большую свободу действий, многое оставляя на их усмотрение. Все компиляторы Гол)лап действуют в основном одинаково, но каждый из них поддерживает свой собственный диалект. Базовая компиляция В таблице 7. ! приводится список типовых суффиксов имен файлов, которые так или иначе связаны с компиляцией и компоновкой (!)пЫля) программ на языке Гол)гад. Полный список распознаваемых ОСС суффиксов приведен в приложении Г.
Таблица 7.1. Суффиксы имен файлов, связанные с языкам Рогстад Суффвввм Свлврмвввв Фввлв .а Статическая объектная библиотека <архив). Л, Лог, .РОВ Исходный код на языке Рог)ген, не подлежащий предобработке. .Е, Лрр, .РРР Исходный код на языке Рог)гап, подлежащий обработке препроцессором.
.о Объектный файл в формате, пригодном для передачи его компоновщику (анкет). Глава 7. Компиляция программ иа языке Рог(гап 137 Исходный код на языке Рог(гап, предназначенный для предобработки препроцеасором КАТРОЙ. Разделяемая (дииамическая) объектная библиотека.
ва Преобразование отдельного исходного файла в готовую машинную программу При написании программы на традиционном Рог(гад используются только заглавные буквы. Первые шесть позиций символов каждой строки зарезервированы для специальных целей. Первый столбец отводится для символа "с", указывающего строку комментария. Столбцы со второго по шестой зарезервированы для меток. Код операторов начинается с седьмой позиции. Вот пример программы на языке Ромгал, написанной с применением фиксированного формата (также называемого нградициамгым): С Ье11оиог1б. В с РКОСКЛМ НЕЬЬОИОКЬП ив*те( ,1о) 10 РОКМАт('Ье11о, иог16') еьо Ркосклм неьготгокьэ Компилятор ОСС не требует строго использования только заглавных букв, однако соблюдение правил форматирования обязательно, если они прямым образом ве отменены указанием соответствующей опции.
По следующей команде булет выполнена компиляция программы в готовый к выполнению машинный код: 3 д77 Ье11оиог1б.г -о Ье11оиог16 Команда д77 запускает драйвер верхнего уровня дсс, который создает среду окружения, необходимую для компиляции программ на языке лог(гоп, Тот же результат МОжЕт быть получен при использовании ст(вдующей комаиды; 3 дас Ье11оиог1б.х -1ггаЬед1п -1дзс -1га -еЬагеб-11Ьдсс -о Ье11оиог16 Библиотека 11ЫгсЬед1п.
а (задействуемая опцией 1йгсЬедйп) содержит код инициализации и завершения, необходимый для правильного выполнения в операционной среде программы на языке )сот(гал. Библиотека 11Ьд2с. а содержит основяые подпрограммы, необходимые во время выполнения, такие как ввод и вывод. Библиотека 11Ьм.а является системной математической библиотекой. Опция аЬаге(Т-11Ьдсс указывает, что используется разделяемая (зйагед) версия стандар- тноМ библиотеки 11Ьдсс. ССС также позволяет компилировать гог(гал-код свободного формата.
Комментараи отмечаются восклицательным знаком ("! ") в начале строки н продолжаются д) конца строки. Версия предыдущей программы, написанная в свободной форме, ложат иметь операторы и метки, начинающиеся с произвольной позиции: 1 38 Часть!!. Использование Сборного Компилятора ! Ье11оиое1г)хх.т ! Ртодевв Не11оиое16 ие1ее(*,10) 10 Еохвас ( 'Ье11о, иое10' ) еп(( Рсодевв Не11оиоетс Эта программа может компилироваться так же, как и программа предыдущего примера, только в командную строку следует добавить опцию -аггее-йохв; а д77 -Геее-тоев Ье11оиое1сст.т -о Ье11оиоетсвх Из-за принципиальных различий между двумя этими синтаксическими формами следует писать программы либо в свободной форме, либо в фиксированном формате.
Трудно написать программу, которая будет компилироваться в любом варианте формата Рог(гав, потому что различия в синтаксисе комментариев и правилах общего расположения весьма существенны. Преобразование нескольких исходных файлов в исполняемый файл Команда д77 способна компилировать и компоновать несколько исходных файлов на языке Рог!гоп в отдельную машинную программу. В следующем примере программа, исходный текст которой сохранен в файле с именем са11ет. б, выполняет один вызов математической функции и выводит ее результат: С са11ев.т с Ркодклм саььек 1 = Та.тееадеоа(10,20,83) Иихтв(*,10) Атееаде= , 1 10 РОКМАт('А, 15') ЕНП РКООКАИ САЬЬЕК Реализация функции 1атекаде находится в отдельном исходном файле с именем са11еб. б: С са11еа.т с хитвдЕК Ррнстхан хатесадеот(1,3,К) хамееадеов = (1 + 3 + К) / 3 кетпкн енр Ртгнстхон ха.
есадеое Эти два исходных файла компилируются и компонуются в исполнимый файл са11ет следующей командой: Ф д77 са11ег.т са11ед.а -о са11ее Того же результата можно достичь за три действия. Сначала создать объектные файлы для каждого исходного, и затем скомпоновать их в готовую к запуску программу: Глава 7. Компиляция программ на языке гог(гап 1 39 3 д77 -с са11ег.г -о са11ег.о 3 д77 -с са11ег).г -о са11ег).о 3 д77 са11ег.о са11ес.о -о са11ег Генерирование ассемблерного кода Опция -3 указывает компилятору д77 выработать код на языке ассемблера и на этом остановиться. Для выработки ассемблерного кода из исходного файла )ге11оиог1с). й — ранее использованного в этой главе примера, нужно ввести слевуюшую команду: 3 д77 -В )хе11оиог1с.г Выходной ассемблерный файл будет иметь имя Ье11омог1б.
в. Разновидность ассемблерного языка зависит от текущего или назначенного типа целевой платформы компиляции. Предобработка При компиляции Роптал-программы из файла с суффиксом имени . р, . нрр, или .урн, она будет вначале подвергнута предобработке и только затем скомпилирована. Применяемый при этом препроцессор (ргергосеввог), описанный в главе 3, первоначально предназначался для работы с программами на языке С. В следующем примере программа, написанная в свободной форме Рог(гав, использует препроцессор для включения кода функции в главную программу. ( ечепир.в ! Вг)егвпе ПООнрцр В1пс1иг)е 51гиегипс.Ь" 1 ргодгап ечепир ао ЗОО 1=11,аг з = 1гие(1) аггее( ,1О) 300 сопсвпие 10 когпае(15,15) епг) ргодгат е гевар Исходный код функции 1гие () находится в файле с именем 1гиенипс.Ь и будет компилироваться по-разному, в зависимости от того, определен ли макрос вопмрцр.
Эта функция округляет любое нечетное число до четного. По умолчанию функция округляет к ближайшему четному числу в сторону уменьшения, но если макрос с именем ио()нрпр определен, то функция будет увеличивать передаваемое в аргументе число до ближайшего четного. Ниже приводится код тела функции 1пге(): 1пгедег гипсг1оп 1гие(1) / 2 в=к*в 1В (1 .Ва. К) Енеп 1гие = 1 140 Часть (!. Использование Сборного Компилятора е1ве №асаеа нооирор 1гпе = 1 + 1 №е1ве 1гпе 1 — 1 №епа1г епа 1г епа гппсп1оп 1гпе Следующая командная строка скомпилирует эту программу в исполняемый файл ечепир: 3 д77 -гггее-гоге ечеппр.Р -о.ечеппр Нет необходимости в программах свободной формы специально применять такое форматиование, которое учитывает использование препроцессора.
Поскольку препроцессор убирает директивы и передает на компиляцию только результирующий код, следующая программа также имеет вполне приемлемый код: С вааег.Р с №аег1пе ВЕЧЕИ 7 №аег1пе И1ИЕ 9 с ргодгвв еааег 1вшп = ВЕЧЕИ + Итнв иг1ее(*,10) 1вап 10 Еогвве(15) епа ргодгев аааег Создание и использование статической библиотеки Статическая библиотека объектных модулей создается компиляцией исходного кода на языке Рог(гол в файлы . о и последующим применением утилиты аг для сохранения этих файлов в архиве.
Архив — это другое название статической библиотеки. В следующем примере демонстрируется построение объектной библиотеки. В ее состав входят две отдельные функции, вызываемые одной основной программой. Первая функция 1швхашшп() находится в файле аввхавпв. й„она возвращает наибольшее нз трех передаваемых ей целых чисел: с 1швх1вшп. г с 1ИТЕОЕЕ РПИСТХОИ 1ввХ1впв(1,з,х) 1гег = 1Р () .де. 1гее) 1гег = ( 1Р (3 .де.
1гег) )гет. = И 1ввх1пшв = 1гег еепчзви ЕИР РОИСттси 1швх1вшп Глава Ч. Компиляция программ на языке Еог(гап 141 Вторая функция 1шйпщвща() находится в файле 1ш1ппшпш. Е, она довольно похожа на первую, но только возвращает наименьшее из передаваемых ей трех целых чисел; С 1в1п1ииаа. 1 с хитеаен Ромстхом 1в1п1впв(1,2,)г) 1хес = 1 ХР (3 .10. 1хеа) 1хес = 1 ХР (1 .ХС. 1хес) 1хес = А 1в1п1вша 1хее ВЕ'Л)ВИ ЕМО РПИСтХОМ лв1п1вша Приведенные ниже три команды компилируют эти две функции и сохраняют полученные из них объектные модули в библиотеке с именем 11Ьшйша.
а: 5 077 -с 1в1п1впв.к -о 1в1п1вшв.о 1 077 -с 1вах1вив.к -о 1вах1вшв.о 1 ак -х 11Ьв1ва.а 1вах1вшв.о 1в1п1вшв.о Опция -с команды д77 указывает компилятору выполнить комПИЛяцИЮ исхОдного файла в обьектный, не задействуя затем компоновщик. Использование утилиты ах с опцией -1 создаст новую библиотеку с именем 11Ьшхша. а, если такой библнотеки еще не существует. Если библиотека уже есть, то входящие в ее состав ебьехтные файлы будут заменены новыми версиями файлов, указанных в командной строке. Далее приведенная программа вызывает две функции, сохраненные в библиотеке, н выводит их результат: С в1гааах. л с РНООВ7ГМ М1ИМАХ ИН1тв(*,10) 'мах1вав=', 1вахлвша(10,20,30) инхте(*,10) 'М1п1авпа=', 1вап1ишв(10,20,30) 10 Ровмат(А,15) ЕМО РНОаВАМ МХИМАХ Программа может быть откомпилирована и скомпонована статически с функцилмн хранящимися в библиотеке 11Ьшхша.
а СЛеДУющей командой; 5 077 в1пвах. и 11Ьв1ва. а -о в1пвах Компилятор распознает шйшаах. й как исходный файл на языке Рог(гол. Этот файн компилируется в объектный код. Затем компилятор компонует программу, Сообщая компоновщику имя библиотеки 11.Ьшфша.а. Создание разделяемой библиотеки Создание разделяемой библиотеки очень похоже на созданию статической. Только ебьектные файлы, сохраняемые в разделяемой библиотеке, должны компилироватьсл с опцией -йр10 или -РРХС. Необходимо, чтобы код объектных модулей мог ди- 142 Часть!1.