Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯЗЫК СИ_РУКОВОДСТВО ПРОГРАММИСТА.doc
Скачиваний:
12
Добавлен:
18.08.2019
Размер:
438.27 Кб
Скачать

5.9. Создание автономных программ

Для этого программа должна быть скомпонована с библиотекой CALIB вместо CXLIB, и в качестве головных модулей должны использоваться ASPEIS или ASPNHD вместо SPEIS и SPNHD соответственно. Пакет автономной поддержки, реализованный в CALIB, поддерживает системный терминал, включенный на стандартные адреса и системный таймер (нестандартным образом). Интерфейс с любыми другими устройствами должен реализовываться в прикладной программе.

Должен ограничиваться набор используемых библиотечных функций: запрещается использовать многие функции ввода-вывода и отладки, запрещается использовать любые функции библиотек CRLIB и CTLIB.

При компоновке программа может быть получена в формате "LDA", что позволяет загружать ее для исполнения с перфоленты при помощи стандартного абсолютного загрузчика. Для получения программы в формате "LDA" необходимо указать ключ "LDA" в команде LINK

LINK/LDA PROG,C:ASPNHD,C:CALIB/BOTTOM:2000 или

R LINK

PROG=PROG,C:ASPNHD,CALIB/L/B:2000

5.10. Сообщения оператору

В описании после каждого сообщения через дефис в скобках указана стадия компиляции,на которой генерируется данное сообщение. Обозначения следующие:

CC - головная стадия

CPP - стадия препроцессора

C0 - первый проход стадии компиляции

C1 - второй проход стадии компиляции

C2 - стадия оптимизации

AS - стадия ассемблера

Сообщениям, выданным на стадиях "CPP" и "C0" предшествует имя файла и номер строки в файле, разделенные между собой и отделенные от сообщения символами ':'. Сообщениям, выданным на стадии "C1" предшествует номер строки в файле, отделенный от сообщения символом ':'. Сообщения выводятся с использованием букв нижнего регистра, которые будут отображаться как русские буквы на некоторых терминалах.

Сообщения приведены в алфавитном пордке, причем имя файла и номер строки, которые могут предшествовать сообщению (см. выше) не учитываются. Малые и большие буквы в описании не различаются, имя стадии компиляции в описании представлено как "XX", имя какого-либо обьекта (например переменной) - как "NAME", причем заключено в кавычки.

6. ДОПОЛНЕНИЕ К ОПИСАНИЮ КОМПЛЕКТА СИ.

Составлено Яковлевым С.С. с непосредственным и активным участием Пудгородского Юрия. Значительную помощь оказал Игорь Борисенко. Данный комплект компилятора СИ отличается некоторыми приятными и неприятными особенностями:

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

14-Jan-89

Volume ID: Система СИ

Owner : Яковлев С.

UCL .SAV 4 04-Jan-89 8 UCL .DAT 1 11-Jan-89 12

RT11CD.SYS 70 23-Aug-86 13 SWAP .SYS 2 04-Jan-89 83

TT .SYS 2 04-Jan-89 85 DE .SYS 2 07-Jan-89 87

SL .SYS 10 04-Jan-89 89 MX .SYS 10 04-Jan-89 99

LP .SYS 2 04-Jan-89 109 DIR .SAV 6 24-Mar-88 111

NED .SAV 13 04-Jan-89 117 LINK .SAV 28 21-Jul-88 130

INITNF.OBJ 2 10-Feb-86 158 NFTIO .OBJ 2 16-Jan-86 160

SYSLIB.OBJ 162 04-Jan-89 162 SPEIS .OBJ 2 16-Jan-86 324

PIP .SAV 25 21-Jul-88 326 DUP .SAV 44 21-Jul-88 351

LIBR .SAV 17 21-Jul-88 395 DAY .SAV 4 21-Jul-88 412

DESS .SAV 18 21-Jul-88 416 CGLIB .OBJ 17 06-Jan-89 434

22 Files, 443 Blocks

0 Free blocks

14-Jan-89

Volume ID: Рабочая СИ

Owner : Яковлев С.

CC .SAV 227P 17-Jan-86 8 AS .SAV 65P 29-Apr-85 235

STDIO .H 2 05-Sep-88 300 GRAFIC.H 3 14-Jan-89 302

MATH .H 1 11-Jan-89 305 SETJMP.H 1 11-Jan-89 306

CTYPE .H 2 12-Jan-89 307 RDIR .H 1 13-Jan-89 309

RDSTAT.H 1 13-Jan-89 310 RCSISP.H 1 13-Jan-89 311

RCSTAT.H 1 13-Jan-89 312 ERRNO .H 1 13-Jan-89 313

DBLK .H 1 13-Jan-89 314 < UNUSED > 136 315

13 Files, 307 Blocks

136 Free blocks

