Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОАиП / Лаб раб _7 Часть1.doc
Скачиваний:
29
Добавлен:
01.03.2016
Размер:
66.05 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА №1

Первая программа для ОС GNU/Linux

1 Краткие теоретические сведения

1.1 Компилятор gcc

Средствами, традиционно используемыми для создания программ для открытых операционных систем, являются инструменты разработчика GNU. Проект GNU был основан в 1984 году Ричардом Столлманом. Целью проекта GNU была коллективная разработка комплекта программного обеспечения под единой лицензией, которая не допускала бы возможности присваивания кем-то эксклюзивных прав на результат этой разработки.

Одним из инструментов, созданных в рамках проекта GNU, является набор компиляторов GCC – GNU Compiler Collection. Создадим и откомпилируем с его помощью простую программу на С.

Создайте отдельный каталог hello - это будет каталог проекта. В нём создайте текстовый файл hello.c со следующим текстом:

#include <stdio.h>

Int main(void)

{

printf("Hello world!\n");

return(0);

}

Затем в консоли зайдите в каталог проекта. Наберите команду

gcc hello.c

Теперь посмотрите внимательно, что произошло. В каталоге появился новый файл a.out. Это и есть исполняемый файл. Запустим его. Наберите в консоли:

./a.out

Программа должна запуститься, то есть должен появиться текст:

Hello world!

Компилятор gcc по умолчанию присваивает всем созданным исполняемым файлам имя a.out. Если хотите назвать его по-другому, нужно к команде на компиляцию добавить флаг -o и имя, которым вы хотите его назвать. Давайте наберём такую команду:

gcc hello.c -o hello

Мы видим, что в каталоге появился исполняемый файл с названием hello. Запустим его.

./hello

Флаг -o является лишь одним из многочисленных флагов компилятора gcc. Некоторые другие флаги мы рассмотрим позднее. Чтобы просмотреть все возможные флаги, можно воспользоваться справочной системой man. Наберите в командной строке:

man gcc

1.2 Особенности создания программы

Язык С дает программисту значительный контроль над ходом выполнения, налагая тем самым на него дополнительную ответственность за корректное поведение программы. Расчет на квалифицированного программиста часто приводит к тому, что программы часто "подвешивают" компьютер, особенно у начинающих программистов. Выделим разновидности "зависания" по способу борьбы с ним.

* Простое - для выхода из него достаточно нажать Ctrl+C (сначала нажимается клавиша Ctrl и, НЕ ОТПУСКАЯ ее, нажимается вторая клавиша - C; отпускаются в любом порядке). Программа при этом аварийно завершается выходом в ОС.

* Мягкое - кажется, что машина никак не реагирует на клавиатуру и безнадежно зависла. Помните, в ЛЮБОМ случае, в ЛЮБОМ - работает ядро системы. Оно позволяет в таком режиме зависания использовать базовые функции для сохранения целостности данных. Этими функциями можно управлять при помощи так называемых Magic Keys (см. описание SysRq Keys).

* Жесткое - если зависло ядро ОС. Это может в случае использования тестового ядра, находящегося в разработке или при неправильной его ручной сборке Вами, или при попытке использовать недокументированные особенности аппаратного обеспечения. В этом случае поможет аппаратный сброс при помощи кнопки "Reset", расположенной на передней панели системного блока. Не нужно ВЫКЛЮЧАТЬ и включать ЭВМ. Вы как будущие разработчики аппаратуры должны знать, что она выходит из строя в основном при включении и выключении.

Важно помнить, что в 90% случаев зависание является простым. Чаще всего не хватает аппаратных возможностей компьютера для быстрой обработки данных и необходимо просто подождать или нажать Ctrl+C.

1.3 Процесс обработки программы

Простейший способ создания программ — с помощью утилит командной строки (хотя в GNU/Linux есть и универсальные интегрированные среды).

Весь процесс технического создания программы можно разбить на 3 шага (исключены этапы создания алгоритма, выбора структур данных и т.д.).

* Набор программы в текстовом редакторе и сохранение ее в отдельном файле. Каждый файл имеет имя и тип, называемый иногда расширением. Тип в основном используется для определения назначения файла. Например, программа на C имеет тип C, на Pascal - PAS, на языке ассемблера - ASM.

* Обработка текста программы транслятором. На этом этапе текст превращается в машинный код. Полученный машинный код называется выполняемым. Выполняемый файл обычно не имеет расширения в отличие от программ ОС семейства DOS и Windows. Этот этап называется КОМПИЛЯЦИЕЙ.

* Запуск программы. Если программа работает не совсем корректно, перед этим может присутствовать этап ОТЛАДКИ программы при помощи специальной программы - отладчика. При нахождении ошибки приходится проводить коррекцию программы, возвращаясь к шагу 1.

Рассмотрим, что именно делает программа gcc на шаге 2. Её работа включает три этапа: обработка препроцессором, компиляция и компоновка (или линковка).

Препроцессор включает в основной файл содержимое всех заголовочных файлов, указанных в директивах #include. В заголовочных файлах обычно находятся объявления функций, используемых в программе, но не определённых в тексте программы. Их определения находятся где-то в другом месте: или в других файлах с исходным кодом или в бинарных библиотеках.

Вторая стадия – компиляция. Она заключается в превращении текста программы на языке C/C++ в набор машинных команд. Результат сохраняется в объектном файле. Разумеется, на машинах с разной архитектурой процессора двоичные файлы получаются в разных форматах, и на одной машине невозможно запустить бинарник, собранный на другой машине (разве только, если у них одинаковая архитектура процессора и одинаковые операционные системы). Вот почему программы для UNIX-подобных систем распространяются в виде исходных кодов: они должны быть доступны всем пользователям, независимо от того, у кого какой процессор и какая операционная система.

Последняя стадия – компоновка. Она заключается в связывании всех объектных файлов проекта в один, связывании вызовов функций с их определениями, и присоединением библиотечных файлов, содержащих функции, которые вызываются, но не определены в проекте. В результате формируется запускаемый файл – наша конечная цель. Если какая-то функция в программе используется, но компоновщик не найдёт место, где эта функция определена, он выдаст сообщение об ошибке, и откажется создавать исполняемый файл.

Соседние файлы в папке ОАиП