Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

'Документ'
Богоизбранного Царского рода преславное увенчание, святый страстотерпче Царю Николае, сонм новомучеников Российских с Семейством Своим возглавивый, в...полностью>>
'Практикум'
Верховна Рада АРК (далі – ВР АРК) звернулась до Конституційного Суду України щодо перевірки відповідності Конституції України положень ст. 143 Земель...полностью>>
'Книга'
Коллектив организации среди основных объектов управления занимает центральное место, представляя собой высшую форму организованной группы людей, объе...полностью>>
'Анализ'
Рассматривая вопросы законодательства Российской Федерации в области социального обеспечения и социальных гарантий, следует учитывать то обстоятельст...полностью>>

Н. И. Лобачевского Факультет Вычислительной Математики и Кибернетики Кафедра иисгео Язык программирования Си Курс лекций

Главная > Курс лекций
Сохрани ссылку в одной из сетей:

Министерство высшего и среднего специального образования России

Нижегородский Государственный Университет им Н.И. Лобачевского

Факультет Вычислительной Математики и Кибернетики

Кафедра ИИСГео

Язык программирования Си

Курс лекций для студентов д/о ВМК

Разработал: м.н.с. НИИ ПМК Васин Д.Ю.

Н.Новгород 2003

Содержание

Язык программирования Си 1

Содержание 2

Литература 3

1. Введение в язык Си 4

2.Интегрированная среда Borland C 8

3.Процесс проектирования 18

4. Язык программирования С 27

Литература

  1. Керниган Б., Ритчи Д. Язык программирования Си: Пер. с англ. М.: Финансы и статистика, 1992г. 271 с.

  2. Хенкок Л., Кригер М. Введение в программирование на языке Си: Пер. с англ. М.: Радио и связь, 1986г. 191 с.

  3. Болски М.И. Язык программирования Си: Пер. с англ. М.: Радио и связь, 1988г. 96 с.

  4. Джехани Н. Программирование на языке Си: Пер. с англ. М.: Радио и связь, 1988г. 270 с.

  5. Уэйт М., Прата С., Мартин Д. Язык Си: Руководство для начинающих. М.: Мир, 1988г. 512 с.

  6. Трой Д. Программирование на языке Си для персонального компьютера IBM PC: Пер. с англ. М.: Радио и связь, 1991г. 432 с.

  7. Прокофьев Б.П., Сухарев Н.Н., Храмов Ю.Е. Графические средства Borland C и Borland C++. М.: Финансы и статистика, СП «Ланит», 1992г. 160 с.

  8. Тондо К., Гимпел С. Язык Си. Книга ответов: Пер. с англ. М.: Финансы и статистика, 1994г. 160 с.

1. Введение в язык Си

Язык Си был разработан как универсальный язык системного программирования. К его первым приложениям относится такое системное программное обеспечение, как операционные системы  ОС, компиляторы и редакторы. Он использовался и для таких приложений, как системы управления базами данных  СУБД, программы обработки крупноформатных бланков, научноинженерные программы и программы обработки текстов. Он служит основным языком программирования для популярной ОС UNIX™, но используется и в других операционных средах.

    1. История создания языка Си

Язык программирования Си был разработан в 1972 году в фирме Bell Laboratories (отделение известной телефонной компании AT&T) Деннисом Ритчи, одним из первых пользователей операционной системы Unix. Задумывался он не как универсальный алгоритмический язык, а, скорее, как инструмент для развития операционной системы и создания новых обслуживающих программ (утилит). Такой подход характерен для большинства системных программистов, разрабатывающих сложные проекты и придумывающих для облегчения своего труда различные сервисные процедуры, макрокоманды и т.п. По завершению разработки, как правило, эти инструментальные наборы предаются забвению или, в лучшем случае, остаются в личных архивах авторов. Язык Си эта участь миновала. Вполне возможно, что его становлению способствовало последующее всемирное признание операционной системы Unix. Его истоками можно считать язык BCPL (Basic Combined Programing Language  основной комбинированный язык программирования), разработанный Мартином Ричардсоном в Кембридже (Англия). В 1970 году специалисты по программированию, работавшие в фирме Bell Laboratories, разработали вариант языка BCPL, получивший название Би. Он использовался при разработке ранней версии ОС UNIX™ для компьютеров PDP11™ фирмы Digital Equipment. В языке Би не было типов данных: его единственным объектом было машинное слово. Для получения доступа к отдельным машинным словам в нем использовались переменные, содержащие «указатели». Этот упрощенный взгляд на машину оказался неприемлемым в первую очередь потому, что в памяти компьютера PDP11™ (прототип СМ-4) (как и в IBM PC) адресация осуществляется по байтам и наряду с целочисленными арифметическими операциями PDP11™ выполняет операции над значениями с плавающей точкой. Но в языке Би отсутствовала адресация байтов, не различались целые значения и значения с плавающей точкой, а также не обеспечивались удобные способы выполнения арифметических операций над этими значениями.