В таком комплекте вы располагаете всеми возможностями стандартной библиотеки ввода-вывода СИ. Кроме того, в SY:SYSLIB включена библиотека математических функций, библиотека функций ОС RT11, преобразования чисел в строковое представление и обратно (помимо форматного ввода-вывода).

Однако исключены: профиллер, дамп регистров и памяти, вызов функций с интерфейсом ФОРТРАНа, обращение к функции времени в форма­те ОС UNIX.

Вы располагаете командой опреационной системы, реализованной в UCL.DAT:

CC/EDIT/COM/FPU/NFT/ASSEM/LINK/PROM/RUN/INC:<биб-ка> <имя_программы> (здесь указаны все возможные ключи команды)

CC <имя_программы> компилирует текст до обьектного файла

/EDIT Запускает предварительно редактор NED

/COMPILE Компилирует только до ассемблерного текста

/FPU не включает эмуляцию ФПУ, включает иниц.ФПУ

/NFTIO На этапе компоновки - только нефайловый вв/выв.

/ASSEMBLER Ассемблирует ассемблерный текст.

/LINK Запускает компоновку

/PROMPT Этот ключ передается компоновщику

/RUN Запускает программу после компоновки

/INCLUDE: Сюда можно написать дополнительную библиотеку.

Наличие мощного оптимизатора. Сравнение быстродействия

графбиблиотек, написанных на МАКРО и на СИ по очень близким

алгоритмам, показало его эффективность - скорость заливки экрана по

одной точке оказалась равной, а скорость заполнения экрана наклонной

линией на СИ была чуть-чуть больше из-за не совсем продуманного

механизма передачи параметров в макровской графбиблиотеке. Анализ

странслированной программы отладчиком позволил утверждать, что

опытный программист на МАКРО напишет ненамного более эффективную

программу, чем столь же опытный программист на СИ с оптимизатором.

Однако время, затраченное на отладку (даже у опытного программиста), на МАКРО на порядок больше.

Высокая скорость трансляции, особенно - этапа ассемблирования по сравнению с версиями, транслирующими в текст на МАКРО.

Возможность размещать промежуточные файлы даже на таком маленьком электронном диске, как у ДВК-3 (30 блоков). Обьем программы, которую можно целиком (от текста до загрузочного модуля) хранить на электронном диске, составляет примерно 1 экран текста. Размера DE: для промежуточных файлов хватает для программ примерно в 2-3 страницы на принтере, или порядка 200 строк.

Незначительность отличий от стандарта. Для работы на данном компиляторе можно практически без поправок пользоваться печатными справочными руководствами (Болски, "Справочник для программиста"; Керниган, Ричи, и многие другие).

Возможность значительно варьировать стандартное обрамление программ: включать и выключать:

файловый ввод-вывод;

стандартный запрос #;

форматный ввод-вывод;

При этом соответствуюие модули из библиотек подключаются или не подключаются, что позволяет создавать программы малого обьема.

Тип unsigned допустим только для переменных типа int и недопустим для char и long.

Тип функции void компилятор считает недопустимым. Однако если в теле функции отсутствует оператор return();, это полностью эквивалентно типу void. Поэтому можно ради совместимости вводить строку:

#define void int

Ни один пробегавший мимо компилятор СИ (также и на IBM PC, LABTAM) не позволяет нормально обрабатывать рекурсивные макроопределения. Поскольку это нигде не оговаривается, мы сочли нужным отметить этот факт.

Обнаружен ГЛЮК оптимизатора: если вы определили массив static char *txt[]="rrwsowps","olorol","1ororo";

то можете схлопотать при компоновке неопределенные глобальные метки. Оптимизатор умудряется удалить метку в секции .data., с которой начинается массив указателей на строки. Существуют условия, при которых все проходит нормально, однако единственный надежный метод борьбы с данной погрешностью - обьявить массивы указателей на тексты глобальными, вынести их в отдельный файл и скомпилировать без оптимизатора (без ключей T,X).

Просим сообщать нам обо всех отмеченных погрешностях работы с плавающей запятой! При компилировании программ без эмуляции ФПУ на Электронике-85 мы получили удовольствие от высокой скорости работы плавающей арифметики, но столкнулись с ее неадекватным поведением. Пока ничего определенного сказать нельзя.

Весьма приятными оказались сообщения компилятора:

.....Warning: "*=" operator assumed

Это означает, что если вы пишете оператор присваивания и правая его часть начинается со знака действия или операций взятия адреса или значения по адресу, для получения адекватного результата вы должны или заключить правую часть в скобки, или поставить пробел после знака равенства.

И вообще - не жалейте скобок!

После старта программы, если явно не запрещено, выполняется ввод и разбор командной строки для программы. при разборе командной строки производится эмуляция действий интерпретатора команд "shell" ОС UNIX: создается массив аргументов для передачи функции "main" и, при необходимости, происходит перенаправление ввода/вывода.