Включите исполнение JavaScript в браузере, чтобы запустить приложение.
18 фев 2025

Язык программирования C (Си): что это такое, где и для чего используется

Си, или просто С, — это компилируемый статически типизированный язык программирования (ЯП) общего назначения. Именно на нем написан практически весь программный код самой операционной системы Unix, а также код современных ОС Linux и Microsoft. Сегодня области использования ЯП не ограничиваются написанием компиляторов и операционных систем. На С создают решения для IoT — «умных устройств», а также для драйверов, компиляторов и банковских терминалов.

Язык C: когда появился и кто его создал

Си-язык предназначался для написания ОС UNIX на ЭВМ DEC PDP-11. Его создатель — сотрудник Bell Labs Деннис Ритчи. Многие важные идеи разработчик взял у ЯП BCPL Мартина Ричардса. Влияние BCPL можно назвать косвенным, через ЯП Би, созданный Кеном Томпсоном. В 1969 году он написал первую версию ОС UNIX на языке ассемблера PDP-7, позже названную Unics. Получается, в самом начале был Би, а потом — Си.

По мере развития ЯП, его стандартизировали для ANSI C и ISO как ISO C — C90. Изначально у ЯП не было многих возможностей, которые доступны в других языках. К примеру, только в стандарте С99 появились массивы переменной длины и встраиваемые функции. В C11 добавили реализацию потоков и поддержку атомарных типов.

Особенности языка программирования C

С называют языком «относительно низкого уровня». Это значит, что он максимально близок к машинному коду. Язык C работает с теми же объектами, что и большинство ЭВМ: символы, числа и адреса.

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

ЯП является регистрозависимым. Это значит, что условные int GitVerse и int gitverse в С — это разные переменные.

Язык C предоставляет разработчикам основные конструкции потока управления, необходимые для хорошо структурированных программ:

  • циклы с проверкой завершения в начале — while, for, или в конце — do;
  • группировка операторов;
  • принятие решений — if;
  • выбор одного из множества возможных вариантов — switch.

Но в то же время важно понимать, что ЯП имеет как плюсы, так и минусы.

Преимущества и недостатки C

Плюсы и минусы ЯП обусловлены особенностями его создания и использования. Поскольку язык программирования «ближе» к машинному коду, чем высокоуровневые Python, Ruby, Perl и JavaScript, в нем недоступны некоторые возможности, к которым привыкли разработчики на том же Джаваскрипте. Например, может показаться странным, что функции нельзя вкладывать друг в друга.

Плюсы С:

  • простота языковой базы с использованием библиотек, в которые вынесли работу с файлами и математические функции;
  • ориентация на процедурное программирование — каждая задача разбивается на шаги и решается шаг за шагом;
  • система типов, которая минимизирует риск бессмысленных операций;
  • использование указателей для доступа к ячейкам памяти.

Минусы С:

  • отсутствие механизмов работы со сборкой мусора и heap — приходится писать собственные менеджеры памяти и их аналоги;
  • невозможность вкладывать функции друг в друга;
  • ввод-вывод недоступен — нет операторов read или write, нужны явно вызываемые функции;
  • необходимость использовать lint для строгой проверки типов;
  • невозможность совершать операции с составными объектами — строками символов, множествами, списками или массивами;
  • отсутствие полноценной модульности.

В данном ЯП отсутствуют средства ООП и функционального программирования. Этот programming language нельзя назвать популярным: по данным сервисов статистики, он замыкает топ-10 самых используемых в мире. Во многом это связано с историей разработки и спецификой задач, для решения которых создавался С. Кроме того, ЯП менее известен по сравнению с JavaScript, Python, Go, Java и другими, для изучения которых созданы сотни курсов и пособий.

При этом TIOBE Index не раз признавал С языком года: в 2014, 1999, 1994 и 1989-м годах. Но данный сервис предоставляет рейтинг на основе поисковых запросов пользователей, поэтому относиться к данным стоит с определенной степенью условности.

Синтаксис и элементы языка Си

Основные типы данных в ЯП — int, short, long, char, float, double. Простой код, который выводит доступные в ЯП переменные различных типов:

#include <stdio.h>

int main(void)

{

 int GitVerse1 = 55;

 double git1 = 0.123456789e+6;

 char repo1 = 65;

 char s1[] = "Здесь выводится строка о том, что вы работаете в GitVerse.";

 printf("oct: %o dec: %d hex: %x\n", GitVerse1, GitVerse1, GitVerse1);

 printf("%f %e %g\n", git1, git1, git1); 

 printf("%d %c\n", repo1, repo1); 

 printf("%s\n", s1); 

 printf("Address of GitVerse1: %p\n", &GitVerse1); 

 printf("Value is: %d%%\n",GitVerse1); 

 return 0;

}
c

Таким образом, мы на практике увидели, что в ЯП доступны числа с плавающей точкой, целые числа, строки, указатели и другие. Названия переменных — GitVerse1, repo1, git1 — заданы произвольно.

В таблице ниже представлены основы синтаксиса с примерами.

