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

Language C, Dennis Ritchie
Первый учебник способствовал популярности C

Это стало успешным благодаря новой свободе программистов. Его недостаток - сложность отладки программ. Он производит быстрые программы и доступна широкая коллекция API. Он остается лучшим инструментом программирования, близким к аппаратному обеспечению и используется даже для приложений. См. Why SQLite coded in C, например. Другие программы, закодированные в C: Linux, игры Doom, Quake и SimCity, Apache, NGINX, PHP, JVM, Git...

Язык C был разработан с 1969 по 1972 год Деннисом Ричи для программирования операционной системы Unix. Его целью было быть мобильным. См. раздел Разработка языка C для истории.
Учебник языка Денниса Ричи и Брайана Кернигана считается одним из лучших, когда-либо написанных.

Звучит довольно деревенско по сравнению с современными языками, но к 70-м годам, как альтернатива Basic, она была крайне развита. Вызов функции по номеру строки или с именами переменных, ограниченными двумя символами в базовой версии Microsoft AppleSoft, сделал программирование очень трудоемким. Даже Паскаль с его тяжестью и напряжениями казался менее интересным, чем С.

Это всегда может быть лучшим решением, чем C++ для системного программирования, это в любом случае мнение Linux Torvald, который решил использовать этот язык для очень широко распространенного программного обеспечения Git.
Но это суждение (в 2007 году) может быть датировано тем, что со времен C++ претерпел несколько изменений и улучшений, в том числе и с 11-й версией. Однако для критически важных системных приложений C++ остается слишком сложным и неопределенным .
Чтобы восполнить неуверенность языка C, Microsoft создала Checked C - расширение, тестирующее проблемы с памятью в программе.

Что нужно знать об истории С

Деннис Ричи и его коллега Кен Томпсон разработали язык на терминале типа Teletype 33, как показано на фото ниже.

Terminal teletype 33

Деннис Ричи (стоя) и Кен Томсон в Bell Labs на терминале Teletype 33

Чтобы представить, как выглядело программирование в таких условиях, мы посмотрим это видео с терминала в действии... Тогда мы лучше понимаем синтаксис языка, сделанный для сохранения удара, и где знак = выбран для назначения и = = для сравнения, потому что назначение чаще, чем сравнение! Вот клавиатура, которую ты видел поближе...

Clavier de Teletype 33

 

Ричи пришлось проявить изобретательность в определении языка, чтобы уменьшить количество ударов, например, с помощью оператора приращения++. Другие конструкции гораздо более сомнительны, например, вложенное назначение в сравнительный тест.
Кроме того, влияние клавиатуры касается как исходного кода компилятора, так и программ, которые он распознает. С другой стороны, современный язык можно упростить ценой более сложного компилятора. Клавиатуры хорошо изменились, но замысловатые конструкции C остаются во многих других языках, включая C++, Java, C # от Microsoft и очень недавние Go и Dart от Google и Swift .

Язык, где все - выражение

Программа C состоит из набора функций, которые возвращают значение или нет, и глобальных переменных. Все можно оценить как выражение, и это не обязательно преимущество для безопасности.
Функции и переменные имеют прототип в файле заголовка для совместного использования исходного файла.
Программист должен сам управлять памятью, используя указатели и функции для выделения или освобождения блоков памяти.
Он переносится с некоторыми ограничениями: например, дополнительные типы переменных зависят от компилятора.

Стандарт ISO C11 2011 года добавляет к языку C новые функции: многопоточность, Юникод, лямбда-функции, структуры и анонимные вложенные союзы .

Структуры данных

:

Скалярные: int, long, char, char *.
struct позволяет создавать тип объекта, сформированный из нескольких переменных и являвшийся предвестником объектов.
объединение позволяет дать несколько идентификаторов переменной и используется в основном со конструкциями.
typedef для определения новых типов данных.

Контрольные структуры

:

Символы

:

//и/* */комментарии.
& | & | | логические операторы .
# директива для предпроцессора.

Составные символы выполняют две операции над одной переменной. Например, a + = b добавляет b к a, а затем присваивает результат a .

Пряжка

:
while(x < y)
{
   ... instructions ...
}

Определение функции

:
int nom(char *x, int y)
{
   ... instructions ...

   return(z);
}

Пример кода

Показывать символы строки в C.

char *s = "demo";
int l = strlen(s);
for(int i = 0; i < l; i++)
{
   char c = s[i];
   printf("%c\n", c);
} 

См. также

Сайты и инструменты для C