Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Техника программирования на Турбо-Си.doc
Скачиваний:
66
Добавлен:
02.05.2014
Размер:
1.58 Mб
Скачать

Глава 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), Си

превращается в язык высокого уровня, способствующий хорошему

стилю программирования.

Си имеет небольшой набор типов данных: целые числа, числа с

плавающей запятой, битовые поля и перечислимый тип. В языке Си вы

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

объектом, принадлежащим к любому типу данных. Адресная арифметика

языка Си является чувствительной к типу данных того объекта, с

которым связан используемый указатель. Разрешены также указатели

к функциям. Вы можете расширить список типов данных путем

создания структур с иерархической зависимостью входящих в него

типов данных. Каждый тип данных может принадлежать либо к

основному типу, либо к ранее описанному структурному типу.

Объединения напоминают структуры, но определяют различные виды

иерархических зависимостей, в которых данные разных типов

располагаются в памяти.

Допустимо описание массивов данных различных типов, включая

структуры и объединения. Массивы могут быть многомерными.

Функции Си являются рекурсивными по умолчанию. Вы можете,

правда, создать функцию, которая не будет рекурсивной, но сам

язык по своей природе стремится поддерживать рекурсивность и

требует минимальных усилий при программировании рекурсий.

Программа функции на языке Си разбивается на блоки, в каждом

из которых могут быть определены свои собственные локальные

переменные. Блоки могут выбираться для исполнения по результату

выполнения оператора управления последовательностью

вычислений. Блоки могут быть вложенными друг в друга.

Переменные и функции могут быть глобальными для программы,

глобальными для исходного модуля или локальными для блока, в

котором они описаны. Локальные переменные могут быть описаны

таким образом, что они будут сохранять свои значения при всех

обращениях внутри данного блока (статические переменные) или

же будут восприниматься как новые объекты при каждом обращении

(автоматические переменные).

Си позволяет создавать программу в виде нескольких исходных

модулей, которые будут транслироваться независимо. Перемещаемые

объектные модули, соответствующие исходным модулям, компонуются в

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

поддерживать объектные библиотеки многократно используемых

функций и создавать большие программы из множества небольших

исходных модулей.

В языке Си нет операторов ввода/вывода, весь ввод/вывод

выполняется с помощью функций. Вследствие этой особенности языка

Си разработана стандартная библиотека функций. Существование

этого стандарта и составляет главную привлекательность языка Си,

ибо делает программы на Си переносимыми.

Достоинства языка Си

-----------------------------------------------------------------

Переносимость программ, написанных на Си, является наиболее

разрекламированным преимуществом этого языка. Если вы пишете

программу на Си и избегаете при этом использовать расширения

библиотеки, зависящие от конкретного компилятора, или

машинно-зависимые операции, то вы получаете неплохие шансы

(значительно большие, чем при любом другом языке) на успешный

перенос вашей программы в другую программно-аппаратную среду,

включая смену компилятора, операционной системы и ЭВМ.

Приведенные в данной книге программы не претендуют на

переносимость. Библиотека функций для работы с окнами привязана к

архитектуре видеопамяти IBM PC, а функции резидентных в памяти

утилит используют систему прерываний IBM PC, специфические

особенности DOS и библиотеку расширений компилятора Турбо Си,

которая облегчает разработку программ обработки прерываний.

Некоторые функции включают небольшие фрагменты на языке

ассемблера.

Расширяемость языков программирования означает существование

потенциальной возможности внести добавления в язык. Си рассчитан

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

небольшое число операторов. Следует помнить, что сам язык

позволяет немногим более, чем изменять значения переменных и

управлять последовательностью выполнения программы. Самое важное

в программах на Си заключено в функциях, а язык сам по себе не

имеет другие внутренние функции, кроме основной функции (функции

main). Первая группа расширений языка Си размещается в

стандартной библиотеке, другие нестандартные расширения

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

расширений содержится в дополнительных библиотеках функций Си

(как это описано в данной книге). Последняя группа расширений

разрабатывается самим программистом, который создает программы

для многократного использования.

Кроме своей функциональной расширяемости, Си позволяет

расширять стандартный набор типов данных путем определения

структур, объединений и использования операторов typedef.

Программистам особенно нравится краткость выражений,

которыми в Си кодируются алгоритмы. Большинство операторов, будь

то операторы присваивания, условные операторы, обращения к

функциям или выражения, кроме операторов управления

последовательностью выполнения программы, возвращают некоторые

значения. Использование этой особенности языка позволяет

представлять выражения в краткой форме.

Си обеспечивает формирование эффективного машинного кода

программы, что достигается привязкой языков программирования к

структуре памяти и регистровой архитектуре ЭВМ, для которых они

создаются. Си часто характеризуется как переносимый язык

ассемблера высокого уровня. Сама природа языка позволяет

компилятору генерировать эффективный оптимизированный машинный

код.

Одобрение языка Си

----------------------------------------------------------------

Не должно оставаться сомнений по поводу преимуществ языка Си

по сравнению с другими языками программирования. Программисты

любят Си по причинам, указанным выше. Компании по разработке

программного обеспечения любят его за то, что он позволяет

писать программы, не зависящие от конкретной аппаратуры и

операционной системы. Современные менеджеры, многие из которых в

прошлом программисты, учитывают оба этих преимущества. Си

является языком, на котором написано большинство наиболее

популярных в мире пакетов программ.

Рекомендуемая литература по Си

-----------------------------------------------------------------

Ниже приводится список литературы по Си, которая может

помочь больше узнать о языке и способах его использования:

Брайан В., Керниган, Ритчи Деннис М.. Язык программирования

Си. - Prentiсe-Hall, 1978.

Плам Томас. Стандарты и руководящие принципы

программирования на Си. - Plum-Hall, 1982.

Плам Томас. Изучение программирования на Си. - Pluм Hall,

1983.

Кочан Стефен Г. Программирование на Си. - Hayden Book

Cомpany, 1983.

Пардам Джек. Руководство по программированию на Си. - Que

Corporation, 1983.

Харбисон Самюэл, Стил Гай Л. Си: справочное пособие. -

Jr.Таrtan Laboratories, 1984.

Хоган Том. Руководство для программистов по Си. -

Brady,1984.

Хант Вильям Джеймс. Набор инструментальных средств на Си. -

Аddison-Wеsly, 1985.

Плам Томас. Структуры данных в Си. - Plum Hall, 1985.

Компилятор МIX C. - Mix Software, Inc, 1985.

(Этот материал продается вместе с компилятором и отдельной

книгой. Независимо от того, используете вы компилятор или

нет, руководство и справочное пособие по Си будут для вас

полезны).

Газери Скотт Б. Изучение Си и Тiny-C. - Таb Books, 1985.

Рэдклифф Роберт А., Рааб Томас Д. Утилиты обработки данных

на Си. - Sybex, 1986.

Стивенс Ал. Разработка инструментальных средств на Си для

IBM PC. - Brady, 1986.

Пособие по инструментальным средствам Си доктора Добса. -

Brady, 1986.

Стивенс Ал. Разработка баз данных на Си. - МIS:Press,1987.

Джонсон Нельсон. Усовершенствованная графика на Си:

программирование и методы. - Оsborne / McGraw-Hill, 1987.

"Наставник по Си" дискеты #577 и #578 библиотеки PC-SIG

(Этот пакет программ представляет собой обучающую интерактивную

систему, содержащую текстовую информацию и примеры программ,

которые вы можете транслировать с помощью своего транслятора).