3 причины, зачем изучать Си в 2018 году

Illustration of a person with luggage standing beside an open doorway marked with the year 2018, with a large letter 'C' on the left side. Illustration of a person with luggage standing beside an open doorway marked with the year 2018, with a large letter 'C' on the left side.

Сразу должен оговориться - я просто люблю программировать.

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

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

Для меня это было бы главной причиной для его изучения.

А вот дальше начинают появляться новые приятные следствия.

Знаешь Си - знаешь как все работает

Программисты, использующие языки высокого уровня, обычно при взгляде на Си говорят, что это слишком низкий уровень. Под низким уровнем тут имеется в виду в том числе и необходимость возиться с отдельными байтами, с памятью, следить за правильностью вызовов функций и передачи аргументов. На самом деле это не совсем так - можно программировать на Си и без этих тонкостей. Другое дело, что понимание этих нюансов тесно связано с изучением языка Си. Дело в том, что Си не скрывает от программиста этих деталей. Понимание таких тонкостей помогает писать на Си. И практически не помогает писать на более высокоуровневых языках.

Но это понимание тонкостей и знание того, как программы на самом деле выполняются на реальных компьютерах, на самом деле является очень полезным в некоторых областях. Обычно говорят о том, что в этих областях приходится писать на Си. Это не совсем правда. Скорее в этих областях надо знать все то, что приходит с изучением Си. А писать можно много на чем - С, С++, go, rust, наверняка еще много всего.

О чем речь?

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

Нет ничего быстрее Си

Сейчас часто говорят о том, что рабочее время программиста стоит больше, чем дополнительная память или более мощный процессор. Но для меня размер и скорость работы программы значат очень многое. Я очень не люблю, когда программа тратит неоправданное количество памяти или работает неоправданно медленно. И вдвойне не люблю, если это моя программа. При использовании Си я имею возможность удовлетворить свое стремление к идеальной программе. Как это сочетается с бизнес-целями? Мне просто повезло найти такую работу, где это важно. А вообще, это очень полезно в embedded разработке, где каждый байт и каждая миллисекунда на счету. Например в том же IoT.

Си может ускорить программы на других языках

С библиотеками все немного сложнее. Требования к бинарному формату начинаются тогда, когда возникает необходимость связать между собой несколько языков. И поскольку формат прописан, то нужно, чтобы компилятор выдал что-то ровно в этом формате. Но современные умные компиляторы продвинутых языков берут на себя большую ответственность. Хорошо, когда компилятор можно попросить сгенерить результат в нужном формате. В случае Си можно просто сделать это самостоятельно. Поэтому именно на Си часто пишутся расширения для других языков.

Автор статьи может стать твоим ментором и научить писать расширения на Си для других языков Нанять

Простота Си позволяет сразу сделать такой интерфейс, какой требуется тому языку, который планируется расширять. Справедливости ради стоит заметить, что при использовании extern "C" ровно такой же эффект можно получить и в С++. Существуют также инструменты, которые могут сгенерить нужный код на языке Си, который будет использоваться в качестве прослойки между библиотекой и языком, в котором ее планируется применять. Если использовать эти инструменты, можно обойтись без знания Си или понимания формата библиотеки. Но с ними все-таки удобнее.