Для чего идут изучать язык С?
Привет, хабровчане! Наши преподаватели — Виктор Коробков, эксперт с 15-летним стажем в IT, и Андрей Кравчук, разработчик в RavenPack International, рассказали, почему язык C до сих пор актуален, и зачем его осваивать тем, кто занимается разработкой на других языках. Статья подготовлена специально в преддверии старта нового практического онлайн-курса «Программист C», чтобы помочь разобраться, пригодятся ли эти навыки вам.
Добрый день! Я Андрей, более 10 лет занимаюсь коммерческой разработкой, начинал с C и C++, затем перешёл на Python, и весьма часто в повседневной работе меня выручают знания C. Мой коллега и руководитель курса Виктор Коробков уже более 15 лет в IT индустрии, начинал с программирования на Delphi, C/C++ и сейчас специализируется на базах данных. Сегодня я подготовил краткий обзор о возможностях и перспективах языка C для разработчиков в настоящее время и о том, что вас ждет в нашем курсе.
Зачем изучать язык C?
На язык С многие молодые специалисты смотрят как на доисторическое ископаемое. Еще бы, ведь он существует уже практически полвека. И этот факт ставят ему не в плюс, а, наоборот, минус, заявляя, что решать современные задачи на языке, созданном в далекие 1970-е годы неэффективно, несовременно и немодно.
Но что показывает упрямая вещь под названием «статистика»? Если посмотреть рейтинг TIOBE, то С уже долгие годы никогда не опускается ниже 2-го места, а в январе 2021 года по итогам 2020 года он опять стал первым. В рейтинге PYPL С/С++ постоянно входят в пятерку языков, по которым наиболее часто ищется информация в поисковике Google. Если выполнить запрос «программист С» на одном из крупнейших сервисов по поиску работы в России HeadHunter, можно увидеть, что такие специалисты требуются во многих городах.
Можно выделить 4 основных повода освоить C:
Получить понимание основ того, как «под капотом» работают ОС, системное ПО, популярные программные продукты — такие как Nginx, PostgreSQL, Redis и т.д.
Для взаимодействия с библиотеками, написанными на C, с помощью механизмов FFI.
Для написания программ с бескомпромиссным быстродействием.
Для низкоуровневого программирования различных устройств, например, Arduino, мощности которых не хватает ни на какие другие языки.
Пожалуй, основное преимущество C — предельная «близость к машине». Это язык достаточно высокого уровня для того, чтобы была возможность выражать в нем некую бизнес-логику и сущности предметной области, но при этом он достаточно низкоуровневый для того, чтобы иметь предельный контроль над тем, как эта логика и сущности обрабатываются процессором.
Зарплата у хороших спецов по C, как правило, выше, чем в сфере web-программирования (особенно если речь идет не про российские НИИ, а про компании вроде NVidia, Intel и др.).
Стоит, конечно, признать, что зарплаты на начальном этапе программистам на С предлагают на порядок меньше, чем на Python или Java. Но даже при устройстве на работу разработчиком на Python для соискателя большим плюсом является знание языка С – работодатели это очень ценят. Из всего вышесказанного можно сделать вывод, что сообщества работодателей и программистов всего мира не только не забывают язык С, но и постоянно использует его в той или иной мере.
В настоящий момент заметен дефицит специалистов, способных решать практические задачи на C. Дело в том, что раньше на C учили в вузах, сейчас же студенты чаще осваивают программирование на Python, Java или C#. Такие студенты могут более-менее владеть базовыми навыками программирования, но не разбираться в углубленных основах. Если копнуть глубже, начинаются проблемы. Именно эти проблемы в разных сферах разработки мы будем разбирать на курсе и учиться с ними справляться.
Наконец, C может быть полезен программисту на любом языке для расширения кругозора. Он помогает понять, какие «шестеренки» лежат на низком уровне в основе другого языка. Дает возможность оптимизировать код путем переписывания чувствительных к быстродействию фрагментов программ на C, а также взаимодействовать с произвольными третьесторонними библиотеками через FFI.
Ну и в завершение, есть возможность уйти в «железную» сферу, но тут уже нужны более специфичные знания (Verilog и прочее).
Знания C также необходимы администраторам Linux-систем, т.к. любая UNIX-система (Linux в том числе) по большей части написана на этом языке. Сисадмин, знающий C, глубже понимает устройство ОС, может справляться с неожиданными проблемами эксплуатации и предлагать более оптимизированные решения.
На онлайн-курсе «Программист C» мы готовим студентов использовать C на практике и решать задачи Middle-уровня. Мы рассмотрим устройство UNIX-подобных ОС и сопутствующего инструментария. Дадим практические советы по написанию конкретных классов программ: веб-сервисов, демонов, игр, взаимодействия с БД, конкурентного программирования (многопоточных и многопроцессных программ).
Другая интересная особенность курса в том, что мы кратко рассмотрим аналоги ООП в C, хотя традиционно считается, что ООП в C не бывает.
Для специалистов в IoT направлении будет интересен раздел программирования микроконтроллеров.
В конце курса вы реализуете полноценный проект на C: это может быть какая-то ваша рабочая задача, своя идея или предложенная нами тема.
Стартуют занятия 29 января, но присоединиться можно в течение февраля. В первый месяц мы проходим базовые знания и разбираем современный язык C. Дальше углубляемся в его возможности и изучаем нюансы применения в разных сферах.
Погружаемся в язык мы достаточно основательно, поэтому если вам нужна исключительно базовая теория, наша программа будет избыточна. В этом случае достаточно пройти какой-то из популярных учебников или видео для начинающих.
А наш курс будет актуален для того, кто:
Уткнулся в пределы быстродействия используемого им языка программирования, например, Python.
Хочет задействовать в другом языке, опять же к примеру в Python, стороннюю библиотеку, написанную на C, и сталкивается с проблемами взаимодействия между языками.
Хочет подробнее узнать, как программы взаимодействуют с ОС и предоставляемыми ей ресурсами.
Хочет начать разрабатывать под микроконтроллеры и развиваться в IoT-направлении
Хочет заниматься системным программированием.
Если что-то из этого про вас — переходите на страницу курса, проходите вступительный тест и присоединяйтесь к группе. А если остались вопросы, после прохождения теста вам откроется доступ к закрытому чату в Slack, где вы сможете задать нам с Виктором свои вопросы. До встречи на занятиях!
Для чего хорош Си?
Си применяют в сферах, где важен код, наиболее тесно взаимодействующий с «железом». Под влиянием Си появились языки C++, C#, Java и Objective-C.
Си иногда называют подмножеством C++ или «C++ без классов», но это не совсем верно. Почему это не так, можно узнать в статье про C++.
Си поддерживает исключительно процедурное программирование. Никаких классов, ООП, наследования — только функции и структуры. К основным особенностям языка относятся:
- доступ к памяти через указатели (особые переменные, в которых хранится адрес объекта);
- активное использование структур и объединений;
- чистый стиль программирования (код проще отлаживать, но сложнее писать).
Си обычно используется в довольно специфичных и сложных задачах, потому что более лёгкие задачи проще сделать с помощью высокоуровневых языков. Мы отобрали несколько наиболее популярных применений Си.
Оптимизация участков кода на C++
Объектно-ориентированные возможности C++ часто обходятся дороже, чем «чистый Си», так как расходуют больше ресурсов (в частности оперативной памяти). Поэтому иногда код в стиле Си может быть эффективнее. Если нужно заставить какой-либо алгоритм работать быстрее — используйте процедурный стиль и откажитесь от встроенных инструментов C++ для ООП, например от полиморфизма.
Но если нужна действительно высокая скорость, лучше переписать часть кода на ассемблере.
Информационная безопасность
Сюда относятся сложные хакерские приёмы. Среди них:
- Использование уязвимостей: переполнения буфера, двойные удаления (повреждения кучи).
- Инъекция (сокрытие) кода. Если получить доступ к другому процессу, используя уязвимость, то можно спрятать свой код внутри чужого и заставить процесс выполнять его. Теперь скрытый код будет жить в «невинном» процессе, спрятанном от глаз пользователя.
- Перехват (hooking). Если вы хотите мониторить чьи-то взаимодействия с системой (нажатие клавиш, открытие файлов), вам, как правило, нужно вызывать отслеживающий код всякий раз, когда пользователь что-то делает. Для этого вы заменяете какой-либо фрагмент API операционной системы вашим кодом.
Почти для всех этих применений используется PIC код (position-independent code — код, не зависящий от адреса). Он может выполняться в любом месте памяти, независимо от того, где находится и кто его запустил. У PIC-кода нет доступа к глобальным переменным и таблицам, поэтому C++ для его написания не подойдёт (классам C++ нужны глобальные таблицы для реализации наследования).
Код ядра
Код, который выполняется в режиме ядра (kernel mode) имеет полный доступ к памяти и оборудованию: RAM, GPU, жёсткому диску. В режиме ядра работают:
- Аппаратные драйверы — здесь без доступа к железу не обойтись. Драйверы являются посредниками между пользовательским кодом (не в режиме ядра) и оборудованием.
- Ядро операционной системы. На Си, кстати, написано множество ядер ОС, в том числе Unix и Android.
Использовать для всего этого код на C++ почти невозможно, поскольку в режиме ядра нет доступа к тем же глобальным таблицам, о которых говорилось выше. Иногда в режиме ядра тоже необходим PIC код — например для загрузчика (bootloader). Загрузчик — самая первая программа, выполняющаяся при запуске ПК. Биос извлекает её из жёсткого диска, помещает в память и говорит процессору запустить эту часть памяти.
Embedded-разработка
Для программирования встраиваемых систем часто используется как Си, так и C++. Но Си имеет преимущество, поскольку позволяет разрабатывать встроенное ПО при ограниченных ресурсах — например когда у микроконтроллера очень мало RAM. Помимо Си также может пригодиться знание ассемблера (как вариант, ARM-ассемблера) для написания ассемблерных вставок, чтобы ещё больше оптимизировать код и получить доступ к специфичным инструкциям процессора.
Языки C и C++. Где их используют и зачем?

