Программы
Вступление в наСИлие

Вступление в наСИлие

When I find my code in tons of trouble
Friends and colleagues come to me,
Speaking words of wisdom...
Write in C!

– schoedav, кавер на "Let it be"

Знание языка Си не является обязательным ни для программиста, ни для любого нормального человека. Однако, если хочется чуть больше понимать в том, как устроен компьютер и сбросить вуаль сахара высокоуровневых языков, Вам стоит ознакомиться с этой книгой.

Сама книга написана по мотивам курса по языку Си для студентов второго года обучения компьютерно-ориентированной специальности.

Изображение Изучаем язык программирования Си

О курсе

Ранее C рассматривался в курсе "Языков и Технологий Программирования", но его заменили на C#. Казалось бы, один символ, но вся системшина ушла.

Ну и хорошо! Хорошо же?

Как только мы переходим к реальности: ассемблер, аппаратные средства вычислительной техники... Мы оказываемся в абсолютной тьме. Потому что важно перед тем, как копнуть совсем в железо, надо понимать компьютер хоть на уровне околосистемного программиста.

Именно так и вернулся Си в программу. Опять же, не в виде всеобъемлющей многотомной книги, а в рамках ЛикБеза-развлечения.

Ориентируемся на стандарт С11, компилятор clang, ОС GNU/Linux. Предполагается, что слушатель уже имеет представление о каком-либо высокоуровневом языке. В частности, многие аналогии из Python.

Продолжительность

Курс длится 1 семестр, 1 пара в неделю (около 13 занятий). Лекции и практика совмещены - чем дальше, тем больше код будет превалировать над текстом, а домашняя работа над работой в аудитории.

Если вы изучаете Си самостоятельно, то можно оценить время как:

  • Тема "весит" 1 час;
  • ДЗ "весит" от 15 минут до 3-х часов ближе к концу.

Отчётность

"Допуск от 60 баллов, зачёт" - предполагалось, но удалось этого избежать благодаря попустительству университета. Поэтому работаем в своё удовольствие.

История

Язык Си разработан Деннисом Ритчи (помните, он ещё и Unix сделал) в соавторстве с Брайаном Керниганом. Всё это было в лабораториях Белла (AT&T). А всё из-за отсутствия вменяемого инструмента разработки системных программ – по сути только один ассемблер был... Хотелось чего-то более высокоуровневого.

Где используется Си, мотивация изучать Си

Unix написан на Си, Linux написан на Си... Драйверы на Си. Даже Windows на Си. Всё это – реальное положение дел в компьютере.

Благодаря тому, что абстракции языка близки к реальной архитектуре компьютера, получается писать эффективный код + управлять устройствами.

То есть по большей части Си используется для:

  • Разработки Операционных Систем (системное/сетевое программирование)
  • Программирования микроконтроллеров (носимая электронника, машины, кофеварки и т.д.)
  • ПО реального времени (стримминг/перекодировка видео/аудио)
  • Если нужно хоть как-то взаимодействовать с железом - придётся написать биндинг для вашего любимого языка на... Си. Такие дела.

Что есть в языке Си?

Мало ключевых слов – легко выучить ;-)

Вместо классов (описатетелей сложных сущностей) – структуры данных (+ юнионы). Аналог namedtuple/dataclass в Python.

Мощный инструмент указателей (на память) – помните принцип адресуемости памяти дядюшки Неймана?

Компилируется в нативный код – читай в язык процессора.

Макросы (препроцессор) – надстройка, позволяющая "именовать" частоповторяющиеся операции.

Чего нет в языке Си?

Проверки границ массивов/структур и вообще данных. Легко можно всё испортить. Например, мы можем создать массив из 10 элементов и записать в 11-ый... Само собой, это повлияет на другие данные, сломает вашу программу.

Строгая типизация. Типы есть, но они довольно неплохо преобразуются друг к другу. Да и вцелом – мы работаем с памятью, все типы данных – просто условность! И хоть и есть ошибки компиляции, связанные с проверкой типов данных, далеко не всё проверяется.

Автоматической сборки мусора. Всё, что динамически создаёте – сами и удаляете. Не забывайте прибираться – иначе утечки памяти.

Нет исключений (exceptions) – ошибки не райзятся, а обрабатываются на уровне возвращаемых значений / специальной переменной errno.

ООП. На самом деле, были попытки, но Си не про ООП, а про данные и устройства.

Итак, дальше нужно понимать, что если где-то "всё есть объект", где-то "всё есть функция", то в Си - "всё есть байт".

Список тем

  1. Вступительная пара
  2. Условная пара
  3. Массивная пара
  4. Домашняя пара
  5. Функциональная пара
  6. Структурированная пара
  7. Динамическая пара
  8. Домашняя пара
  9. Заглавная пара
  10. Линкованая пара