Практикум «Оптимизирующие компиляторы» (на примере GCC) (1157417), страница 16
Текст из файла (страница 16)
ниже).Обычно файлы, обнаруженные этим способом являются архивнымифайлами, чьи элементы – объектные файлы. Линкер обрабатываетархивный файл, просматривая его в поиске элементов, определяющихсимволы, на которые были ссылки, но которые до сих пор неопределялись. Но, если оказывается, что обнаруженный файл – обычныйобъектный файл, то он линкуется в обычном порядке. Единственноеразличие между использованием опции -l и указанием имени файла в том,что -l добавляет lib и .a к library и ищет в нескольких каталогах.-IdirectoryДобавляет каталог directory в начало списка каталогов, используемыхдля поиска заголовочных файлов.
Опцию можно использовать дляподмены системных заголовочных файлов, подставляя собственныеверсии, поскольку эти каталоги просматриваются до каталогов системныхзаголовочных файлов. Если использована более чем одна опция -I,каталоги просматриваются в порядке слева направо; стандартныесистемные каталоги просматриваются в последнюю очередь.Практикум «оптимизирующие компиляторы»-LdirectoryДобавляет каталог directory в начало списка каталогов, используемыхдля поиска библиотек. Работа опции аналогична -I.Пример компиляцииПусть необходимо скомпилировать программу test.
Уже имеютсяобъектные модули foo.o и bar.o, причем модуль bar.o используетбиблиотекуz.Библиотекаz,расположенавкаталоге/usr/home/project/lib. Имеется так же файл test.c, использующийзаголовочные файлы из /usr/home/project/include. Команднаястрока для запуска GCC для описанного случая будет выглядетьследующим образом:$ gcc –o test –I/usr/home/project/include–L/usr/home/project/lib test.c foo.o –lz bar.oВ результате выполнения будет создан исполняемый файл с именем testПрактикум «оптимизирующие компиляторы»Приложение В. Каталоги GCCКорневой каталогINSTALLДокументация по конфигурированию и установке GCC.boehm-gcBoehm (имя собственное) сборщик мусора – часть Java Runtime Library.configДополнительные файлы для конфигурирования (добавляют некоторыефлаги в Makefile'ы в зависимости от архитектуры процессора иоперационной системы); обычно нужны для запуска autoconf.contribCкрипты, используемые разработчиками GCC.
См. contrib.fastjarРеализация команды jar; используется с Java front end.gccОсновной каталог gcc. См. Подкаталог gcc.includeЗаголовочные файлы для libiberty, библиотеки поддержки, используемойкомпилятором.libf2cПрактикум «оптимизирующие компиляторы»The Fortran runtime library.libffiБиблиотека libffi – часть Java runtime library.libibertyИспользуется для переносимости, а так же содержит некоторые основныеструктуры данных и алгоритмы; фактически, поддержка необходимыхопераций.libjavaThe Java runtime library.libobjcThe Objective-C runtime library.libstdc++-v3The C++ runtime library.maintainer-scriptsСкрипты разработчиков.
См. maintainer-scripts.zlibБиблиотека сжатия, используется Java front end'ом и в Java runtime library.contribanalyze_brprobЭтот скрипт используется для предсказания ветвлений. Применяютсяэвристический и hitrate подходы.compare_testsПрактикум «оптимизирующие компиляторы»Скрипт предназначен для автоматического тестирования некоторойутилиты и создания отчетов об этом тестировании.convert_to_f2cПереименовывает некоторые файлы из libg2c.convert_to_g2cПереименовывает некоторые файлы из libg2c.download_f2cЗагружает tarball netlib.gcc_buildАвтоматическая загрузка и сборка GCC.gcc_updateОбновляет локальное дерево CVS с репозитория GCC.gccbug.elПересылка отчета об ошибке gnats.gennewsАвтоматическое создание NEWS-файлов из он-лайн Release Notes.newcvsrootЗаменяет все файлы в CVS/Root и CVS/Repository.test_installedЗапуск тестов.test_summaryФормирует отчеты о тестировании и пересылает их.Практикум «оптимизирующие компиляторы»texi2pod.plПреобразует из texi в pod.warn_summaryСбор статистики при сборке GCC.Подкаталог gcc'language'Подкаталоги с описанием языков.
Подробнее см. 'language' (languageзаменяется на имя языка: cp, java, ada, f, objc и т.д.).configФайлы конфигурации для поддерживаемых архитектур и операционныхсистем. Подробнее см. config.docДокументация в формате Texinfo.fixincПоддержкакорректировкисистемныхзаголовочныхобеспечения работы с GCC.gincludeСистемные заголовочные файлы устанавливаемые GCC.intllibintl.poПоддержка различных языков.файлов;дляПрактикум «оптимизирующие компиляторы»testsuiteТесты GCC. Тестовая подсистема, поддерживаемая с помощью комплексаdejagnu.'language'config-lang.inОписание языка. Подробнее: стр. 30 GCC Internals.Make-lang.inlang-options.hОпции коммандной строки для fron end’а.lang-specs.hconfig'machine'Каталог с описанием архитектуры. Содержит machine.md, заголовки (hфайлы) и файлы с исходным текстом.
В данных файлах с помощью болееменее стройного метода описания gcc описываются разнообразныепроцессоры.Естественно,самые«продвинутые»описываются достаточно сложно и не в полной мере.оптимизацииПрактикум «оптимизирующие компиляторы»Приложение Г. LEX (FLEX)Лексический анализатор для GCC Front end генерируется при помощи Lex(FLEX). Lex предназначен для создания лексических анализаторов,которые могут использоваться вYacc.Входной язык содержит описания лексем в терминах регулярныхвыражений. Результатом работы LEX'a является программа на языке Си,которая читает файл yyin (обычно это стандартный ввод) и выделяет изнегопоследовательностисимволов(лексемы),соответствующиерегулярным выражениям.Рассмотрим способы записи регулярных выражений во входном языкеLex'а.
Алфавит Lex'а совпадает с алфавитом используемой ЭВМ. Символиз алфавита, естественно, представляет регулярное выражение из одногосимвола. Специальные символы (в том числе + - * ? ( ) [ ] { } | / \ ^ $ . < >)записываются после специального префикса \. Кроме того, применимы всетрадиционные способы кодирования символа в языке C. Символы ицепочки можно брать в кавычки:Примеры:• а "а" \а – три способа кодирования символа а• \n \t \007 "continue"• Имеется возможность задания класса символов:o [0-9] или [0123456789] – любая цифраo [A-Za-z] – любая букваo [^0-7] – любой символ, кроме восьмеричных цифрo .
– любой символ, кроме \nПрактикум «оптимизирующие компиляторы»Грамматика для записи регулярных выражений (в порядке убыванияприоритета):<р> : <р>* – повторение 0 или более раз<р> : <р>+ – повторение 1 или более раз<р> : <р>? – необязательный фрагмент<р> : <р><р> – конкатенация<р> : <р>{m,n} – повторение от m до n раз<р> : <р>{m} – повторение m раз<р> : <р>{m,} – повторение m или более раз<р> : ^<р> – фрагмент в начале строки<р> : <р>$ – фрагмент в конце строки<р> : <р>|<р> – любое из выражений<р> : <р>/<р> – первое выражение, если за ним следует второе<р> : (р) – скобки, используются для группировкиПримеры:[A-Za-z]([A-Za-z0-9]{0,7}) – идентификатор (имя) в языке C^#" "*define – начало #define в языке CПрограмма на входном языке Lex состоит из трех частей, разделенныхсимволами %%:Описания%%Правила%%ПрограммыПрактикум «оптимизирующие компиляторы»Раздел описаний содержит определения макросимволов (метасимволов) ввиде:ИМЯ ВЫРАЖЕНИЕЕсли в последующем тексте в регулярном выражении встречается {ИМЯ},то оно заменяется ВЫРАЖЕНИЕМ.
Если строка описаний начинается спробелов или заключена в скобки %{ ... }%, то она просто копируется ввыходной файл.Раздел правил содержит строки видаВЫРАЖЕНИЕ {ДЕЙСТВИЕ}ДЕЙСТВИЕ – это фрагмент программы на C, который выполняется тогда,когда обнаружена цепочка, соответствующая ВЫРАЖЕНИЮ. Действие,указанное в начале раздела без выражения, выполняется до начала разбора.Lex делает попытку выделить наиболее длинную цепочку из входногопотока. Если несколько правил дают цепочку одинаковой длины,применяется первое правило.
Так, при разборе по следующим правиламдля цепочки "123" будет применено первое правило, а для цепочки "123." –третье:[0-9]+(\+|\-)?[0-9]+(\+|\-)?[0-9]+"."[0-9]+Если ни одно из правил не удастся применить, входной символ будетскопирован в yyout. Если это нежелательно, в конец правил можнодобавить, например, строки:. {/* Ничего не делать */}\n { }Раздел программ может содержать произвольные тексты на C и целикомкопируется в выходной файл.
Обычно здесь записывается функцияyywrap(), которая определяет, что делать при достижении автоматом концаПрактикум «оптимизирующие компиляторы»входногофайла.Ненулевоевозвращаемоезначениеприводиткзавершению разбора, нулевое – к продолжению (перед продолжением,естественно, надо открыть какой-нибудь файл как yyin).Интерпретатор таблиц конечного автомата имеет имя yylex(). Автоматпрекращает работу (происходит возврат из функции yylex()), если в одномиз действий выполнен оператор return (результат yylex() будет совпадать суказанным в операторе) или достигнут конец файла и значение yywrap()отлично от 0 (результат yylex() будет равен 0).Традиционный пример входной программы для Lex'а – подсчет числа слови строк в файле:/***************** Раздел определений ****************//*NODELIM означает любой символ, кромеразделителей словNODELIM*/[^" "\t\n]int l,/* Число строк */w,/* Число слов */c;/* Число символов */%% /***************** Раздел правил ******************/{ l=w=c=0;/* Инициализация */}{NODELIM}+{ w++; c+=yyleng; /* Слово */}\n{ l++;/* Перевод строки */}.{ c++;/* Остальные символы */ }%% /*************** Раздел программ ******************/main() { yylex(); }yywrap() {printf(" Lines - %dl, w, c );return( 1 );}Words - %d Chars - %d\n",Практикум «оптимизирующие компиляторы»Внутри действий в правилах можно использовать некоторые специальныеконструкции и функции Lex'а:yytext– указатель на отождествленную цепочку символов, терминированнуюнулем;yyleng– длина этой цепочкиyyless(n)– вернуть последние n символов цепочки обратно во входной поток;yymore()– считать следующие символы в буфер yytext после текущей цепочкиyyunput(c)– поместить байт во входной потокECHO– копировать текущую цепочку в yyoutПрактикум «оптимизирующие компиляторы»Приложение Д.