Сфера применения C и C++ на удивление широка. Даже в сегодняшнем мире, несмотря на всё многообразие современных надёжных инструментов, эти два языка программирования остаются незаменимыми. Давайте же выясним, какие популярные приложения написаны на этих языках и зачем нам использовать их сегодня.
Когда и зачем используются C и C++ ?
1. Операционные системы
Язык C первоначально создавался для системного программирования, поэтому не удивительно, что его так активно применяют при создании операционных систем и программного обеспечения.
Быстрый и энергоэффективный, он достаточно близок к аппаратному слою, что позволяет работать с кодом низкого уровня.
Вот почему он идеален для разработки операционных систем.
Любая операционная система в первую очередь должна быстро запускаться и эффективно управлять системными ресурсами. Например, Linux, Microsoft Windows, Mac OS полностью написаны на языке C, а Android и iOS — частично.
Разработчик на языке C может реализовывать все структуры данных самостоятельно, производя тонкую настройку мельчайших деталей операционной системы. Такая высокая гибкость — весомый аргумент в пользу языка.
В отличие от других языков программирования, язык C не имеет зависимостей времени исполнения. Это означает, что программа может выполняться силами аппаратных средств без участия менеджера памяти, входного или выходного слоя.
2. Программирование встроенных систем
Язык программирования C просто необходим при проектировании встроенных систем.
Главным образом из-за высокой производительности и простоты использования. Язык C очень экономичен в потреблении ресурсов системы, благодаря чему программа выполняется быстро. В результате встроенные системы работают в реальном времени без замедления.
Ещё важнее здесь — код на C, будучи платформенно-независимым, не связан с каким-либо конкретным микропроцессором или системой. Так что встроенную программу можно скомпилировать в разных устройствах и платформах с незначительными изменениями или вовсе без них.
Вот почему беспилотные автомобили, умные часы, сенсоры и устройства, использующие технологию Интернета вещей (например, кофемашины), имеют встроенное ПО, целиком написанное на C или C++. В связанных системах C позволяет работать непосредственно с ресурсами памяти и править любую часть кода.
3. Разработка игр и игрового движка
Производительность крайне важна для игры, поэтому выбор языка программирования здесь ограничен.
Являясь самым быстрым на сегодняшний день языком программирования, С++ оказывается одним из лучших для игр в 3D, многопользовательских и других.
Например, Counter-Strike, StarCraft: Brood War, Diablo I, World of Warcraft — все эти игры написаны на C++. Не говоря уже о консолях Xbox и PlayStation, в основе которых лежит программирование C++.
В ядре игрового движка Unity — самого популярного движка для создания видеоигр под несколько операционных систем одновременно — также использовался C++.
Средства разработки C++ могут совладать даже с самой сложной игровой графикой. Они позволяют оптимизировать и регулировать то, как именно будут использоваться ресурсы памяти и структуры данных в игре.
4. Разработка настольных и кроссплатформенных приложений
C++ также можно использовать для создания настольных приложений. Всё благодаря превосходным кроссплатформенным средствам разработки (иногда называемым фреймворками), таким как Qt. Оно позволяет нацелиться на Windows, Linux, macOS, Android и встроенные системы — все c единой кодовой базой. Так что разработка приложений с помощью Qt оказывается отличным решением для тех, кто хочет сэкономить на времени и стоимости программирования.
Стоит упомянуть и о библиотеке SDL, нашпигованной функциями, позволяющими создавать приложения одновременно для Windows, Linux, Android, MacOS и iOS.
Кстати, Photoshop, Illustrator и Adobe Premiere целиком написаны на C++.
Какие ещё есть приложения?
В Facebook перевели часть кода из PHP на язык C++, чтобы сократить затраты электроэнергии в расчёте на одного пользователя. Возможно, облачные системы хранения, базы данных, драйверы устройств и другие виды ПО тоже используют C++.
Сюда также можно отнести банковские и другие приложения, обладающие высокой степенью многопоточности и низким периодом ожидания. Словом — всё, что должно работать быстро и без проблем.
Выводы
Принимая во внимание всё вышесказанное, будем считать, что языки C/C++ вполне годятся для:
- разработки операционных систем,
- программирования встроенных систем,
- разработки игр,
- разработки баз данных,
- разработки настольных и кроссплатформенных приложений (с помощью средств C++).
Также можно отметить, что в проектах, имеющих дело со сложными типами данных, разработка ПО с использованием C++ предотвращает перегрузку данными и похожие проблемы.
Так что, если вы спросите:
Почему мы до сих пор используем C/C++?
Есть короткий ответ: C и C++ гибкие, очень быстрые и эффективные. К тому же они ближе к машинному коду, чем любой другой язык программирования. Именно поэтому в некоторых случаях эти языки просто незаменимы.
Так что наш прогноз таков: в ближайшем будущем язык C не сойдёт с технологической арены. Особенно по причине роста количества устройств, поддерживающих технологию Интернета вещей, а эти устройства крепко завязаны на управлении машинным кодом и памятью.
Язык программирования С++: чем он отличается от С, где его применяют и подходит ли он для старта

