- •1.1. Форматный ввод/вывод
- •1.2. Нефайловая работа с терминалом
- •1.3. Управление распределением динамической памяти
- •1.4. Работа со строками и символами
- •1.5. Средства отладки
- •5. Язык си. Руководство оператора.
- •5.1. Стадии подготовки программы
- •5.2. Проблемы промежуточных файлов
- •5.3. Эмуляция eis
- •5.5. Инициализация fpu
- •5.6. Форматный вывод чисел с плавающей запятой
- •5.7. Оптимизация
- •5.8. Компоновка
- •5.9. Создание автономных программ
- •5.10. Сообщения оператору
- •6.1. Ввод и обработка командной строки
- •6.2 Управление стартовыми действиями
- •7. Пакет работы с терминалом
- •7.1. Обновление экрана
- •7.2. Запуск
- •7.3. Вывод
- •7.4. Ввод
- •7.5. Завершение работы
- •7.6. Оптимизация движения курсора
- •9. Краткое описание компилятора си фирмы dec.
- •10. Перечень ошибок
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" и, при необходимости, происходит перенаправление ввода/вывода.