Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уних (вопросы-ответы).doc
Скачиваний:
7
Добавлен:
23.04.2019
Размер:
394.75 Кб
Скачать

24. Принципы программирования в Linux, основные средства.

Linux обеспечивает полную UNIX-среду программирования, включая все стандартные библиотеки, программный инструментарий, компиляторы, отладчики, которые вы встречаете и в других UNIX-системах. В мире UNIX большинство приложений и системных программ делаются на Си или Си++. Стандартным компилятором для Си и Си++ в Linux служит GNU gcc, который является современным компилятором, поддерживающим много опций. Он способен компилировать Си++ (включая особенности AT&T 3.0 features) также, как Objective-C, другие объектно-ориентированные диалекты Си.

Кроме Си и Си++ многие другие компиляторы и интерпретаторы были перенесены в Linux, такие как Smalltalk, FORTRAN, Pascal, LISP, Scheme и Ada (если вы настолько мазохист, чтобы программировать на Аде - мы не будем вам препятствовать). В дополнение, существуют различные ассемблеры для написания кодов для защищенного режима 80386, а также любимые хакерами языки, вроде Perl (язык сценариев, как окончательный тупик или вершина для всех языков такого типа) и Tcl/Tk (shell-подобный командный язык, включающий поддержку разработки простейших приложений в X Window).

В Linux был перенесен продвинутый отладчик gdb, позволяющий пошагово выполнять программы в поисках ошибок или анализировать крах программ с помощью дампов памяти. gprof - утилита профилирования, показывающая, где ваша программа при выполнении тратит больше времени. Текстовый редактор Emacs позволяет осуществлять интерактивное редактирование. Другие инструменты, включая GNU make и imake используются для управления компиляцией больших программ; RCS - система для защиты и сопровождения исходных текстов.

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

Linux идеален для создания UNIX-приложений. Он обеспечивает современное программное окружение со всеми дополнительными погремушками. Поддерживаются различные стандарты вроде POSIX.1, позволяющие легко переносить программы, написанные для Linux, на другие системы. Профессиональные UNIX-программисты и системные администраторы могут использовать Linux для домашних компьютеров, а с них переносить написанные программы на компьютеры своей фирмы. Это может не только сэкономить много времени и денег, но и обеспечить комфортабельную работу на домашнем компьютере. (Автор использует дома Linux для разработки и тестирования X Window приложений, которые могут прямо транслироваться на любых рабочих станциях). Студенты, изучающие компьютерные науки, могут использовать Linux для обучения программированию в UNIX и изучения таких аспектов, как архитектура ядра.

Через Linux вы не только имеете доступ к полному набору библиотек и утилит, но также к исходным текстам ядра и библиотек.

C, Lisp и Perl являются традиционными языками программирования в системе GNU/Linux; Python, PHP, Java и C++ присоединились к их числу совсем недавно.

25. Создание, компиляция и отладка в Linux программ, написанных на C и C++.

Знакомство с компилятором GCC

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

GNU-компилятор с языка С gcc, содержит в себе 4 основных компонента, соответствующие четырем этапам преобразования исходного кода в исполняемую программу.

Первый компонент — это препроцессор, который модифицирует исходный код программы перед компиляцией в соответствии с командами препроцессора, содержащимися в С-программе. В соответствии с этими командами выполняются простые подстановки текста. Второй — собственно компилятор, который обрабатывает исходный код и преобразует его в код на языке ассемблера. Третий компонент — ассемблер, который генерирует объектный код. И, наконец, четвертый компонент — компоновщик, который собирает исполняемый файл из файлов объектного кода. Дело в том, что большие программы обычно пишутся по частям, в виде множества отдельных файлов, содержащих исходный код соответствующей части. Компилятор обрабатывает каждый такой файл отдельно и создает отдельные объектные модули (файлы таких модулей обычно имеют расширение o). Создание единой исполняемой программы из таких модулей и является задачей компоновщика. При таком подходе, если в какой-то модуль программист вносит исправление, нет необходимости заново компилировать всю программу: достаточно откомпилировать исправленный модуль и заново запустить компоновщик.

Одним из этих инструментов является компилятор GCC. Компилятор превращает код программы на "человеческом" языке в объектный код понятный компьютеру.

Компиляция программ производится командой:

gcc <имя_файла>

После этого, если процесс компиляции пройдет успешно, то вы получите загружаемый файл a.out, запустить который можно командой:

./a.out

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

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

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

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

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

Для сборки программ на C++ в наборе GNU имеется другой компилятор – G++. Он отличается от GCC тем, что по умолчанию подключает не стандартную библиотеку C, а стандартную библиотеку C++. Все флаги и опции у G++ такие же точно, как и у GCC.

Отладка

Любой компилятор по умолчанию снабжает объектный файл отладочной информацией. Компилятор gcc также снабжает файл такой информацией и на результат вы можете посмотреть сами.

Вся эта отладочная информация предназначается для отладки программы отладчиком GNU Debugger. Запустить его вы можете командой:

gdb a.out

При этом запустится отладчик и наша скомпилированная программа.

Компилятор gcc может создавать отладочную информацию в различных объемах и форматах, контролировать которые можно специальными ключами

Отладочная информация это конечно хорошо, но она может значительно увеличить объем вашего файла (в три-четыре раза). Для создания программ "релизов" существует отдельная программа, позволяющая удалить отладочную информацию из запускаемого файла. Называется эта программа strip. Для того, чтобы полностью очистить файл от отладочной информации, требуется вызвать ее с ключом -s:

strip -s a.out