C++: что это за язык, как он появился и какие у него преимущества
В 1980-х годах датский программист Бьерн Страуструп моделировал распределение вызовов между телефонными станциями. Работал он на языке С, похожем на машинный код в виде инструкций из двоичного кода.
Язык С не устраивал Страуструпа: был слишком медленным и не поддерживал объектно-ориентированное программирование — то есть не мог представить программу как набор объектов, не был понятным и наглядным.
Тогда Страуструп решил усовершенствовать С, скрестив его с другим ретро-языком Simula. В C++ появились классы, строгая проверка типов, inline-функции и другие элементы, которые упрощают и ускоряют программирование.
Сначала усовершенствования воспринимались просто как надстройка над базовым языком. Но очень быстро «С с классами» стал надежным рабочим инструментом для миллионов разработчиков.

- Скорость. С++ обрабатывает данные быстрее большинства высокоуровневых языков типа Python.
- Кроссплатформенность. В отличие от многих языков, в том числе от еще более высокоуровневого С#, С++ не зависит от платформы: разработку можно легко перенести с одной операционной системы на другую.
- Универсальность. С++ поддерживает множество стилей программирования, например, процедурное программирование, объектно-ориентированное программирование. Также С++ предоставляет абстракцию данных. Благодаря этому его можно использовать для решения практически любых задач».
Читайте также: «История IT. 1970: События, люди, технологии»: Павел Калашников про запуск UNIX-времени, создание Pascal и патент на компьютерную мышь
Что пишут на С++
На C++ создают высоконагруженные приложения, драйверы, графические стандарты и игры. Например, на С++ написана система управления базами данных MySQL — основа для множества высоконагруженных приложений, — главные продукты Microsoft, культовые игры Counter Strike и World of Warcraft.
На С++ пишут код, который должен работать быстро и надежно, поэтому язык часто является основой для балансировщиков нагрузок на серверах и сложных графических алгоритмов. На C++ можно написать код для GPU — графического процессора. Так, например, создаются шейдеры для игр и графического ПО: они параллельно запускаются на GPU и позволяют без задержки выполнять сложные вычисления.
На С++ можно писать сложные, нетривиальные алгоритмы — для этого у языка есть огромная библиотека STL (Standard Template Library), где реализована большая часть алгоритмов и структур данных. Иногда С++ используют, чтобы оптимизировать код, добавить ему скорости и производительности или настроить приложение под конкретные платформы.

