Уровень 4 ЪДДДДДДДДДДДДДДВДДДДДДБДДДДДДВДДДДДДДДДДДДДД¬
ЪДДДДБДДДДДД¬ ЪДДДДДБДДДДД¬ ЪДДДДДБДДДДДД¬ ЪДДДДДБДДДД¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ Справочник¦ ¦ Редактор ¦ ¦ Меню ¦ ¦ Ввод ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
АДДДДВДДДДДДЩ АДДДДДВДДДДДЩ АДДДДДДВДДДДДЩ АДДДДДВДДДДЩ
АДДДДДДДДДДДДДДБДДДВДДДДДДДДДДБДДДДДДДДДДДДДЩ
¦
ЪДДДДДДДДДДДДБДДДДДДДДДДДД¬
Уровень 5 ¦ ¦
¦ Функции управления ¦
¦ окнами ¦
¦ ¦
АДДДДДДДДДДДДВДДДДДДДДДДДДЩ
¦
ЪДДДДДДДДДДДДБДДДДДДДДДДДДД¬
Уровень 6 ¦ Функции управления ¦
¦ аппаратурой ¦
¦ IBM PC ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рисунок 1.1. Уровни программного обеспечения.
Уровень 6 представляет библиотеку функций нижнего уровня,
которые управляют определенными действиями IBM PC.
Уровень 5 представляет библиотеку функций для работы с
окнами, которые управляют размещением, отображением на экране и
сохранением в памяти экранных окон.
Уровень 4 объединяет функции, которые используют окна для
конкретных применений. Эти функции управляют
контекстно-чувствительными окнами со справочной информацией,
окнами редактирования текста, системами меню и окнами для ввода
данных по формату.
Уровень 3 соответствует прикладным программам и представлен
здесь примерами программ, иллюстрирующих применение библиотек
нижнего уровня.
Уровень 2 представляет собой управляющую программу, которая
связывает прикладные программы предыдущего уровня в единую
программу, управляемую с помощью меню. Эта программа может
работать как автономно, так и в качестве резидентной утилиты на
последующем уровне программного обеспечения.
Уровень 1 представляет драйвер TSR, который строит из
транзитных модулей программы, остающиеся резидентными после
завершения выполнения. В данном примере он используется для
объединения программ предыдущих уровней в единую резидентную
утилиту.
Перед тем как погрузиться в глубины программирования
модулей, резидентных в памяти и работающих с окнами, возможно,
вам захочется почитать что-нибудь по языку Си. Вы можете найти
интересующие вас сведения в данной книге. Раздел 2 содержит
краткое изложение истории языка Си и попытку объяснения, почему
же программисты так любят этот язык. Раздел 3 продолжает
рассмотрение компилятора Турбо Си, выбранного для изучения в
данной книге.
ГЛАВА 2
--------
Язык Cи
-----------------------------------------------------------------
Любая книга по Си превозносит этот язык и рассказывает
историю его создания. Настоящий раздел следует этой традиции: в
нем приводится краткая хронология создания Си, описываются
фундаментальные особенности языка, рассказывается о достоинствах
Си как инструмента программирования, а также предпринимается
попытка объяснить, почему же он завоевал такое широкое признание
среди программистов. В конце раздела содержится список справочных
материалов для изучения языка Си.
Краткая история языка Си
-----------------------------------------------------------------
Язык Си был создан в начале 70-х годов Дэннисом Ритчи,
который работал в компании Bell Telephone Laboratories.
Родословная языка Си берет свое начало от языка Алгол и включает
в себя Паскаль и ПЛ/I.
Си был разработан как язык для программирования в новой по
тем временам операционной системе Unix. ОС Unix была написана на
языке ассемблера для ЭВМ PDP-7 и перенесена затем на PDP-11. На
язык Си оказал значительное влияние его предшественник, язык Би,
созданный Кэном Томпсоном, который в свою очередь является
последователем языка BCPL. Язык ВСРL был создан в 1969 г.
Мартином Ричардсом в рамках проекта "Комбинированный язык
программирования" в Кэмбриджском университете в Лондоне. Вскоре
Unix была переписана на языке Си, и в 1974 - 75 годах OC
Unix фирмы Bell Laboratories стала первым коммерческим
продуктом, реализующим идею о том, что операционная система
может быть успешно написана на языке высокого уровня, если этот
язык является достаточно мощным и гибким.
В 1978 г. Брайан Керниган и Дэннис Ритчи написали книгу
"Язык программирования Си" (издательство Prentice-Hаll). Эта
работа, которая в своем кругу называлась "белой книгой" и "K & R"
в остальном мире, стала стандартом описания языка Си. На момент
создания "K & R" существовали компиляторы языка Си для ЭВМ
PDP-11, Interdata 8/32, Honeywell 6000 и IBM 370. В дальнейшем
этот список был продолжен.
В конце 70-х начали появляться трансляторы Си для микроЭВМ
на процессорах 8080 и Z80 с операционной системой СР/M. Скотт
Газери и Джим Гибсон разработали и пустили в продажу Тiny-C
("Крошечный Си") - интерпретатор, основанный на подмножестве
языка Си. Его интерактивная среда программирования очень похожа
на ту, что имеет чрезвычайно популярный транслятор Basic фирмы
Microsoft. В 1980 г. Рон Кэйн создал свой компилятор Small-C
("Малый Си") для ОС СР/М и микропроцессора 8080. Компилятор
Small-C, основанный на подмножестве языка Си, был написан на
самом Small-C. Проблема курицы и яйца была решена, когда Кэйн
создал первую версию компилятора на основе интерпретатора Тiny-C.
Затем Small-C методом раскрутки создал самого себя, когда Кэйн
вместе с другими, используя ранние версии компилятора, сделал
более совершенный компилятор. Small-C компилирует исходный модуль
на языке Си в модуль на языке ассемблера процессора 8080.
Следует отметить, что Кэйн предоставил свой компилятор и его
исходный текст в общественную собственность.
Примерно в это же время Лео Золман представил свой
компилятор BDS-C для СР/М, также основанный на подмножестве языка
Си. Достоинствами этого компилятора были высокая скорость и
возможность совместной компоновки перемещаемых объектных модулей
в загрузочном модуле.
Вскоре после BDS-C были созданы компиляторы, предназначенные
для СР/М и основанные на полном множестве языка Си. Это дало
импульс развитию программирования на Си для микроЭВМ. В 1981
г., в связи с созданием IBM PC, в мире микроЭВМ был сделан
значительный скачок вперед.
После появления IBM PC стали появляться и компиляторы Си для
этой ПЭВМ. Некоторые компиляторы были получены путем
преобразования соответствующих компиляторов для процессора 8080,
другие были разработаны специально для IBM PC. В настоящее
время на рынке представлены по меньшей мере семнадцать
компиляторов языка Си для IBM PC.
В 1983 г. Американский Институт Стандартов (ANSI)
сформировал Технический Комитет X3J11, устав которого
предусматривает создание стандарта языка Си. Стандартизация будет
распространяться не только на язык, но и на программную среду
компилятора, а также на библиотеку стандартных функций. В работе
комитета участвуют представители основных фирм - поставщиков
компиляторов Си, в том числе и для IBM PC, а также многие другие
светила из мира программирования на языке Си. Усилия комитета
X3J11 привлекли внимание средств массовой информации.
Предлагаемый стандарт был опубликован, для того чтобы все
заинтересованные стороны могли ознакомиться с ним и внести свои
предложения. (Сомнительно, что выдающийся программист
заинтересуется языком, который создан комитетом, но, видимо,
комитет делает хорошее дело, совершенствуя язык, созданный
выдающимся программистом).
Поскольку большинство поставщиков компиляторов для IBM PC
участвуют в работе комитета X3J11, то разрабатываемые ими новые
версии компиляторов будут в рамках этого стандарта. (Турбо Си,
один из последних компиляторов для IBM PC, подчиняется
большинству требований стандарта на язык и библиотеку).
Особенности языка Си
-----------------------------------------------------------------
В данной книге не ставится цель научить вас программировать
на языке Си, но она может быть полезной для понимания тех
особенностей Си, которые заставляют столь многих программистов
остановить свой выбор именно на этом языке.
Си является языком функций, типов данных, операторов
присваивания и управления последовательностью вычислений.
Программируя на Си, вы осуществляете обращение к функциям, и
большинство функций возвращают некоторые значения. Значение,
возвращаемое функцией, будь то значение переменной или константа,
может использоваться в операторе присваивания, который изменяет
значение другой переменной. Дополненный операторами управления
последовательностью вычислений (while, for, do, switch), Си
превращается в язык высокого уровня, способствующий хорошему
стилю программирования.
Си имеет небольшой набор типов данных: целые числа, числа с
плавающей запятой, битовые поля и перечислимый тип. В языке Си вы
можете описать переменную типа указатель, который связывается с
объектом, принадлежащим к любому типу данных. Адресная арифметика
языка Си является чувствительной к типу данных того объекта, с
которым связан используемый указатель. Разрешены также указатели
к функциям. Вы можете расширить список типов данных путем
создания структур с иерархической зависимостью входящих в него
типов данных. Каждый тип данных может принадлежать либо к
основному типу, либо к ранее описанному структурному типу.
Объединения напоминают структуры, но определяют различные виды
иерархических зависимостей, в которых данные разных типов
располагаются в памяти.
Допустимо описание массивов данных различных типов, включая
структуры и объединения. Массивы могут быть многомерными.
Функции Си являются рекурсивными по умолчанию. Вы можете,
правда, создать функцию, которая не будет рекурсивной, но сам
язык по своей природе стремится поддерживать рекурсивность и
требует минимальных усилий при программировании рекурсий.
Программа функции на языке Си разбивается на блоки, в каждом
из которых могут быть определены свои собственные локальные
переменные. Блоки могут выбираться для исполнения по результату
выполнения оператора управления последовательностью
вычислений. Блоки могут быть вложенными друг в друга.
Переменные и функции могут быть глобальными для программы,
глобальными для исходного модуля или локальными для блока, в
котором они описаны. Локальные переменные могут быть описаны
таким образом, что они будут сохранять свои значения при всех
обращениях внутри данного блока (статические переменные) или
же будут восприниматься как новые объекты при каждом обращении
(автоматические переменные).
Си позволяет создавать программу в виде нескольких исходных
модулей, которые будут транслироваться независимо. Перемещаемые
объектные модули, соответствующие исходным модулям, компонуются в
единый загрузочный модуль. Эта особенность позволяет компилятору
поддерживать объектные библиотеки многократно используемых
функций и создавать большие программы из множества небольших
исходных модулей.
В языке Си нет операторов ввода/вывода, весь ввод/вывод