Указанные недостатки вызвали преобразование языка Би в язык Си, основным отличием которого от Би было наличие типов данных. Каждое определение или объявление данных в языке Си задает тип этих данных, по которому можно установить, какой объем памяти требуется для хранения объекта и как интерпретировать его значения. Типы данных позволяют задавать байтовые символьные объекты, целые объекты и объекты с плавающей точкой. Язык Си унаследовал идею применения указателей и обеспечил возможность использования более сложных структур данных, таких как массивы и структуры.

Первым программным продуктом, написанным почти полностью на Си, был компилятор с языка Си в код машинных команд РDР-11/20 (прототип СМ-4). В 1973 г. Д.Ритчи и К.Томпсон переписали на Си большую часть операционной системы Unix.

В процессе перевода Unix из однопользовательской операционной системы, ориентированной на работу в конкретной ЭВМ, превратилась в мобильную операционную систему коллективного пользования. Успех этой операции, в значительной мере, предопределил популярность новой операционной системы и ее базового инструмента - языка Си. В 1976 г. Д.Ритчи и К.Томпсон перенесли Unix с ЭВМ фирмы DEC на компьютеры другой архитектуры (Interdata 8/32), практически ничего не изменив в ядре операционной системы, написанном на Си. Точно таким же образом Unix распространялся на десятках машин различных типов.

В 1978 г. появилась первая книга, посвященная описанию Си и технике программирования на этом языке, которая с большим запозданием была переведена на русский язык (Б. Керниган, Д. Ритчи, А. Фьюэр. Язык программирования Си. Задачи на языке Си. - М.: Финансы и статистика, 1985). От фамилий двух первых авторов произошло сокращенное обозначение первого, никем не утверждавшегося, но принятого всеми программистами стандарта языка Си - K&R.

Дальнейшая работа по совершенствованию языка Си и принятию в 1987г. первого настоящего стандарта ANSI C была выполнена на общественных началах рабочей группой при Американском Национальном Институте Стандартов. Возглавлял эту работу сотрудник Bell Labs Лэрри Рослер. Наиболее серьезный вклад в развитие языка Си за последние годы внес еще один представитель той же лаборатории Бьерн Страуструп, который ввел в обращение новые объекты - классы, объединяющие данные и обрабатывающие их функций. С 1983 г. за расширенной версией языка Си с классами закрепилось название C++.

Первые версии Си подвергались серьезной критике за отсутствие достаточной строгости, приводившей к многочисленным ошибкам из-за работы с неинициализированными переменными, отсутствия контроля за выходом индексов у элементов массивов за установленные пределы, несоответствия типов формальных и фактических параметров функций и т.п. Перед системными программистами Bell Labs эти проблемы остро не стояли, т.к. они пользовались специальной программой Lint, которая проводила тщательный анализ программ, написанных на Си, перед их трансляцией и выполнением. Для рядовых пользователей ситуация изменилась с появлением интегрированных сред, среди которых наибольшую популярность приобрели Турбо-системы фирмы Borland. Первая версия Borland C, работавшая в среде MS-DOS, была выпущена в 1987 г. В настоящее время фирма Borland вышла на рынок с версией 5.02, предназначенной для работы под управлением Windows. Известны и другие реализации языка Си на IBM–совместимых ПК - Microsoft C, Lattice C, Zortech C, Symantec C. Но в нашей стране продукция фирмы Borland получила наибольшее распространение.

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