«Несмотря на универсальность, у языка есть и свои ограничения. Например, на С++ неудобно обрабатывать логи — файлы с информацией о действиях в программе — или собирать серверную статистику. Писать алгоритмы для машинного обучения или серверы для обработки запросов тоже будет сложно: в первом случае больше подойдет Python с большим количеством фреймворков, во втором — Java или C#».
Существует миф, будто С++ подходит только для сложных приложений, потому что даже простые операции, написанные на нем, выглядят как сложные команды. Но эти проблемы легко решить благодаря огромным библиотекам с открытым исходным кодом по С++, которые содержат много вспомогательных функций и серьезно упрощают работу. Поэтому писать на С++ можно что угодно: и большой высоконагруженный сервис, и несложные программы для вычисления площади или решения систем алгебраических уравнений.
Что нужно знать разработчику на C++

«Если вы планируете карьеру С++ разработчика — учите общие алгоритмы и структуры данных. Без них не обходится ни одно собеседование.
Если захотите писать код на С++ и заниматься сложными вычислениями, придется разобраться в параллельном программировании, когда команды выполняются одновременно несколькими процессорами. Также нужно будет изучить открытый стандарт для распараллеливания OpenMP. Инженерам по разработке ПО важно знать дискретную математику, статистику, алгоритмы.
Еще одно направление развития — компьютерная графика и геймдев, где нужно писать шейдеры и OpenGL. Здесь пригодится знание сопряжений с OpenCL — фреймворком для параллельных вычислений в графических процессорах — или CUDA, компилятора с расширениями, необходимыми для написания кода на GPU».
Читайте также: Что нужно знать программисту перед собеседованием и как успешно его пройти
Подходит ли C++ для начинающих
Есть еще один не менее распространенный миф о С++. Говорят, что это сложный язык, который не подходит для старта в профессии.
Легко понять, почему его называют непростым. Вот пример классической программы «Hello, World!» на С++:
А это пример кода на Python:
Вот что говорит о сложности языка создатель языка Страуструп:
«C++ действительно непрост, и чтобы научиться его использовать, необходимо приложить определенные усилия. Но людям вообще хочется невозможного: еще более простого языка, с еще большим количеством фич и сохранением работоспособности существующего кода».
С++ может стать отличным стартом в IT, но только если вы готовы приложить усилия. В отличие от многих высокоуровневых языков — Python, Java — он не такой «удобный». Код не читается интуитивно, приходится самому работать с памятью: следить, чтобы не было утечки данных и освобождать место для работы программы. Для этого сначала нужно разобраться с основами устройства компьютера.
Но усилия многократно окупаются ростом уровня подготовки. С С++ можно начинать, если вы настроены серьезно и готовы копать глубоко. Этот язык даст отличную базу, которая поможет уверенно двигаться вперед и решать проблемы не только на уровне кода.

