Для чего хорош Си? | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
iOS Developer. Professional
-8%
Базы данных
-12%
Agile Project Manager
-5%
Python Developer. Basic
-10%
Java Developer. Professional
-7%
JavaScript Developer. Professional
-3%
MS SQL Server Developer
-8%
Scala-разработчик
-8%
Java Developer. Basic
-8%
Алгоритмы и структуры данных
-9%
Разработчик IoT
-13%
PostgreSQL
-8%
Подготовка к сертификации Oracle Java Programmer (OCAJP) Python Developer. Professional Golang Developer. Professional Разработчик программных роботов (RPA) на базе UiPath и PIX Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов C# ASP.NET Core разработчик VOIP инженер NoSQL Flutter Mobile Developer Супер - интенсив по Kubernetes iOS Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool"
Инфраструктура
Базы данных
-12%
Network engineer. Basic
-10%
Network engineer
-4%
Инфраструктурная платформа на основе Kubernetes
-6%
Экспресс-курс по управлению миграциями (DBVC)
-10%
Экспресс-курс «Введение в непрерывную поставку на базе Docker»
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Дизайн сетей ЦОД
-13%
PostgreSQL
-8%
DevOps практики и инструменты Cloud Solution Architecture Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP NoSQL Супер-практикум по использованию и настройке GIT Супер-интенсив «СУБД в высоконагруженных системах» Экспресс-курс «IaC Ansible»
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Для чего хорош Си?

Язык программирования Си используют в случаях, когда код тесно взаимодействует с «железом». Чаще всего его применяют для решения сложных и специфических задач, что неудивительно, ведь более легкие задачи проще решать с помощью высокоуровневых языков. В этой статье мы рассмотрим несколько популярных применений Си.

Для начала, скажем, что под влиянием Си возникли такие языки, как C#, C++, Java, Objective-C. Да, порой Си называют подмножеством C++ («C++ без классов»), однако на деле это не совсем верно и вот почему.

Разумеется, Си поддерживает лишь процедурное программирование, то есть никаких классов, ООП и наследования — исключительно структуры и функции. Отсюда вытекают основные особенности языка: • доступ к памяти через указатели (указатели — это особые переменные, в которых хранится адрес объекта); • активное применение структур и объединений; • чистый стиль программирования (код сложнее писать, однако проще выполнять отладку).

Теперь давайте приведем несколько популярных примеров использования Си.

Оптимизация участков кода на C++

ООП-возможности C++ нередко обходятся дороже, чем «чистый Си», ведь расходуется больше ресурсов, той же оперативной памяти. Именно поэтому иногда код, написанный в стиле Си, бывает эффективнее. Если же надо заставить работать быстрее какой-нибудь алгоритм, можно задействовать процедурный стиль и отказаться от встроенных ООП-инструментов C++, к примеру, от полиморфизма.

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

Информационная безопасность

Речь идет о следующих хакерских приемах: • применение уязвимостей: переполнение буфера, повреждение кучи (двойные удаления); • инъекция кода. Если заполучить доступ к другому процессу с помощью уязвимости, можно спрятать собственный код внутри чужого, а потом заставить процесс его выполнять; • перехват. Если хотите мониторить чьи-либо взаимодействия с системой (открытие файлов, нажатие клавиш), вам, скорее всего, надо вызывать отслеживающий код каждый раз, когда пользователь что-либо делает. Для этого вы меняете какой-нибудь фрагмент API операционной системы вашим собственным кодом.

Практически для всего вышесказанного применяется PIC-код, то есть код, не зависящий от адреса (position-independent code). Такой код может выполняться в любом месте памяти вне зависимости от того, где он находится и кто его запустил. При этом у PIC-кода отсутствует доступ к глобальным переменным и таблицам, а это значит, что C++ для его написания не подходит, ведь классам C++ требуются для реализации наследования глобальные таблицы.

Код ядра

Код, выполняемый в режиме ядра, имеет полный доступ к оборудованию и памяти: жесткому диску, RAM, GPU. Что работает в режиме ядра: • аппаратные драйверы — тут без доступа к железу не обойтись. Такие драйверы — это посредники между пользовательским кодом и оборудованием; • ядро ОС. На Си написано много ядер ОС, включая Unix и Android.

Применять для вышесказанного C++ почти нереально, ведь в режиме ядра отсутствует доступ к тем же вышеупомянутым глобальным таблицам. Порой в режиме ядра тоже нужен PIC код, к примеру, для загрузчика. Загрузчик — самая первая программа, которая выполняется при запуске персонального компьютера. Биос извлекает эту программу из жесткого диска, помещает в память и приказывает процессору запустить данную часть памяти.

Embedded-разработка

Если говорить о программировании встраиваемых систем, то тут нередко применяют и Си, и C++. Однако у Си есть преимущество, ведь он дает возможность разрабатывать встроенное ПО в случае ограниченных ресурсов, к примеру, если у микроконтроллера слишком мало RAM. Кроме Си, также может понадобиться и знание ассемблера (например, ARM-ассемблера), что неплохо для написания ассемблерных вставок. Результат — еще большая оптимизация кода и получение доступа к специфичным инструкциям процессора.

Источник

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться