Чтобы эффективно использовать язык программирования нужно хорошо представлять его модель, то есть основной принцип построения программы. Теоретически можно на любом языке использовать любую модель, но в этом случае программировать будет сложно, так как язык не будет помогать в этом.
Поэтому разберемся с моделью языка Си:
- Для чего язык Си был разработан?
- Как выглядит программа с точки зрения языка Си?
- Какие практические советы из этого следуют?
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, а потом уже код, написанный на других языках программирования.
Вы можете спросить: «Получается, что язык С самый лучший?»
Нет. Если бы самый лучший язык существовал, то все писали бы только на нем. Языков программирования много именно потому, что для каждой ниши есть свой язык, который идеальной соответствует этой нише.
Поэтому программисту и приходится знать несколько языков, чтобы выбирать самый эффективный для решения конкретной задачи.
Можно ли стать программистом за год с нуля?
Читайте в моей бесплатной мини-книге «Путь в программисты». Скачать её можно здесь.