Элементы синтаксисаВиды, назначение, характеристики и описаниеПримеры кода на С
Операторы= (приведение типов), + (сложение), - (вычитание), / (деление), % (деление по модулю), – (унарный минус / изменение знака), == (равно), ! (не), || (или), != (не равно), if и if… else (если, если… то), gotoa = a + 1;
b *= 10;
i = 2.4 * h;
Циклыwhile, for, do … while. Для выхода из цикла используют оператор break, для продолжения после прерывания текущей итерации — continuedouble sum, total = 10.;
int i;
sum = 0; 
i = 1; 
while (i <= total) {sum = sum + i; i = i + 1;}
МассивыДля объявления нужно указать тип элементов, имя массива и количествоего элементов в квадратных скобкахint a[20]
СтрокаКак таковой строки (string) в ЯП нет. Строкой называется массив элементов char с \0, \n, \bchar str[] = "GitVerse" можно объявить

 как char str[9] = {'G','i','t','V','e', 'r', 's', 'e', '\0'
ФункцииВсе функции глобальны. В ЯП нельзя определять одну функцию внутри другой#include <stdio.h>
int main(){
printf("Привет, это GitVerse для ваших git-репозиториев!");
return 0;
}

Где и для чего используется C

С позволяет писать кроссплатформенный код, который может по-разному обрабатываться на разных ОС и оборудовании.

Основные сферы применения:

  • создание прошивок микроконтроллеров;
  • программирование устройств вроде Arduino в области электроники;
  • разработка операционных систем;
  • программирование встроенного ПО, например для работы устройств IoT;
  • создание и поддержка приложений реального времени.

На основе С созданы C++ и Objective-C, в которых появились и ООП, и средства функционального программирования. Опосредованно С является «родителем» для Swift и D.

Пример кода на Си

Напишем простой код, который выводит строку: «Привет, это Gitverse для ваших git-репозиториев!». Сам код выглядит таким образом:

#include <stdio.h>

int main(){

printf("Привет, это GitVerse для ваших git-репозиториев!");

return 0;

}
c

Разберем происходящее построчно:

  • #include <stdio.h> — директива макропроцессора, подключающая файл стандартной библиотеки для работы с вводом / выводом информации;
  • int main(){printf("Привет, это Gitverse для ваших git-репозиториев!"); return 0;} — определение главной функции программы, которая состоит из заголовка — int main()), и тела — содержимое {}.

Главная функция main — точка входа. Она вызывается операционной системой при запуске программы.

В коде использованы два оператора:

  • printf — оператор вызова библиотечной функции, печати ввода/вывода;
  • return — оператор возврата функции.

Из этого простого примера можно понять, что ЯП сложнее некоторых других. Со старта нужно объяснять, что такое #include <stdio.h>, почему используется именно int main(), как работает и откуда берется printf.

Для сравнения можно привести тот же код, но на Паскале:

program GitVerse;

begin

WriteLn('Привет, это GitVerse для ваших git-репозиториев');

end.

Сейчас даже неподготовленный пользователь может понять, что происходит: была задана program GitVerse, ее запустили на begin и завершили на end.

Программы для работы в C

До стандартизации у Си не было встроенной функциональности: например, были недоступны операции ввода-вывода.

Из-за этого программист не смог бы вывести в консоль фразу «Привет, это Gitverse для ваших git-репозиториев!» из примера выше. Это кажется неудобным даже в нашем простом кейсе, а что говорить про сложную коммерческую разработку. Чтобы внедрить дополнительную функциональность, были созданы библиотеки. Например, GNU C Library — GNU-библиотека, которая как раз и представляла опцию printf. А также системные вызовы, основные функции которых — open, malloc, и многое другое.

В таблице представлены основные средства разработки, которые нужны для программирования на СИ.

Средство разработкиДля чего и почему применяетсяПримеры
Компилятор Перевод программы с ЯП в эквивалентную программу на низкоуровневом языке, близком машинному (или им являющимся). Откомпилированная программа выполняется на машине, как правило, без посторонней помощиGNU Compiler Collection (GCC), Clang, BDS C, LCC, Pelles C, Portable C Compiler, Tiny C Compiler,Topspeed JPI C
Стандартная библиотека и ее реализацииПредоставление дополнительной функциональности, которой нет в ЯПglibc, musl, CRT
Интегрированная среда разработкиIDE для разработки ПО, которая может включать текстовый редактор (написание кода), компилятор/транслятор, средства сборки и автоматизацииCLion, Microsoft Visual Studio (частично), Code::Blocks, Eclipse
Тестирование и поиск ошибокСоздание автоматизированных тестов и обеспечение отказоустойчивости кодаCheck, Google Test, AceUnit, GNU Autounit, cUnit
ОтладкаПоиск участков кода, в которых появились ошибки, динамический анализ кода, выявление утечек и переполнения буфераGdb, Valgrind

Существуют и другие инструменты, которые могут использоваться в ежедневной работе программиста. К примеру, Clang-format позволяет быстро форматировать код, чтобы он соответствовал установленным на проекте практикам.

Стоит ли начинать изучать язык C

Ответ на вопрос зависит от степени подготовленности разработчика, целей, наличия свободного времени и других обстоятельств.

С — язык для подготовленной аудитории. Си существует больше 35 лет, а в его спецификации свыше 700 страниц. При этом «переехать» на Си с php, Python, JavaScript сложнее, чем перейти с php на JavaScript.

Важно понимать, что сфер использования С меньше по сравнению с JavaScript, php и Python. Если нравятся Си-подобные языки и стоит цель разрабатывать реальные коммерческие проекты, стоит обратить внимание на C++ и Objective-C. На них пишут редакторы для работы с изображениями — Adobe Photoshop или Illustrator, игровые движки — Unity, роботов торговых бирж, драйверы устройств и многое другое.

При этом С — это отличный вариант понять основы того, как работают операционные системы и популярные ПО: Nginx, PostgreSQL и Redis.