«На мой взгляд, C++ — оптимальный язык для старта, потому что он дает базу. Если человек хочет быть разработчиком и разбираться в этой теме глубоко, то не стоит начинать с языков с низким порогом вхождения, таких как Python или JavaScript.
Конечно, на их основе быстрее можно научиться программировать. Но из-за простоты этих языков можно легко упустить важные вещи и не знать в итоге, как устроена память, адресация и многое другое. Это сложно, но важно. По моему опыту, людям, которые начинали, скажем, с Python, потом сложнее глубоко погружаться и разбираться, почему программа так и не работает».
Можно ли стартовать сразу с С++, не изучая С
Эта тема — предмет вечных дискуссий в комьюнити. Одни — и в их числе сам Страуструп — говорят, что С учить не обязательно. Вполне можно стартовать сразу с С++, где не нужно работать напрямую с символами и памятью и тратить время на сложности, с которыми пришлось бы возиться в С.
Чтобы увидеть разницу, посмотрите, как выглядит на С создание email-адреса:
А вот как это же действие выглядит на С++. Никаких сложных операций с символами и памятью:
Другая точка зрения: на примере С лучше разбираться в базовых теоретических вещах, поэтому для тех, кто «копает глубоко», лучше подойдет последовательное изучение обоих языков.
Посмотрите, как разработчики решают задачу из олимпиадного программирования на языке С пятью разными способами. Судя по их решениям, кажется, что зная С, можно потом без проблем выучить многие другие языки — настолько хорошую базу знаний дает этот язык.

