1 added
1 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Язык программирования<strong>Си</strong>используют в случаях, когда код тесно взаимодействует с "железом". Чаще всего его применяют для решения сложных и специфических задач, что неудивительно, ведь более легкие задачи проще решать с помощью высокоуровневых языков. В этой статье мы рассмотрим несколько популярных применений Си.</p>
1
<p>Язык программирования<strong>Си</strong>используют в случаях, когда код тесно взаимодействует с "железом". Чаще всего его применяют для решения сложных и специфических задач, что неудивительно, ведь более легкие задачи проще решать с помощью высокоуровневых языков. В этой статье мы рассмотрим несколько популярных применений Си.</p>
2
<p>Для начала, скажем, что под влиянием Си возникли такие языки, как<strong>C#, C++, Java, Objective-C</strong>. Да, порой Си называют подмножеством C++ ("C++ без классов"), однако на деле это не совсем верно и<a>вот почему</a>.</p>
2
<p>Для начала, скажем, что под влиянием Си возникли такие языки, как<strong>C#, C++, Java, Objective-C</strong>. Да, порой Си называют подмножеством C++ ("C++ без классов"), однако на деле это не совсем верно и<a>вот почему</a>.</p>
3
<p>Разумеется, Си поддерживает лишь процедурное программирование, то есть никаких классов, ООП и наследования - исключительно структуры и функции. Отсюда вытекают<strong>основные особенности языка</strong>: • доступ к памяти через указатели (указатели - это особые переменные, в которых хранится адрес объекта); • активное применение структур и объединений; • чистый стиль программирования (код сложнее писать, однако проще выполнять отладку).</p>
3
<p>Разумеется, Си поддерживает лишь процедурное программирование, то есть никаких классов, ООП и наследования - исключительно структуры и функции. Отсюда вытекают<strong>основные особенности языка</strong>: • доступ к памяти через указатели (указатели - это особые переменные, в которых хранится адрес объекта); • активное применение структур и объединений; • чистый стиль программирования (код сложнее писать, однако проще выполнять отладку).</p>
4
<p>Теперь давайте приведем несколько популярных примеров использования Си.</p>
4
<p>Теперь давайте приведем несколько популярных примеров использования Си.</p>
5
<h2>Оптимизация участков кода на C++</h2>
5
<h2>Оптимизация участков кода на C++</h2>
6
-
<p>ООП-возможности C++ нередко обходятся дороже, чем "чистый Си", ведь расходуется больше ресурсов, той же оперативной памяти. Именно поэтому иногда код, написанный в стиле Си, бывает эффективнее. Если же надо заставить работать быстрее какой-нибудь алгоритм, можно задействовать процедурный стиль и отказаться от встроенных ООП-инструментов C++, к примеру, от полиморфизма.</p>
6
+
<p>ООП-возможности C++ нередко обходятся дороже, чем "чистый Си", ведь расходуется больше ресур��ов, той же оперативной памяти. Именно поэтому иногда код, написанный в стиле Си, бывает эффективнее. Если же надо заставить работать быстрее какой-нибудь алгоритм, можно задействовать процедурный стиль и отказаться от встроенных ООП-инструментов C++, к примеру, от полиморфизма.</p>
7
<p>Однако если требуется действительно высокая скорость, то лучше всего переписать часть кода на ассемблере.</p>
7
<p>Однако если требуется действительно высокая скорость, то лучше всего переписать часть кода на ассемблере.</p>
8
<h2>Информационная безопасность</h2>
8
<h2>Информационная безопасность</h2>
9
<p>Речь идет о следующих хакерских приемах: • применение уязвимостей: переполнение буфера, повреждение кучи (двойные удаления); • инъекция кода. Если заполучить доступ к другому процессу с помощью уязвимости, можно спрятать собственный код внутри чужого, а потом заставить процесс его выполнять; • перехват. Если хотите мониторить чьи-либо взаимодействия с системой (открытие файлов, нажатие клавиш), вам, скорее всего, надо вызывать отслеживающий код каждый раз, когда пользователь что-либо делает. Для этого вы меняете какой-нибудь фрагмент API операционной системы вашим собственным кодом.</p>
9
<p>Речь идет о следующих хакерских приемах: • применение уязвимостей: переполнение буфера, повреждение кучи (двойные удаления); • инъекция кода. Если заполучить доступ к другому процессу с помощью уязвимости, можно спрятать собственный код внутри чужого, а потом заставить процесс его выполнять; • перехват. Если хотите мониторить чьи-либо взаимодействия с системой (открытие файлов, нажатие клавиш), вам, скорее всего, надо вызывать отслеживающий код каждый раз, когда пользователь что-либо делает. Для этого вы меняете какой-нибудь фрагмент API операционной системы вашим собственным кодом.</p>
10
<p>Практически для всего вышесказанного применяется<strong>PIC-код</strong>, то есть код, не зависящий от адреса (position-independent code). Такой код может выполняться в любом месте памяти вне зависимости от того, где он находится и кто его запустил. При этом у PIC-кода отсутствует доступ к глобальным переменным и таблицам, а это значит, что C++ для его написания не подходит, ведь классам C++ требуются для реализации наследования глобальные таблицы.</p>
10
<p>Практически для всего вышесказанного применяется<strong>PIC-код</strong>, то есть код, не зависящий от адреса (position-independent code). Такой код может выполняться в любом месте памяти вне зависимости от того, где он находится и кто его запустил. При этом у PIC-кода отсутствует доступ к глобальным переменным и таблицам, а это значит, что C++ для его написания не подходит, ведь классам C++ требуются для реализации наследования глобальные таблицы.</p>
11
<h2>Код ядра</h2>
11
<h2>Код ядра</h2>
12
<p>Код, выполняемый в режиме ядра, имеет полный доступ к оборудованию и памяти: жесткому диску, RAM, GPU. Что работает в режиме ядра: • аппаратные драйверы - тут без доступа к железу не обойтись. Такие драйверы - это посредники между пользовательским кодом и оборудованием; • ядро ОС. На Си написано много ядер ОС, включая Unix и Android.</p>
12
<p>Код, выполняемый в режиме ядра, имеет полный доступ к оборудованию и памяти: жесткому диску, RAM, GPU. Что работает в режиме ядра: • аппаратные драйверы - тут без доступа к железу не обойтись. Такие драйверы - это посредники между пользовательским кодом и оборудованием; • ядро ОС. На Си написано много ядер ОС, включая Unix и Android.</p>
13
<p>Применять для вышесказанного C++ почти нереально, ведь в режиме ядра отсутствует доступ к тем же вышеупомянутым глобальным таблицам. Порой в режиме ядра тоже нужен PIC код, к примеру, для загрузчика. Загрузчик - самая первая программа, которая выполняется при запуске персонального компьютера. Биос извлекает эту программу из жесткого диска, помещает в память и приказывает процессору запустить данную часть памяти.</p>
13
<p>Применять для вышесказанного C++ почти нереально, ведь в режиме ядра отсутствует доступ к тем же вышеупомянутым глобальным таблицам. Порой в режиме ядра тоже нужен PIC код, к примеру, для загрузчика. Загрузчик - самая первая программа, которая выполняется при запуске персонального компьютера. Биос извлекает эту программу из жесткого диска, помещает в память и приказывает процессору запустить данную часть памяти.</p>
14
<h2>Embedded-разработка</h2>
14
<h2>Embedded-разработка</h2>
15
<p>Если говорить о программировании встраиваемых систем, то тут нередко применяют и Си, и C++. Однако у Си есть преимущество, ведь он дает возможность разрабатывать встроенное ПО в случае ограниченных ресурсов, к примеру, если у микроконтроллера слишком мало RAM. Кроме Си, также может понадобиться и знание ассемблера (например, ARM-ассемблера), что неплохо для написания ассемблерных вставок. Результат - еще большая оптимизация кода и получение доступа к специфичным инструкциям процессора.</p>
15
<p>Если говорить о программировании встраиваемых систем, то тут нередко применяют и Си, и C++. Однако у Си есть преимущество, ведь он дает возможность разрабатывать встроенное ПО в случае ограниченных ресурсов, к примеру, если у микроконтроллера слишком мало RAM. Кроме Си, также может понадобиться и знание ассемблера (например, ARM-ассемблера), что неплохо для написания ассемблерных вставок. Результат - еще большая оптимизация кода и получение доступа к специфичным инструкциям процессора.</p>
16
<p><em><a>Источник</a></em></p>
16
<p><em><a>Источник</a></em></p>
17
17