Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УЧЕБНАЯ ПРАКТИКА120625.doc
Скачиваний:
3
Добавлен:
27.09.2019
Размер:
526.85 Кб
Скачать

3. Компиляция, компоновка и выполнение программы

Компьютер выполняет команды, представленные при помощи языка машинных кодов. Программист, составляя программу, пишет её на языке высокого уровня, который не понимает ЭВМ. Системное программное обеспечение позволяет перевести исходный текст программы на язык машинных кодов. Компонентами системного программного обеспечения служат редактор исходного текста, компилятор, компоновщик (редактор связей), библиотеки.

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

Выполняя задания предыдущего раздела, Вы должны были создать на диске С: директорию Test, в ней – поддиректории Bin, Include, Lib, Apps, Docs, и скопировать в эти директории системные файлы:

в директорию Bin

bcc32.exe;

ilink32.exe;

lnkdfm50.dll;

rlink32.dll;

в директорию Lib

c0x32.obj;

cw32.lib;

import32.lib;

uuid.lib

и в директорию Apps

notepad.exe.

Цифра 32 в именах файлов означает, что они являются компонентами 32-разрядной системы программного обеспечения:

bcc32.exe - компилятор;

ilink32.exe - компоновщик;

файлы с расширениями lib и dll представляют собой системные библиотеки, содержащие различные стандартные функции, написанные на языке машинных кодов.

Создадим первую программу на языке С. Для этого перейдем в директорию C:\Test\Apps и вызовем редактор notepad с именем файла, который мы хотим создать:

notepad.exe prog1.c

(расширение «c» указывает, что создаваемый файл содержит исходный текст программы на языке C). Редактор сообщит, что такого файла нет и предложит подтвердить, что мы действительно хотим создать файл с таким именем.

Наберем в окне редактора следующий текст:

main()

{}

и сохраним его в директории C:\Test\Apps. Иногда редактор добавляет к имени файла еще свое расширение txt. Проверим с помощью команды dir содержимое директории Apps, если имя файла имеет вид prog1.c.txt, переименуем его:

rename prog1.c.txt prog1.c

Укажем операционной системе, что компилятор следует искать в директории Bin:

path C:\Test\Bin

и обработаем файл программы компилятором:

bcc32.exe -L“C:\Test\Lib” prog1.c

Внимательно наберите эту команду: между опцией -L и следующим за ним именем директории не должно быть пробелов.

Если мы не сделали никаких ошибок, компилятор выдаст сообщение:

Warning W8070 prog1.c 2: Function should return a value in function main,

а в директории Apps, из которой мы запускали компилятор, появятся три новых файла:

prog1.tds

prog1.obj

prog1.exe

Постараемся разобраться в том, что мы сделали. Программа, написанная на языке С, обязательно должна содержать определение функции main. В соответствие с правилами синтаксиса языка C определение функции имеет следующий вид:

[тип_возвращаемого_значения] имя_функции ([аргументы])

{

[команды]

}

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

Для перевода программы на язык машинных кодов мы вызываем компилятор bcc32.exe; аббревиатура bcc означает Borland C compiler – компилятор языка С, разработанный фирмой Borland International Corporation. Он запускается из командной строки, аргументом служит имя файла с исходным текстом программы. Кроме того, при вызове компилятора следует указать два параметра: директорию Include и директорию Lib. В директории Include находятся стандартные включаемые файлы, содержащие заголовки определений тех стандартных функций, которые используются в программе, а в директории Lib – библиотечные файлы, в них размещаются объектные коды стандартных функций. Опции -L, -I помогают компилятору различать параметры. Как мы знаем, опции (или ключи) команд сеанса MS-DOS записываются по-другому: /s, /p. Дело в том, что формат вызова компилятора bcc удовлетворяет требованиям пользовательского интерфейса операционной системы UNIX.

Компилятор создает объектный файл программы (он имеет расширение obj) и передает управление компоновщику – исполняемому файлу ilink32.exe. Компоновщик формирует исполняемый файл программы с расширением exe. Файл с расширением tds содержит служебную информацию.

Рассмотрим предупреждение (warning), которое выдал компилятор. После слова Warning идет номер предупреждения W8070, имя программы prog1.c, номер строки, в которой обнаружена ошибка, и сообщение. Сообщение указывает, что функция должна возвращать значение, в конце сообщения стоит имя функции, в теле которой обнаружена ошибка. Тип возвращаемого значения следует объявить в начале определения функции, если его нет, то предполагается, что функция возвращает в точку вызова целое число. Функцию main вызывает операционная система, поэтому то значение, которое возвращает эта функция передается операционной системе. Оно называется кодом возврата и содержит информацию о характере завершения программы. Код возврата 0 означает, что в ходе взаимодействия программы операционной системой не обнаружено никаких ошибок.

Тип возвращаемого значения void (пустой) указывает, что на самом деле функция не возвращает никакого значения. Мы могли бы определить функцию main так:

void main()

{}

Но правила «хорошего тона» в программировании требуют, чтобы программа, завершаясь, всегда передавала операционной системе код возврата.

Для того, чтобы вернуть значение в точку вызова функции применяют оператор return (вернуть), он имеет такой формат:

return возвращаемое_значение;

(следует помнить, что в языке С любая команда завершается точкой с запятой). Снова вернемся в директорию Apps, загрузим в блокнот файл prog1.c и исправим программу:

main()

{

return 0;

}

(между именем оператора return и возвращаемым значением обязательно должен быть пробел). В языке C команда всегда завершается точкой с запятой. Откомпилируем программу:

bcc32.exe –L“C:\Test\Lib” prog1.c

Теперь компилятор не выводит предупреждения, на экране появляется служебная информация о ходе компиляции. В директории Apps мы видим те же три файла: prog1.obj, prog1.tds, prog1.exe. Файл prog1.exe – исполняемый, запустим его, набрав имя файла в командной строке. После того, как мы нажмем клавишу Enter (ввод) «ничего не произойдет», только экрана на мгновение очистится - исчезнет приглашение командной строки и другая информация.

Добавим в программу комментарий – часть исходного текста, ограниченная символами /* и */. Компилятор пропускает комментарий, не обрабатывая. Обычно комментарий содержит сведения, необходимые для понимания программы. Мы всегда будем начинать программу с комментария, указывающего имя программы:

/* prog1.c */

main()

{

return 0;

}

Вопросы для повторения

Основными компонентами системного программного обеспечения служат редактор, компилятор, компоновщик, библиотеки. Какие функции выполняет каждый компонент?

Что означают расширения файлов .c, .obj, .exe, .lib?

Что такое код возврата программы?

Напишите программу, которая возвращает операционной системе число 7.