«Вопрос в том, чего вы хотите достичь. Если нужно глубоко разобраться в теме, то лучше сначала изучить C. С его помощью можно разобраться с базовой архитектурой компьютеров и теоретическими основами, включая побитовые операции, обращение с динамической памятью и числами с плавающей точкой. Мы обычно преподаем именно так: даем фундамент, а на второй год изучения переводим студентов на С++ с его особенностями и фишками».
Что популярнее: С или С++
Как С, так и С++ уже который год стабильно входят в топ-5 самых популярных языков. Причем одни индексы оценивают их по отдельности, другие включают в общую категорию.
Например, по данным индекса TIOBE в ноябре 2022 года С находится на втором месте, уступив самому популярному языку в мире Python. С++ отстал от С на два пункта и занял четвертое место.
В исследовании Stack Overflow за 2022 год, наоборот, С++ находится на шестом месте, а С — на седьмом.
А вот в индексе PYPL оба языка попали в одну категорию и находятся на четвертом месте, уступая другому родственному языку — C#.
Изучите основы языка C У Хекслета есть платформа для изучения основ программирования с нуля — Code Basics. Пройдите бесплатный курс по изучению языка С. Обучение на Code Basics начинается с азов, информация структурирована и подается от простого к сложному.
Сколько зарабатывает разработчик С++
На С++ пишут практически во всех крупных компаниях, поэтому он может стать хорошим инструментом для карьерного роста.
Уровень зарплаты зависит не только от опыта, но и от знания фреймворков, алгоритмов, библиотек. Исходя из вакансий, опубликованных на HeadHunter, в среднем джуниор-разработчик может претендовать на зарплату 120-150 тыс. рублей, а мидл- и сеньор-разработчик — от 200 тыс. рублей.


Как и с чего стартовать в С++: книги и ресурсы
Перед погружением в язык изучите базовую теорию по объектно-ориентированному программированию — это поможет быстрее погрузиться в тему.
Для тех, кто решит начать с изучения языка С:
- Герберт Шилдт «Полный справочник по С»
А если захотите стартовать сразу в С++, пригодятся книги:
- Герберт Шилдт «Полный справочник по C++»
- Бьерн Страуструп «Язык программирования C++»
- Бьерн Страуструп «Программирование. Принципы и практика использования C++»
В процессе изучения языка не забудьте про библиотеки STL и BOOST:
- Питер Нортон Скотт Мейерс «Эффективное использование STL»
- Николай Джосьютис «C++ Стандартная библиотека. Для профессионалов»
- П. Плаугер, А. Степанов «STL. Стандартная библиотека шаблонов C++»
А еще здорово помогут:
Изучите основы C на Хекслете На Хекслете есть бесплатный курс по основам C. Пройдите его, чтобы познакомиться с концепциями одного из самых популярных языков и заложить фундамент для изучения С-подобных языков.