Чтобы эффективно использовать язык программирования нужно хорошо представлять его модель, то есть основной принцип построения программы. Теоретически можно на любом языке использовать любую модель, но в этом случае программировать будет сложно, так как язык не будет помогать в этом.
Поэтому разберемся с моделью языка Си:
- Для чего язык Си был разработан?
- Как выглядит программа с точки зрения языка Си?
- Какие практические советы из этого следуют?
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, то достаточно добавить строчку:
1 |
#include <windows> |
и весь функционал Windows доступен в наборе функций.
Если хочется подняться на абстракцию выше, то достаточно подключить библиотеку GTK+ и можно писать кросс-платформенные программы.
Такое сочетание универсальности и сильного абстрагирования привело к тому, что в настоящее время крупные программные проекты, такие как операционные системы, базы данных, графические программы и т.п., в основном разрабатываются на чистом C.
Более того, если вы оглянетесь вокруг себя, то вся компьютерная техника: ПК, ноутбуки, смартфоны, планшеты, роутеры и т.д. при нажатии кнопки включения сначала запускает код, написанный на C, а потом уже код, написанный на других языках программирования.
Вы можете спросить: «Получается, что язык С самый лучший?»
Нет. Если бы самый лучший язык существовал, то все писали бы только на нем. Языков программирования много именно потому, что для каждой ниши есть свой язык, который идеальной соответствует этой нише.
Поэтому программисту и приходится знать несколько языков, чтобы выбирать самый эффективный для решения конкретной задачи.
Сложно написано для простоты понимания,не для новичка,много не понятных оборотов и терминологии,похоже автор сам себя экзаменует(повторение мать учения)
статья понравилась, спасибо.
достаточно просто о сложном
А можно ли на С написать программу для визуального построения кристаллических структур? На Visual Bacic мне удалось сделать геометрические построения на экране.
Используйте библиотеку Cairo.
Здравствуйте.
Можете ли дать ссылку для изучения языка С. Когда то программировал на Ассемблере, Фортране, Pl/I, Algol, Basic , ЯАП (Язык Алгоритмического программирования для Наири-2). Хочу заново начинать программировать в 68 лет…
Заранее, благодарен.
Курс «Азбука программирования на языке Си»
Хорошо написано! Мне понравилось! Не отмечено, что в С есть чёткая типизация данных, а так же есть возможность их приведения к различным типам. Нет ничего про указатели на данные и функции (для классического С). Нет упоминания условной трансляции (#ifdef #else #endif), что очень важно для переносимости кода на разные платформы и ОС. Спасибо.
Вы правы, Си — это мощный язык и включает много возможностей. Но цель статьи — не перечисление всего функционала языка Си, а только описание его модели.
Спасибо.
Когда меня учили программированию то, говорили: -«Важной задачей программиста является не только знание: грамматики, синтаксиса и семантики языка, но и умение выбрать правильно тот язык программирования, который наилучшим способом подходит для решения той или иной задачи». Исходя из этого хорошо бы было перечислить задачи для которых Си(C++) подходит наилучшим образом и в тоже время показать, где лучше применять его диалекты (C#, JS, java).
Спасибо.
написано не для новичка
Знание формул, ещё не говорит о том, что вы умеете решать задачи. Точно так же знание языка, совсем не говорит о том, что вы умеете программировать! Но в тоже время знание языка позволяют писать более эффективный код.
Когда начинается программирование? После написания «Миру мир», или после 10 страниц собственного кода, или после первых 10 тысяч строк — трудно сказать. По моему программирование начинается, когда вы перестаете видеть код, а начинается видеть ассоциативное представление программы, например, как спектакль со сценой, декорациями, действующими лицами, их реплики и реакцией на них.
Удачи всем!
P.S. Кисть держать может практически каждый, но не каждый художник! Программировать — это тоже искусство, а не чистая математика!
Здравствуйте Константин!
Вопрос по языку Си.
Пишу функцию по обработке строки. На выходе должна быть обработанная строка, поэтому тип функции «char *…». Функция внутри работает нормально и буквально перед командой «return» проверка показывает необходимый результат, однако результатом самой функции выходит что-то несуразное. С чем это может быть связано?
И ещё… Хотелось бы больше материалов по GTK+ (в частности примеры по перетаскиванию данных [Drag-and-drop], по работе со списками и т.п.).
Заранее благодарю.
> результатом самой функции выходит что-то несуразное.
Пришлите скриншот ошибки на info@sheremetev.info
>Хотелось бы больше материалов по GTK+
Учту Ваше пожелание.