Наряду с языком Си при работе на компьютере IBM PC можно пользоваться многими другими языками программирования, например языком ассемблера, языками BASIC, FORTRAN, COBOL, PL1 и PASCAL. Чтобы сравнить их с языком Си, необходимо уяснить цели их разработки.

АССЕМБЛЕР  язык программирования, ближе всего соответствующий системе команд микропроцессора. Хотя этот язык позволяет программисту полностью использовать возможности компьютера, он не является естественным языком для алгоритмических выражений. Программисты называют его «языком программирования нижнего уровня», поскольку он близок к машинному языку  языку программирования самого низкого уровня. Этот язык преобладал при разработке системного программного обеспечения, например ОС MS DOS полностью написана на языке ассемблера, а также при разработке компиляторов и загрузчиков, поскольку в подобных программах нередко требуется выполнять сложные манипуляции над данными.

Программистыприкладники  студенты, ученые, инженеры  вскоре ощутили потребность в более естественных языках, которые бы упрощали программирование алгоритмов решения их задач. Для использования языков высокого уровня необходимо иметь компилятор (или интерпретатор), т.е. программу, которая преобразует операторы языка высокого уровня в машинный язык микропроцессора. Обсудим наиболее распространенные языки высокого уровня.

ФОРТРАН  представляет собой естественный язык для выражения математических алгоритмов. Пользователи этого языка рассматривают компьютер как мощный вычислитель. Данный язык был разработан в 50х годах, а затем совершенствовался и несколько раз расширялся. Фортран чрезвычайно популярен среди ученых и инженеров, однако он совершенно не пригоден для разработки системного программного обеспечения.

Т.к. Фортран предназначен в основном для вычислений, то в нем отсутствуют развитые средства для представления структур данных и невозможен прямой доступ к ячейкам памяти. Он не обеспечивает выполнение некоторых операций, имеющихся в языке ассемблера (операций над битами), не дает возможности пользоваться составными данными (за исключением массивов) и применять некоторые современные методы программирования, например рекурсивное программирование. На Фортране можно писать большие программы, разбивая задачу на части (называемые подпрограммами или функциями), которые программируются независимо, а затем объединяются в единое целое.

КОБОЛ  преобладающий язык в задачах обработки административных и финансовоэкономических данных. Пользователи Кобола рассматривают компьютер как средство обработки финансовоэкономических данных. В язык включены развитые средства выполнения операций вводавывода. Кобол позволяет создавать большие программы за счет использования независимо создаваемых и компилируемых подпрограмм. Однако, как и в Фортране, в нем отсутствуют многие современные средства программирования, например реккурсивное программирование и адресация ячеек памяти. Равным образом Кобол не пригоден для системных приложений.

БЕЙСИК  был разработан как упрощенная версия языка Фортран и предназначался для обучения начинающих программистов. Пользователи Бейсика рассматривают компьютер как программируемый калькулятор. В настоящее время он один из наиболее популярных языков среди всех языков, используемых на ПК.

Большинство реализаций Бейсика являются интерпретаторами, а не компиляторами. Интерпретатор представляет собой программу, которая непосредственно исполняет предложения языка, а не преобразует их в программу на машинном языке, как это делает компилятор. Бейсик хорош для написания небольших диалоговых программ. Среда программирования, обеспечиваемая интерпретатором, позволяет быстрый ввод и проверку программ. Интерпретатор может оказаться неудобным для более серьезного программиста, разрабатывающего программный продукт, поскольку скорость исполнения интерпретируемой программы обычно ниже скорости исполнения откомпилированной программы.

В Бейсике отсутствуют настоящие подпрограммы, имеющиеся в Фортране и Коболе; поэтому программы на языке Бейсик быстро становятся большими и неудобными для дальнейшего развития. У него отсутствуют операторы, требуемые для выполнения прямого доступа к ячейкам памяти, биториентированные и некоторые другие операции, необходимые при системном программировании. В Бейсике также отсутствует возможность определения структур данных, отличных от массивов и строк символов.

ПЛ1  был разработан фирмой IBM для замены и Фортрана, и Кобола. Он обладает вычислительными возможностями Фортрана и средствами Кобола по обработке файлов данных. Он обеспечивает много дополнительных возможностей, например операции над битами, прямой доступ к ячейкам памяти, и рекурсивное программирование. Однако ПЛ1 не оправдал ожиданий своих создателей и не вытеснил ни Фортран, ни Кобол. Возможно, это вызвано тем, что средств языка ПЛ1 столько, что его трудно выучить, а компиляторы представляют из себя очень большие программы и пользоваться ими можно только на больших машинах. Это мешает использованию ПЛ1 на персональном компьютере.

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

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

Си  при разработке этого языка был принят компромисс между низким уровнем языка ассемблера и высоким уровнем описанных выше языков. Пользователи языка Си рассматривают компьютер в ракурсе, объединяющем точки зрения пользователей языков ассемблера и Паскаль. В языке Си предусмотрено много операций, непосредственно исполняемых большинством микропроцессоров (например, прямой доступ к ячейкам памяти и манипулирование битами); в то же время он дает программисту возможность выражать свои алгоритмы и данные наиболее подходящими средствами, использующими такие традиционные конструкции языков программирования высокого уровня, как итерация, выбор и принятие решения. Язык Си обеспечивает возможности структурирования данных, отсутствующие в языке ассемблера, но присущие современным языкам программирования высокого уровня. Он позволяет разрабатывать большие, но структурированные программы, предоставляя возможность отдельной разработки подпрограмм (в отличие от Бейсика и некоторых вариантов реализации языка Паскаль).

В отличие от ПЛ1 язык Си компактен. Его создатели ориентировались на миникомпьютеры, и разработанный ими компилятор занимал всего лишь 12 Кб ОП. Размер компилятора языка Си делает его идеальным для применения на персональном компьютере. Чтобы сохранить язык Си компактным, его создатели удержались от соблазна включить в него множество операций, отсутствующих у большинства микропроцессоров. Так, в языке Си нет встроенных операций для манипулирования строками и даже встроенных операций вводавывода. Эти возможности, меняющиеся в зависимости от компьютера или приложений, были вынесены из собственно языка и реализованы как подпрограммы, которые могут быть вызваны из программы, написанной на языке Си.

Другой целью создателей языка Си была разработка мобильного языка, который можно было бы использовать для разработки системного программного обеспечения. Язык программирования называют мобильным, если написанные на нем программы могут быть без труда перенесены из одной вычислительной среды в другую. Системное программное обеспечение, написанное на языке ассемблера, не может быть мобильным, поскольку языки ассемблера разных компьютеров различаются (особенно если эти компьютеры выпущены разными фирмамипроизводителями). Напротив, программы, написанные на языке программирования высокого уровня, мобильны, поскольку язык должен быть одним и тем же независимо от того, на каком компьютере и в какой ОС он используется. В прошлом прикладное программное обеспечение  ПО было более мобильным, чем системное ПО, поскольку на новом компьютере прикладную программу можно было просто заново откомпилировать. Авторы Си заполнили этот промежуток, создав компилируемый язык, пригодный для разработки системного ПО. Так как многие конструкции высокого уровня (вводвывод, манипулирование структурами данных) реализованы вне языка Си как подпрограммы, то при необходимости их можно написать ориентированными на конкретное приложение или конкретную ОС, не затрагивая при этом компилятор языка Си или любое ПО, написанное на этом языке. Можно приобрести библиотеки наиболее широко используемых подпрограмм; в действительности библиотека процедур вводавывода и других подпрограмм, называемая стандартной библиотекой, поставляется большинством производителей компиляторов. Наконец, дополнительное свойство языка Си, называемое условной компиляцией, позволяет программисту изолировать машиннозависимые операторы и контролировать их компиляцию в другой среде. Это дополнительно повышает мобильность ПО, написанного на языке Си.

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

    1. Пользование компилятором

