Язык программирования cи
Введение в язык программирования C
C — это достаточно «древний» язык программирования, он сформировался в начале 70-х. Не смотря на это, C — живой язык в том смысле, что он активно применяется в настоящее время. Он был придуман, использовался и используется для написания существенных частей программного кода Unix-подобных операционных систем. Также на нем пишут утилиты, компиляторы и реже прикладные программы. Поэтому C называют системным языком программирования.
Его живучесть можно объяснить тем, что принципы работы операционных систем относительно универсальны, они не подвержены тому прогрессу и разнообразию, которые можно наблюдать в среде десктопного и мобильного ПО, Web-приложений. C не является языком достаточно высокого уровня, он ближе к архитектуре компьютера. В результате программы на C получаются компактными и быстрыми.
C не поддерживает объектно-ориентированного программирования. Поддержка ООП реализована в C++. Хотя последний возник на основе языка C, он не является его «продолжением», а представляет собой отдельный язык, который можно изучать, не зная C. Однако изучение C полезно перед знакомством с его «продвинутым младшим братом», т.к. синтаксис языков похож, C не перегружает мозг начинающего программиста сверхвозможностями и приучает к пониманию сути происходящего.
Подходит ли C для первого знакомства с программированием? Если вы не обучаетесь в вузе по специальности, связанной с IT, то нет. C предполагает понимание организации и принципов работы аппаратного обеспечения, в частности – памяти. Здесь многое делается с помощью указателей, они играют ключевую роль; эта тема достаточно сложная для понимания и обычно не изучается в школе.
Конечно, с помощью C можно изучать основы программирования и не изучать при этом указатели. Однако человек будет думать, что знает C, мало зная о нем по существу. Язык C был создан разбирающимися в устройстве «железа» профессиональными программистами для написания операционной системы UNIX. Его не задумывали как язык для обучения начинающих.
Среды и компиляторы для программирования на C
Если вы пользуетесь одним из дистрибутивов GNU/Linux, вам подойдет любой текстовый редактор с подсветкой синтаксиса, также понадобятся GCC и терминал.
Существуют редакторы для программистов, включающие различные дополнения, в том числе терминал, просмотр каталогов и др. Например, Geany или Atom.
C – компилируемый язык программирования. В GNU/Linux для получения исполняемых файлов используется GCC – набор компиляторов, включающий в том числе компилятор для C. Чтобы из исходного файла (обычно таким файлам дают расширение *.с) получить исполняемый, надо выполнить в терминале команду примерно следующего вида:
, где gcc — команда, запускающая программу, выполняющую компиляцию и иные действия; -o – ключ, сообщающий, что мы вручную указываем имя исполняемого файла; hello – имя получаемого исполняемого файла; hello.c – имя файла с исходным кодом. Имя исполняемого файла можно не указывать:
В этом случае исполняемый файл будет иметь имя по умолчанию a.out.
Для Windows существует свой набор компиляторов – MinGW. Его можно использовать самостоятельно, однако он входит в состав простой среды разработки Dev-C++, которая может оказаться хорошим выбором для обучения программированию на языках C и С++.
При сохранении выбирайте тип файла «C source files (*.c)». Компиляция и запуск программы выполняется при нажатии клавиши F9. После исполнения программа сразу закрывается и результат невозможно увидеть. Чтобы этого не происходило, прописывают две дополнительные строки: #include и getch(). (Возможно это не актуально для более новой версии Dev-C++.)
«Hello World» в GNU/Linux:
«Hello World» в Windows:
С другой стороны, существует большое количество кроссплатформенных сред разработки. Например, Eclipse + модуль CDT, KDevelop, CLion. Последняя платна, выпускается компанией JetBrains – лидером в разработке IDE, однако имеет 30-ти дневный триальный период, чего может быть достаточно для обучения. CLion удобнее других IDE.
«Hello World» на C
На примере простейшей программы сразу отметим некоторые особенности языка программирования C.
В языке C роль основной ветки программы берет на себя функция main(). Эта функция всегда должна присутствовать в законченной программе на языке C, и исполнение программы начинается именно с нее. Однако объявленные внутри нее переменные не являются глобальными, их область видимости простирается только на main(). Тем не менее в языке программирования C почти весь программный код заключается в функции, и функция main() является главной и обязательной.
По умолчанию функция main() возвращает тип данных int, поэтому можно не указывать тип возвращаемых данных. Однако компилятор в этом случае выносит предупреждение.
Функция printf() предназначена для вывода данных. Ее назначение аналогично процедуре write() языка Pascal и функции print() в Python. Функция printf() после вывода не выполняет переход на новую строку. Поэтому для перехода используется специальный символ, который обозначается комбинацией n. Законченные выражения на языке C разделяются точкой с запятой.
В языке C функции ввода-вывода не являются частью языка. Например, в Python нам не надо импортировать никакой модуль, чтобы пользоваться функциями print() и input(). В C же мы не можем просто вызвать функцию printf(), т.к. в самом C ее просто нет. Эту функцию, а также ряд других, можно подключить с помощью заголовочного файла stdio.h. Именно для этого в начале программы прописана строка #include . Include с английского переводится как «включить», а stdio есть сокращение от «стандартный ввод-вывод (input-output)».
В заголовочных файлах (они оканчиваются на *.h) обычно содержаться объявления тех или иных функций. Объявление — это просто описание функции: какие параметры она принимает и что возвращает. Сам код функции (определение) находится не в заголовочном файле, а в библиотеках (других файлах), которые могут быть уже скомпилированы и расположены в системных каталогах. Перед компиляцией программы запускается препроцессор языка C. Помимо прочего он включает в начало файла программы содержимое указанных в ней заголовочных файлов.
Практическая работа
Закомментируйте 1 первую строчку кода программы HelloWorld. Попробуйте скомпилировать программу. Удалось ли получить исполняемый файл? Какое предупреждение выдал компилятор?
1 // — однострочный комментарий на языке C; /* … */ — многострочный комментарий на языке C.
Язык Си
Все, что нужно знать для изучения Си — одного из старейших языков программирования — и его тонкостей.
Для чего хорош Си?
Язык Си обычно используется в довольно сложных задачах. В каких? Отобрали для вас самые популярные области применения Си.
Должен ли «настоящий» программист знать язык Си — отвечают эксперты
Си — обязательный язык для каждого разработчика или пережиток прошлого? Узнаём у экспертов, нужно ли всем программистам учить этот язык.
Вакансии, где нужны знания по теме «Язык Си»
Видеокурс для изучения языка Си с нуля
Курс подробно объясняет основы языка Си, включая функции, структуры, массивы, циклы, арифметические, логические операции и операции сравнения.
Фичи Rust, которых не хватает в C
Федерико Мена-Кинтеро, один из основателей GNOME, рассказывает, какие у языка C есть недостатки, что плохого в языке C относительно Rust, и объясняет, почему считает C очень и очень примитивным языком для современного ПО.
События и курсы
Макросы в Си: как, когда и зачем?
Чем макросы в Си лучше функций и наоборот: лучшие практики использования макросов, подводные камни и скрытые возможности.
Интересные проекты: математическая C-библиотека для разработки видеоигр
Проект MATHC — коллекция объектов для разработки 2D- и 3D- игр.
Интересные проекты: рендеринг изображений ASCII-символами
Однофайловая библиотека C/C++, которая позволяет преобразовывать изображение или видеокадр в печатные символы ASCII в режиме реального времени.
Интересные проекты: облачная файловая система pingfs
Где мои данные? Не могу сказать. Но они существуют? Надеюсь. Обзор «по-настоящему облачной» файловой системы pingfs.
Статический анализ кода: обзор инструмента OCLint
OCLint — это инструмент для статического анализа кода, написанного на С, С++ и Objective-C.
Курс «Углубленное программирование на C/С++»
Русскоязычный курс проекта «Технопарк Mail.Ru Group», посвященный продвинутым аспектам программирования на языках C/C++. Курс записан в 2014 году, лектор — Алексей Петров.
Курс «Основы программирования встраиваемых систем»
Русскоязычный курс, открывающий своим слушателям удивительный мир микроконтроллеров. Среди окружающих нас приборов все сложнее встретить такие, в которых их нет. Часы и светофоры, системы освещения, электронные игрушки и роботы, телевизоры…
«Шелл» на С: пишем командную оболочку для Unix
Многие считают, что сделать программу, которой будут пользоваться миллионы, очень трудно. Однако за любым, даже самым сложным, продуктом всегда стоит простая идея. Одним из них является командная оболочка, или «шелл». В этой статье мы расскажем, как написать упрощенную командную оболочку Unix на C.
Проект не для начинающих: пишем свой текстовый редактор с поиском и подсветкой синтаксиса на C
Предлагаем вашему вниманию серию англоязычных статей, в которой подробно разбирается процесс разработки собственного текстового редактора на языке C.
Графический интерфейс для GDB: обзор инструмента gdbgui
Современный браузерный интерфейс GDB (отладчик GNU) для языков C, C++, Go и Rust. Можно добавлять контрольные точки, просматривать трассировку стека и многое другое. Для этого нужно просто запустить gdbgui из терминала, и в браузере откроется новая…
Компилятор Си в одну инструкцию: обзор инструмента M/o/Vfuscator
M/o/Vfuscator компилирует программы в инструкции mov, и только в них. Инструмент ориентирован на язык Си и архитектуру процессора x86, но адаптивен и легко настраивается под другие языки и архитектуры.
Книги по языку Си для начинающих и не только
Язык Си — это очень мощный язык программирования, и к тому же один из самых популярных. Мы собрали подборку бесплатных книг для его изучения.
Зачем и как эффективно учить язык программирования Си: исчерпывающая подборка ресурсов для освоения
Многим кажется, что язык Си уже устарел. Однако, хоть Си редко встретишь в промышленном программировании, его существованием пронизано в IT буквально все.
Лучшие проекты, в которых стоит поучаствовать, чтобы примкнуть к Open Source движению и развить свои навыки. Часть третья. C, C++
Если вы интересуетесь жизнью Open Source сообщества и хотите к нему присоединиться, то эта серия подборок (которую мы продолжаем пополнять) придётся вам как нельзя кстати, ведь в ней собраны лучшие проекты…
Разбираемся в сложных объявлениях Си
Рассказывает Брайан Барто Выше вы можете увидеть список объявлений на языке Си. Совсем недавно я не мог сказать, что они означают. Теперь же я могу вполне уверенно объяснить их, изучив правила…
9 интересных трюков на Си, с которыми вы раньше не сталкивались
В этой статье мы рассмотрим несколько редких приёмов языка Си. О некоторых из них я раньше не слышал, и вы, скорее всего, тоже. Если ваш преподаватель или коллега хвастаются знанием…
Руководство по созданию ядра для x86-системы. Часть 2. Система ввода / вывода
Рассказывает Arjun Sreedharan В прошлой статье я писал о том, как создать простейшее x86-ядро, использующее GRUB, работающее в защищённом режиме и выводящее на экран строку. В этот раз мы подключим к ядру драйвер…
Два способа использования одноэлементных структур в Cи с пользой
В структурах языка Си очень много странностей, но, по большей части, они предсказуемы, полезны и понятны. Для тех, кто не знаком с Cи: структуры представляют собой наборы данных. Примером их…
Руководство по созданию ядра для x86-системы. Часть 1. Просто ядро
Рассказывает Arjun Sreedharan Давайте напишем простое ядро, которое можно загрузить при помощи бутлоадера GRUB x86-системы. Это ядро будет отображать сообщение на экране и ждать. …
Совершенно правдивая история о настоящем программисте, никогда не изучавшем Си
Рассказывает Уилл Шипли Мой юный друг Сэм – настоящий гений от программирования. Сэм знает Си! Впрочем, нужно сразу сделать пояснение: он еще не дипломированный специалист.
О пользе статического анализатора кода при написании программ
Многие программисты при написании кода совершают ошибки, и каким бы по размеру ни был проект, от незнания особенностей той или иной функции и невнимательности не застрахован никто. Для таких случаев…
Язык программирования Си
практический курс
Что это такое?
В свое время (1991-1992 года), выбрав язык Си в качестве основного языка программирования для математических классов, автор столкнулся с проблемой отсутствия нормальных учебников, которые можно было бы рекомендовать школьникам. Это вынудило его написать свой конспект лекций, который можно было бы назвать «Практический курс программирования на Си» — в него вошли те сведения, которые действительно требовались автору на практике. Многолетний опыт преподавания показал, что конспект действительно востребован и широко используется как школьниками, так и выпускниками.
В качестве среды разработки используется бесплатно распространяемая оболочка Dev-C++ с открытым исходным кодом, включающая компилятор GCC.
Автор будет благодарен за отзывы и конструктивную критику по поводу содержания и оформления этих материалов. Если вы заметили ошибку или у вас есть предложения, замечания, жалобы, просьбы и заявления, пишите.
Лицензионное соглашение
Все опубликованные ниже материалы могут быть свободно использованы в некоммерческих целях при условии сохранения авторства.
Скачивание материалов означает, что вы приняли условия этого лицензионного соглашения.
Скачать
Конспект распространяется свободно в формате PDF. Для просмотра требуется бесплатный просмотрщик Acrobat Reader. Конспект курса условно разбит на 4 части:
- Введение в программирование на языке Си (860 Кб)29.03.2014
Изучение основных конструкций языка и приемов написания программ. - Xранение и обработка данных (792 Кб)21.11.2013
Язык Си: массивы, матрицы, структуры, символьные строки, структуры, рекурсия. - Разработка программ на языке Си (937 Кб)01.03.2014
Приемы проектирования программ, структурное программирование, целочисленные алгоритмы, численные методы, моделирование. - Динамические структуры данных в языке Си (666 Кб)11.06.2009
Списки, стеки, деревья, графы.
Презентации
Для преподавателей и учащихся могут быть полезны презентации, построенные на основе этого конспекта. Их можно скачать на странице Презентации.
Методика
В программе предусмотрено изучение языка Си в 7-11 классах:
Часть I представляет собой расширенный конспект курса 7 класса. Введение в язык Си строится на базе алгоритмической подготовки, которую дети получили в 6 классе, работая с исполнителями.
Основная задача — познакомить учащихся с основными конструкциями языка Си: циклами, условными операторами, процедурами. Весьма успешно проходит изучение разделов, связанных с графикой, анимацией.
Для работы с графикой через браузер можно использовать онлайн-сервис Антона Деникина.
Программа включает следующие разделы (в скобках указана часть конспекта): Массивы (II), Работа с файлами (II), Символьные строки (II), Вращение объектов (III), Моделирование (III). Особое внимание уделяется изучению алгоритмов работы с массивами, в том числе поиска, сортировки и т.п. Дается понятие об эффективности вычислительных методов.
Основное внимание уделяется изучению методов разработки программ на языке Си. Учащиеся выполняют индивидуальное задание, в ходе которого учатся строить графики на экране, знакомятся с преобразованиями систем координат, изучают методы решения уравнений, знакомятся с численными методами, учатся правильно оформлять программы (разделы 1-2 части III). Одно из заданий посвящено использованию метода Монте-Карло для вычисления площади сложной фигуры. Из новых разделов изучаются также Матрицы (II), Массивы символьных строк (II). Вводится понятие указателей и изучаются простейшие операции с ними.
Изучения языка Си выходит на более серьезный уровень. Основные темы — Управление памятью (II), Рекурсия (II), Структуры (II). Предусмотрено изучение языка Паскаль в качестве второго языка программирования. С этого момента алгоритмы на теоретических занятиях записываются поочередно на двух языках.
Изучаются не столько особенности языков, сколько алгоритмы. Основные разделы — Численные методы (III), Моделирование (III), Динамические структуры данных (IV).
Си. ЯзыкС как инструмент системного программирования
Си (англ. C) — стандартизированный процедурный язык программирования, разработанный в начале 1970-х годов сотрудниками BellLabs Кеном Томпсоном и Денисом Ритчи как развитие языка Би. Си был создан для использования в операционной системе UNIX. С тех пор он был портирован на многие другие операционные системы и стал одним из самых используемых языков программирования. Он является самым популярным языком для создания системного программного обеспечения.
Системноепрограммноеобеспечение — это комплекс программ, которые обеспечивают эффективное управление компонентами компьютерной системы, такими как процессор, оперативная память, устройства ввода-вывода, сетевое оборудование, выступая как «межслойный интерфейс», с одной стороны которого аппаратура, а с другой — приложения пользователя.
Системное программирование (или программирование систем) — подраздел программирования, заключающийся в работе над системным программным обеспечением.
Определение «системное» подчеркивает тот факт, что результаты этого вида программирования существенно меняют свойства и возможности вычислительной системы. В то же время бесспорным остаётся тот факт, что в определенной степени этот результат имеет место при применении любых программ, выполняемых в вычислительной системе.
Для языка Си характерны лаконичность, стандартный набор конструкций управления потоком выполнения, структур данных и обширный набор операций.
Язык программирования Си отличается минимализмом. Авторы языка хотели, чтобы программы на нём легко компилировались с помощью однопроходного компилятора, чтобы каждой элементарной составляющей программы после компиляции соответствовало весьма небольшое число машинных команд, а использование базовых элементов языка не задействовало библиотеку времени выполнения. Однопроходный компилятор компилирует программу, не возвращаясь назад, к уже обработанному тексту. Поэтому использованию функции и переменных должно предшествовать их объявление. Код на Си можно легко писать на низком уровне абстракции, почти как на ассемблере. Иногда Си называют «универсальным ассемблером» или «ассемблером высокого уровня»
Си создавался с одной важной целью: сделать более простым написание больших программ с минимумом ошибок по правилам процедурного программирования, не добавляя на итоговый код программ лишних накладных расходов для компилятора, как это всегда делают языки очень высокого уровня, такие как Бейсик. С этой стороны Си имеет следующие важные особенности:
— простую языковую базу, из которой вынесены в библиотеки многие существенные возможности, вроде математических функций или функций управления файлами;
— ориентацию на процедурное программирование, обеспечивающую удобство применения структурного стиля программирования;
— систему типов, предохраняющую от бессмысленных операций;
— использование препроцессора для, например, определения макросов и включения файлов с исходным кодом;
— непосредственный доступ к памяти компьютера через использование указателей;
— минимальное число ключевых слов;
— передачу параметров в функцию по значению, а не по ссылке (при этом передача по ссылке эмулируется с помощью указателей);
— указатели на функции и статические переменные
— области действия имён;
— структуры и объединения — определяемые пользователем собирательные типы данных, которыми можно манипулировать как одним целым.
Вот некоторые особенности других языков программирования, которых не имеет Си:
— автоматическое управление памятью;
— поддержка объектно-ориентированного программирования (при этом первые версии C++ генерировали код программы на языке Си);
— вложенные функции (существуют компиляторы языка Си реализующие эту функцию, например компилятор GNU);
— полиморфизм функций и операторов;
— встроенная поддержка многозадачности и сети;
— функции высшего порядка;
Главным качеством языка C, которое делает его именно языком системного программиста, является то, что «C — это язык относительно «низкого уровня». Это означает, что C имеет дело с объектами того же вида, что и большинство ЭВМ, а именно, с символами, числами и адресами. Чрезвычайно важным свойством языка C, которого нет в других языках, является адресная арифметика. Над данными типа «указатель» возможны арифметические операции, причем в них могут учитываться размеры тех объектов, которые адресуются указателем.
Еще некоторые средства языка не ориентированы непосредственно на низкоуровневое системное программирование, но могут бути очень полезны при разработке системных программ:
обязательной составной частью языка является препроцессор. C не поддерживает сложных структур данных, но позволяет программисту определять свои типы.Включение в программу описания таких типов средствами препроцессора позволяет обеспечить однозначную интерпретацию типов во всех модулях сложного программного изделия;
процедурно-ориентированный язык C вместе с тем представляет все кодовые составляющие программы в виде функций. Это дает возможность применять язык C и як инструмент функционально-ориентированного программирования.
4)Виртуальные машины.Виртуальная машина—программная и/или аппаратная система, эмулирующая аппаратное обеспечение некоторой платформы (целевая, или гостевая платформа) и исполняющая программы для целевой платформы на хост-платформе (платформа-хозяин).
Виртуальная машина исполняет некоторый машинно-независимый код (например, байт-код—машинно-независимый код низкого уровня, генерируемый транслятором и исполняемый интерпретатором ) или машинный код реального процессора. Помимо процессора, ВМ может эмулировать работу как отдельных компонентов аппаратного обеспечения, так и целого реального компьютера (включая BIOS, оперативную память, жёсткий диск и другие периферийные устройства). В последнем случае в ВМ, как и на реальный компьютер, можно устанавливать операционные системы. На одном компьютере может функционировать несколько виртуальных машин.
· Виртуальные машины могут использоваться для:
· защиты информации и ограничения возможностей программ ;
· исследования производительности ПО или новой компьютерной архитектуры;
· эмуляции различных архитектур;
· оптимизации использования ресурсов мейнфреймов и прочих мощных компьютеров;
· упрощения управления кластерами — виртуальные машины могут просто мигрировать с одной физической машины на другую во время работы.
· Тестирования и отладки системного программного обеспечения;
JavaVirtualMachine —виртуальная машина Java, часть среды исполнения Java, выполняющая интерпретацию Java байт-кода.JavaVirtualMachine специфицируется набором команд байт-кода, набором регистров, стеком, сборщиком мусора и пространством хранения методов.Java байт-код – машинно-независимый код, который генерирует Java-компилятор. Байт-код выполняется Java-интерпретатором. Виртуальная машина Java полностью стековая: не требуется сложная адресация ячеек памяти и большое количество регистров. Поэтому команды JVM короткие, большинство из них имеет длину 1 байт, отчего команды JVM называют байт-кодами (bytecodes), хотя имеются команды длиной 2 и 3 байта (средняя длина команды составляет 1,8 байта).
Программа, написанная на языке Java, переводится компилятором в байт-код. Байт-код записывается в одном или нескольких файлах, может храниться во внешней памяти или передаваться по сети. Это особенно удобно благодаря небольшому размеру файлов с байт-кодом. Полученный в результате компиляции байт-код можно выполнять на любом компьютере, имеющем систему, реализующую JVM (в не зависимости от типа какого-либо конкретного процессора и архитектуры ПК). Так реализуется принцип Java: «Написано однажды, выполняется где угодно».
В архитектуре AS/400 сочетаются концепции иерархической архитектуры, архитектуры на базе микроядра, виртуальной машины и объектно-ориентированного подхода. В иерархической структуре самый нижний слой программного обеспечения выделен в, так называемый, Системный Лицензионный Внутренний Код (SLIC) и составляет микроядро. SLIC обеспечивает аппаратную независимость верхних уровней программного обеспечения — приложений и OS/400.
Интерфейс микроядра — в AS/400 он называется MI (machineinterface — машинный интерфейс) — обеспечивает функционально полную систему команд, в символьном виде представляемую высокоуровневым языком ассемблера. Таким образом, MI предоставляет лежащему выше программному обеспечению интерфейс некоторой виртуальной машины. И приложения, и сама ОС OS/400 разрабатываются на уровне MI (или выше), не имея доступа к интерфейсам, лежащим ниже MI, в том числе, и к командам реального процессора. Переносимость программного обеспечения — приложений и ОС — обеспечивается на уровне MI-кодов. MI-код не является непосредственно исполняемым, он должен быть переведен в команды реального процессора. Однако, процесс трансляции расположен ниже уровня MI, он совершенно прозрачен для приложений и для ОС. Среди команд MI имеются как команды, близкие к обычным машинным командам, оперирующие байтами, словами, числами и т.п., так и команды, оперирующие с интегрированными структурами данных — объектами, обрабатываемыми микроядром. Впрочем, «обычные» команды MI также можно назвать объектно-ориентированными: команды содержат не собственно данные, а ссылки на объекты, содержащие наряду с самими данными и описания их типа, размера и т. п.
AS/400 отличается значительной степенью системной интеграции и высоким уровнем системных интерфейсов. Ряд системных функций в AS/400 выполняются SLIC (лежат ниже уровня MI), ряд — OS/400, выполнение же большинства функций распределено между ОС и микроядром.
Модель языка Си
Чтобы эффективно использовать язык программирования нужно хорошо представлять его модель, то есть основной принцип построения программы. Теоретически можно на любом языке использовать любую модель, но в этом случае программировать будет сложно, так как язык не будет помогать в этом.
Поэтому разберемся с моделью языка Си:
- Для чего язык Си был разработан?
- Как выглядит программа с точки зрения языка Си?
- Какие практические советы из этого следуют?
1. Цель создания языка C
Деннис Ритчи разработал язык C для решения двух задач:
- Язык должен как можно более эффективно транслироваться в машинные коды, для обеспечения максимальной производительности.
- Язык должен быть максимально переносимым на любые платформы.
Обе поставленные задачи были полностью решены. В 1972 году появился первый вариант языка C.
В настоящее время язык С является языком, который обеспечивает максимальную производительность программы. При необходимости программист может использовать в теле программы язык ассемблера, что позволяет добиться максимально возможной производительности в критических местах программы.
Также язык С в настоящее время реализован практических на всех компьютерных платформах и операционных системах.
Какую же модель языка выбрал Деннис Ритчи?
2. Модель С
С точки зрения языка С программа — это суперфункция. Она может содержать неограниченное число вложенных функций.
В этом язык С отличается, например, от языка C++, в котором программа представляет собой суперкласс, от которого наследуются остальные классы.
3. Модель функции в языке С
Как же устроена функция? Для программиста функция — это черный ящик, который на входе берет аргументы функции, а на выходе возвращает результат.
Для программиста совершенно неважно, что происходит внутри функции. Так как аргументы передаются функции по значению, то они во время работы функции поменяться не могут.
Поэтому все, что должен знать программист — это интерфейс функции, то есть описания типов передаваемых и возвращаемого значения.
Отсюда следует важный принцип языка С — принцип изоляции кода.
4. Изоляция кода в языке C
Изоляция кода — это такой принцип построения программы, который предполагает, что между фрагментами программы нет скрытых связей.
Например, предположим, что программист Иванов вызывал функцию, которую написал программист Петров. При этом и у Иванова, и у Петрова есть переменная с именем X. Она же используется в качестве аргумента функции.
Если бы данные передавались по ссылке, то после вызова функции переменная X у Иванова непредсказуемо изменила бы свое значение. В результате ошибку было бы очень трудно найти.
Для исключения подобных ситуаций в языке С предусмотрено несколько видов защиты:
- Передача по значению.
- Области видимости переменных.
- Директивы условной компиляции и т.д.
Поэтому при разработке больших программных комплексов, где участвуют множество разработчиков обязательно должны быть соглашения, которые полностью поддерживают принципы изоляции кода.
5. Избыточность языка С
Популярность языка С привела к тому, что все больше разработчиков стали использовать этот язык. В язык стали добавляться все новые конструкции. Язык распухал и становился все более и более громоздким.
В конце концов в язык было добавлено также программирование с классами, но к счастью, это уже было выделено в самостоятельный диалект языка C, который получил название C++.
В языке C++ другая модель языка и другой подход к программированию, который получил название объектно-ориентированное программирование (ООП).
Но все равно в язык С добавили столько возможностей, что это привело к тому, что в настоящее время язык С — это один из наиболее больших и громоздких языков. Это сильно повышает порог вхождения для начинающих.
К счастью, 90% возможностей языка Си избыточны и вам никогда не понадобятся.
Например, есть громадная таблица приоритетов операторов C.
Но нет никакого смысла ни знать про эту таблицу, ни в разбираться в ней. Я специально сделал ее очень маленькой, потому что вся информация в этой таблице абсолютно лишняя.
Для правильного использования приоритетов нужно всего лишь расставить скобки. И все!
Компилятор будет следовать вашим скобкам, а не этой таблице.
Хотя во многих учебниках рекомендуется выучить эту таблицу наизусть, чтобы сократить число скобок.
А теперь представьте ситуацию: вы вызубрили эту таблицу, написали выражение без единой скобки, а потом смотрите на это выражение через пару лет и пытаетесь в нем разобраться.
Вам захочется сказать: «Зачем я вообще этим занимался?!»
Большинство возможностей языка С похожи на эту таблицу: большие, страшные и бесполезные.
6. Командная разработка с помощью C
Язык С изначально создавался для разработки больших программных комплексов, поэтому в язык уже встроены средства организации командной работы. Это функционал заголовочных файлов (.h).
Для чего они нужны?
Если к разработке приступает команда разработчиков, то необходимо с самого начала дать каждому программисту фронт работ. Но возникает серьезная проблема: если функция, которую пишет Иванов, требуется Петрову, то Петров будет сидеть и ждать, пока Иванов ее напишет.
Тут на помощь приходит изоляция кода. Для начала работы Иванову нужно только записать интерфейс будущей функции в заголовочном файле. А реализацию функции сделать пока пустой. Это называется «поставить заглушку».
Так как в С имеет значение только вход и выход, то Петров может тут же приступать к работе и вызывать функцию Иванова. Таким образом вся команда может приступать к работе незамедлительно.
Каркас будущей программы можно создать очень быстро, а потом постепенно реализовать весь функционал.
7. Иерархия структур данных в С
Иерархия структур данных — это одна из самых мощных возможностей языка C. В языке С можно с легкостью создавать любые, сколько угодно сложные структуры данных.
К сожалению, произошла путаница в терминологии. Раньше программными объектами назывались любые конструкции в языке программирования. Но с появлением языка C++ стали называть объектами экземпляры классов.
Хотя в языке С объектами изначально назывались структуры данных.
Поэтому для избежания путаницы будем называть эти структуры объектами данных.
Рассмотрим фрагмент иерархии объектов данных библиотеки GTK+
Как вы видите весь оконный интерфейс представлен в виде иерархии объектов данных, что позволяет легко и быстро работать как с любым конечным объектом, так и с любым вышестоящим объектом.
Подобная иерархия реализована в библиотеке Win32API для программирования под Windows, и во многих других программных системах.
8. Сильное абстрагирование в С
Функциональный принцип в сочетании с иерархией структур данных позволяет очень быстро создавать любые абстракции. Именно поэтому на языке С написаны множество других языков программирования.
В качестве основного инструмента абстрагирования в языке С применяются библиотеки. Например, в самом языке нет команд работы с графикой. Но программист может подключить любую графическую библиотеку (например, Cairo) и обращаться к ее функциям и объектам данных, так же легко, как и к любым функциям и структурам данных, написанных на языке C.
Уровень абстракции ничем не ограничен. Так, если программисту нужно написать оконный интерфейс для Windows, то достаточно добавить строчку: