Большие программные проекты

Для создания операционной системы каждый файл с расширением .c с помощью компилятора C превращается в объектный файл. Объектные файлы, имеющие имена, заканчивающиеся символами .o (.o-файлы), содержат двоичные инструкции для целевой машины.
Позже они будут непосредственно выполняться центральным процессором. В мире C нет ничего подобного байтовому коду Java или Pyton.

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

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

К счастью, компьютеры прекрасно справляются именно с задачами такого рода. В UNIX- системах есть программа под названием make (имеющая многочисленные варианты, например gmake, pmake и т. д.), читающая файл Makefile, в котором описываются зависимости одних файлов от других. Программа make работает следующим образом. Сначала она определяет, какие объектные файлы, необходимые для создания двоичного файла операционной системы, нужны именно сейчас.

Затем для каждого из них проверяет, были ли изменены со времени последнего создания объектного файла какие-нибудь файлы (заголовочные файлы или файлы основного текста программ), от которых объектный файл зависит. Если такие изменения были, этот объектный файл должен быть перекомпилирован. Когда программа make определит, какие файлы с расширением .c должны быть перекомпилированы, она вызывает компилятор C для их перекомпиляции, сокращая таким образом количество компиляций до необходимого минимума. В больших проектах при создании Makefile трудно избежать ошибок, поэтому существуют средства, которые делают это автоматически.

Когда все файлы с расширением .o будут готовы, они передаются программе, которая называется компоновщиком. Эта программа объединяет все эти файлы в один исполняемый двоичный файл. На этом этапе также добавляются все вызываемые библиотечные функции, разрешаются все ссылки между функциями и перемещаются на нужные места машинные адреса. Когда компоновщик завершает свою работу, на выходе получается исполняемая программа, которая в UNIX-системах традиционно называется a.out. Последовательность этапов процесса получения исполняемого файла для программы, состоящей из трех файлов исходных текстов на языке C и двух заголовочных файлов, показана на рис. 1.26. Несмотря на то что здесь мы рассматриваем разработку операционной системы, все это применимо к процессу разработки любой большой программы.

Рис. 1.26. Процесс получения исполняемого файла из программы на языке С и заголовочных файлов: обработка препроцессором, компиляция, компоновка


1.8.4.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Большие программные проекты:

  1. Том ДеМарко. Вальсируя с Медведями Управление рисками в проектах по разработке программного обеспечения, 2005
  2. Любит больше тот, кто больше готов платить.
  3. ЧЕМ БОЛЬШЕ ОТДАЕШЬ, ТЕМ БОЛЬШЕ ПОЛУЧАЕШЬ
  4. Программное обеспечение
  5. 2.4.1. Программный анализатор
  6. КОНЦЕПЦИЯ ПРОГРАММНО - РОЛЕВАЯ
  7. Богомазова Г.Н.. Установка и обслуживание программного обеспечения персональных компьютеров, серверов, периферийных устройств и оборудования, 2015
  8. Проект
  9. Эд САЛЛИВАН. ВРЕМЯ — ДЕНЬГИ Создание команды разработчиков, программного обеспечения, 2001
  10. Перевод программных вопросов в анкетные
  11. 2.4.1. Программный анализатор
  12. 15.6. "ПРОЕКТ ВОЗРОЖДЕНИЯ"
  13. 3. Проекты совместного внедрения
  14. 3.3. Дальнейшая реализация проекта
  15. Глава 39 О ПРОГРАММНЫХ СВОЙСТВАХ ХУДОЖЕСТВЕННОЙ ЛИТЕРАТУРЫ
  16. 3.2. Процедура рассмотрения и утверждения проекта
  17. Алистэр Коуберн. Каждому проекту своя методология, 1999