Компилятор представляет собой системную программу, которая преобразует некоторый «язык высокого уровня» в язык компьютера  язык ассемблера или машинный язык. Интерпретатору Бейсика этого не требуется, поскольку он непосредственно исполняет каждый оператор. Интерпретаторы хороши при написании небольших программ, не требующих многократного исполнения. Компиляторы более удобны для разработки больших программ, которые должны исполняться много раз. Это обусловлено тем, что интерпретация программы осуществляется намного медленнее исполнения на компьютере ранее откомпилированной программы.

По сравнению с интерпретатором при работе с компилятором требуется выполнить несколько дополнительных операций (рис.1).

Рисунок 1

Программа готовится с помощью текстового редактора или программы обработки текста. Она запоминается в исходном файле, который преобразуется компилятором в объектный файл. Затем объектный файл, возможно, вместе с другими объектными файлами, полученными ранее (может быть с помощью других компиляторов), преобразуется в исполняемый файл программой, называемой загрузчиком или редактором связей. Этот файл может быть исполнен непосредственно компьютером.

    1. Внутренняя структура программы на языке Си для IBM PC (альтернативные модели распределения памяти)

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

Современные компиляторы языка Си обеспечивают реализацию нескольких моделей распределения памяти. Под областью данных в табл.1 подразумевается область динамических данных модели распределения памяти, используемой в программе на языке Си. Размер области статических данных во всех моделях обычно не превышает 64 Кб, аналогично размер области стека также не превышает 64 Кб.

Таблица 1 Альтернативные модели распределения памяти

Модель распределения памяти

Максимальный размер области команд, байт

Максимальный размер области данных, байт

Малая модель

64К

64К

Модель больших кодов

До 1М

64К

Модель больших данных

64К

До 1М

Большая модель

До 1М

До 1М

Модель распределения памяти задается на стадии компиляции путем указания соответствующих параметров при вызове компилятора языка Си. Каждое значение параметра, задающего модель распределения памяти, заставляет компилятор генерировать несколько иные машинные коды. Для большинства компиляторов это влечет за собой требование, чтобы при раздельной компиляции программ на языке Си задавалась одна и та же модель памяти.

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



Скачать документ

Похожие документы:

  1. Н. И. Лобачевского Факультет Вычислительной математики и кибернетики Кафедра Математического обеспечения ЭВМ учебный курс (2)

    Учебный курс
    Затем была рассмотрена структура и основные понятия UML, представлена постановка учебной задачи, на которой далее будет иллюстрироваться изучаемый материал на протяжении всего курса (“Система бронирования билетов для авиакомпании”).
  2. Н. И. Лобачевского Факультет Вычислительной математики и кибернетики Кафедра Математического обеспечения ЭВМ учебный курс (4)

    Учебный курс
    На протяжении всего времени обучения на факультете мы изучаем программирование. Программирование (Computer science) – молодая, активно развивающаяся область.
  3. Н. И. Лобачевского Факультет Вычислительной математики и кибернетики Кафедра Математического обеспечения ЭВМ учебный курс (1)

    Учебный курс
    Наша предыдущая лекция была посвящена введению в методологию Microsoft Solutions Framework. Мы обсудили, что такое методология вообще. Поговорили о том, чем является и чем не является MSF.
  4. Н. И. Лобачевского Факультет Вычислительной математики и кибернетики Кафедра Математического обеспечения ЭВМ учебный курс (3)

    Учебный курс
    Программирование (Computer science) – молодая, активно развивающаяся область, за полвека своего развития преодолевшая огромный путь. Будучи как искусством, так и наукой, в наше время термин программирование приобрел качественно новую
  5. Учебно методическое пособие Рекомендовано методической комиссией факультета вычислительной математики и кибернетики для студентов высших учебных заведений, обучающихся по направлению подготовки 010502 «Прикладная информатика» Нижний Новгород

    Учебно-методическое пособие
    Рекомендовано методической комиссией факультета вычислительной математики и кибернетики для студентов высших учебных заведений, обучающихся по направлению подготовки 010502 «Прикладная информатика»

Другие похожие документы..