Язык программирования Си был разработан Деннисом Ритчи в начале 1970-х годов для ускорения разработки операционной системы UNIX (ОС UNIX). В результате на языке Си написана большая часть ОС UNIX, компилятор Си и практически все прикладные программы для ОС UNIX. Хотя язык Си был задуман как язык системного программирования, это не узко специализированный язык со множеством ограничений. Большой набор операций и типов данных, современное оформление и высокая степень машинонезависимости сделали его привлекательным языком программирования общего назначения.
Первое издание книги Kernigan, Ritchie. The C Programming Language; Prentice Hall, 1978 описывает так называемый стандарт K&R языка Си. Американский Национальный Институт Стандартов (ANSI) разработал формальный стандарт ANSI языка Си. Этот стандарт значительно улучшил переносимость программ на языке Си.
Язык Си — компилируемый язык, существенно более быстрый, чем интерпретируемые языки. Он сочетает в себе свойства языков высоко и низкого уровней. Наряду с управляющими операторами и структурами данных, характерными для языков высокого уровня, он содержит много операций, типичных для ассемблеров или машинных языков (в частности — побитовые операции). Кроме того, язык Си обеспечивает косвенную адресацию с использованием указателей для быстрого и эффективного доступа к данным. Сходство языка Си с ассемблером делает относительно простым создание компиляторов Си для разных типов процессоров. Благодаря переносимости и сравнительно малым потерям в скорости выполнения, язык Си в настоящее время используется во многих областях, в которых традиционным было применение ассемблеров.
Программа на Си в основном состоит из набора функций. Понятие функции в языке Си сочетает свойства подпрограмм и процедур — в Си нет различий между ними. С помощью функций достигается модульность программы. Это упрощает отладку и позволяет использовать фрагменты кода в различных программах, избегая дублирования этих фрагментов.
Си — весьма гибкий язык, который может быть использован для программирования решения самых различных задач. Круг этих задач простирается от задач управления аппаратурой компьютера, требующих работы с физической памятью и устройствами ввода-вывода, до деловых и финансовых задач, манипулирующих сложными структурами данных.