Информатика ← ЛабораторныеЛабораторная работа №8

Система программирования на языке Си

Цель работы

Изучение конкретной системы программирования на Си и получение навыков подготовки текстов и отладки программ.

Ход работы

Компиляция программ состоит из следующих стадий:

  • препроцессирование;
  • трансляция в ассемблер;
  • ассемблирование;
  • компоновка.

Препроцессирование

Препроцессор просматривает входной .c файл, исполняет в нём директивы препроцессора, включает в него содержимое других файлов, указанных в директивах #include и пр. В результате получается файл, который не содержит директив препроцессора, все используемые макросы раскрыты, вместо директив #include подставлено содержимое соответствующих файлов. Файл с результатом препроцессирования обычно имеет суффикс .i, однако после завершения трансляции все промежуточные временные файлы удаляются, по- этому такой файл, как правило, никогда не виден пользователю. Результат препроцессирования называется единицей трансляции.

gcc -E
Остановиться после препроцессирования. Результат работы препроцессора выводится по умолчанию на стандартный поток вывода. Имя выходного файла можно указать с помощью опции -o. При этом если в командной строке указано несколько файлов, то в выходной файл будет помещён результат препроцессирования последнего файла.

Трансляция в ассемблер

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

gcc -S
Остановиться после трансляции в ассемблер. По умолчанию имя выходного файла получается из имени входного файла заменой суффикса .c или .i на суффикс .s. Явное имя выходного файла можно указать с помощью опции -o. Попытка использования опции -o и нескольких имён входных файлов вызывает сообщение об ошибке.

Ассемблирование

На этой стадии работает ассемблер. Он получает на входе результат работы предыдущей стадии и генерирует на выходе объектный файл. Объектные файлы традиционно имеют суффикс .o. Программа-ассемблер в системах Unix обычно называется as.

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

Компоновка или линковка

Компоновщик получает на входе объектные файлы для каждой единицы трансляции, из которых состоит программа, подключает к ним стандартную библиотеку языка Си и библиотеки, указанные пользователем, и на выходе получает исполняемую программу. В системах Unix исполняемые двоичные программы не имеют никакого специального суффикса, например, оболочка-драйвер для компилятора GNU C называется просто gcc. Компоновщик (редактор связей) в системах Unix обычно называется ld.

Компиляция целиком

Если ни одной из перечисленных выше опций не задано, выполняются все стадии трансляции. Имя выходного файла по умолчанию равно a.out, но может быть изменено с помощью опции -o.

gcc -o pr
Позволяет задать явное имя выходного файла для любой стадии трансляции.

Ключи компиляции

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

gcc -pedantic -std=c99
Заставляет компилятор сообщать об ошибках или выдавать предупреждения о несоотвествии стандарту языка.

gcc -v
Болтливый режим, компилятор выдает весь лог работы.

gcc -g
Включает генерацию отладочной информации в исполняемую программу. Наличие отладочной информации позволяет отлаживать программу в терминах исходного языка, а не машинного кода. Нужен для дальнейшей работы с gdb.

Пример

gcc fibonacci.c count.c -o rabbits

компилирует два файла на языке Си fibonacci.c и count.c, объединяя их в одну программу с именем rabbits.

Ссылки

Оригинальный текст лабораторной