Pull to refresh
0
Инфопульс Украина
Creating Value, Delivering Excellence

Миром всё ещё управляет язык С

Reading time 8 min
Views 33K
Original author: Daniel Angel Muñoz Trejo
Многие из проектов на языке С, существующих сегодня, начинали разрабатываться ещё десятилетия назад. Операционная система UNIX стартовала 1969 году (и писалась на ассемблере), но уже в 1972 была переписана на С. Точнее, это язык С был создан для того, чтобы появилось что-то, на что было бы удобно переписать с ассемблера ядро UNIX и получить чуть более высокоуровневый код, менее зависимый от архитектуры и позволяющий выполнять больше полезной работы на каждую строчку написанного кода.

Разработка базы данных Oracle началась в 1977 году (тоже на ассемблере) и тоже была переписана на С в 1983 году. К тому времени это был уже один из самых популярных языков в мире.

В 1985 году вышла Windows 1.0. Хотя код операционной системы Windows не является открытым, общеизвестно, что ядро в основном написано на С с небольшими вставками ассемблера. Разработка Linux началась в 1991 году и началась сразу на С. В следующем году она была опубликована под лицензией GPL и использована как часть GNU Operating System, которая и сама начиналась как проект на С и Lisp, так что многие компоненты были написаны на С.

Но проекты на С — это не только то, что стартовало десятилетия назад, когда выбор языков, скажем прямо, был достаточно ограничен. Много С-кода пишется и сейчас, на нём начинаются и новые проекты. Для этого есть причины.

Как именно язык С управляет миром?


Не смотря на современную тенденцию к использованию высокоуровневых языков, фундамент мира ИТ всё ещё держится на языке С. Вот лишь некоторые из систем, написанных на С и ежедневно используемых миллионами людей.

Microsoft Windows


Как уже говорилось выше, ядро Windows — это в основном код на С. Можно по-разному относится к этой операционной системе, но уже несколько десятилетий она занимает наибольшую долю рынка десктопных ОС.

Linux


Linux тоже написано большей частью на С. 97% всех суперкомпьютеров мира работают на Linux. Неоспорима его большая доля на рынке серверов, а кто-то использует его и на десктопе.

Mac


Вы не поверите, но и третья «большая» ОС в нашем списке тоже написана на С (по крайней мере её ядро).

Драйвера


Когда мы говорим о драйвере устройства, не важно под какую операционную систему, в абсолютном большинстве случаев мы говорим о коде на С.

Мобильные ОС


Ядра iOS, Android и Windows Phone тоже написаны на С. По сути они являются мобильными адаптациями уже существовавших ранее ядер Mac OS, Linux и Windows. Так что прямо сейчас в вашем кармане работает С-код.

image

Базы данных


Все наиболее популярные базы данных в мире (Oracle Database, MySQL, MS SQL Server, PostgreSQL) написаны на С (некоторые — на комбинации С/С++). Базы данных используются во всех типах систем: финансы, медиа, телеком, здравоохранение, образование, продажи, веб и т.д. Если вы не живёте на необитаемом острове — вы сталкиваетесь с системами на базах данных (и, как следствие, с работой кода на С) ежедневно.

image

Графика, видео, спецэффекты


Современный кинематограф создаётся в основном специальным ПО, предназначенным для этого. Высоконагруженные системы, от которых требуется обрабатывать огромные массивы видеоданных, часто пишутся на С и С++. Чем эффективнее будет код — тем быстрее будет получен результат, тем больше возможностей откроется перед художниками и аниматорами по доводке деталей будущего киношедевра. И тем больше денег сэкономит кинопроизводитель.

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


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

И вот вы добрались до своего автомобиля. В нём работают (и, скорее всего, написаны на С), следующие системы:

  • управление автоматической коробкой передач
  • система определения давления в шинах
  • сенсоры
  • сохранения положений сидушек и зеркал
  • экран бортового компьютера
  • сигнализация
  • система электронной стабилизации
  • круиз-контроль
  • климат-контроль
  • зажигание без ключа
  • обогрев сидений
  • подушки безопасности

… этот перечень может быть сильно расширен в зависимости от навороченности вашего авто.

Каждый день вы сталкиваетесь с банкоматами, кассовыми аппаратами, светофорами, системами контроля доступа, видеонаблюдением — везде микроконтроллеры, везде код на С.

image

Почему люди всё ещё пишут на С?


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

Но, не смотря на всё вышеперечисленное, есть причины, по которым код на С всё ещё работает и будет работать ещё долго. В мире разработки ПО нет «серебрянной пули», нет одного языка, который закрыл бы все ниши. В некоторых сферах С всё ещё предпочтительный выбор, а в некоторых — вообще единственный возможный.

Комбинация портируемости и эффективности


С разрабатывался как «портируемый ассемблер». Он так близок к машинному коду, как только это возможно, но всё же он — не машинный код. Есть как минимум один компилятор С под вообще любую существующую в мире процессорную архитектуру (ну, если только вы не спаяли вчера собственный процессор где-нибудь в гараже). Более того, под основные архитектуры компиляторы С писались и оптимизировались уже несколько десятилетий. А это означает, что они просто бешено эффективные. У вас займёт очень много времени написать и оптимизировать ассемблерный код до того уровня, который улучшит результат, генерируемый по-умолчанию стандартным компилятором С.

Язык С также стал чем-то вроде универсального языка для общения программистов. Не знаешь, на каком языке выразить идею, чтобы незнакомый тебе разработчик на другом конце мира понял, что за алгоритм ты написал? Просто пиши на С. Alex Allain из команды Dropbox сказал так:
С — это отличный язык для выражения общих идей в программировании способом, удобным для большинства людей. Многие из соглашений и принципов языка С были заимствованы другими языками, так что с помощью кода на С вам, вероятно, удастся объясниться даже с теми программистами, которые на С никогда и не писали

Прямой и быстрый доступ к памяти


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

Микроконтроллер может быть спроектирован таким образом, например, что байт по адресу 0x40008000 будет отправлен UART к какому-то периферийному устройству, тогда, когда бит номер 4 в ячейке памяти по адресу 0x40008001 будет выставлен в 1.

Код на С для оправки байта для такого микроконтроллера будет выглядить вот так:

#define UART_BYTE *(char *)0x40008000 
#define UART_SEND *(volatile char *)0x40008001 |= 0x08 

void send_uart(char byte) 
{ 
   UART_BYTE = byte;    // записываем отправляемое значение в ячейку 0x40008000
   UART_SEND;           // поднимаем бит номер 4 в ячейке 0x40008001 
}

Обратите внимание на ключевое слово volatile — оно здесь необходимо, чтобы не дать компилятору оптимизировать, например, цикл, в котором ячейке памяти по данному адресу несколько раз подряд присвоится одно и то же значение (компилятор может решить сделать это лишь один раз, если ключевого слова volatile не будет).

Детерминированность использования ресурсов


Общеизвестным фактом является то, что системное программирование не может полагаться на языки со сборщиком мусора. Более того, в некоторых системах вообще запрещена динамическая аллокация памяти. Embedded-приложения должны использовать свои ресурсы очень экономно. Некоторые из них работают в операционных системах реального времени, где вызов сборщика мусора (с его неопределённо долгим временем работы) не допустим. А запрет на динамическое выделение памяти требует наличия удобных средств работы с выделенной заранее памятью — таких, как указатели С.

Размер кода


Рантайм С очень невелик. Бинарник, полученный после компиляции и линковки кода на С, будет меньше бинарников на многих других языках. Даже по сравнению с С++ размер часто бывает в 2 раза меньше. С++ вынужден поддерживать абстракции, вроде исключений, что не даётся бесплатно. Это, безусловно, неплохой в некоторых случаях инструмент, но он требует дополнительного кода.

Давайте посмотрим вот на такой код на С++:

// Объявление класса А. Реализация методов находится где-то в другом месте
class A
{
public:
   A();                    // Конструктор
   ~A();                   // Деструктор (called when the object goes out of scope or is deleted)
   void myMethod();        // Просто метод
};

// Объявление класса В. Реализация методов находится где-то в другом месте
class B
{
public:
   B();                    // Конструктор
   ~B();                   // Деструктор
   void myMethod();        // Просто метод
};

// Объявление класса С. Реализация методов находится где-то в другом месте
class C
{
public:
   C();                    // Конструктор
   ~C();                   // Деструктор
   void myMethod();        // Просто метод
};

void myFunction()
{
   A a;                    // Вызван конструктор a.A()
   {                       
      B b;                 // Вызван конструктор b.B()
      b.myMethod();       
   }                       // Вызван деструктор b.~B()
   {                       
      C c;                 // Вызван конструктор c.C()
      c.myMethod();        
   }                       // Вызван деструктор c.~C()
   a.myMethod();         
}                          // Вызван деструктор a.~A()

Методы классов A, B и C объявлены где-то в других файлах. Таким образом, компилятор пока не может проанализировать их и понять, генерируют ли они исключения. То есть он должен быть готов к тому, что да, генерируют. И их нужно обрабатывать. Если возникнет исключение — нужно суметь отмотать стек и вызвать деструкторы всех созданных объектов. Это всё увеличивает объём сгенерированного кода. Мы получаем оверхед языка С++ по сравнению с С. Для многих приложений это не допустимо. И, хотя компиляторы С++ часто дают возможность отключить использование исключений, это тоже не даётся даром, поскольку код стандартной библиотеки С++ использует их для сообщений об ошибках. Придётся или жить без этой информации, либо переписывать части стандартной библиотеки.

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

Причины изучить С (если вы ещё этого не сделали)


Язык С не так сложно выучить, а вот польза от этого может быть существенная.

Общий язык


Как уже говорилось выше: если вы пишете на С — вас всегда поймут. Много реализаций алгоритмов в книгах или статьях приводятся впервые именно на языке С. Это даёт максимальную портируемость, максимальную простоту использования на любой платформе. Я видел, как программисты на некоторых высокоуровневых языках рыскали по интернету в поисках реализации какого-то алгоритма на их языке просто потому, что не понимали деталей его реализации на С.

Учитывайте также, что С — это старый и распространённый язык, так что если вы ищете какой-то алгоритм в интернете, то максимальный шанс у вас будет в случае, если вы ищете его С-реализацию.

Понимание того, как работает ваш компьютер


Когда мы с коллегами обсуждаем нюансы поведения некоторых частей кода и у нас случаются сложности в понимании происходящего, приходится спускаться на более низкие уровни и заканчивается это всё «говоря языком С, это работает вот так...» — и мы вспоминаем «указатели» (даже в языках, где их нет) и копирование «по ссылке или по значению» (опять таки, даже если язык по-умолчанию реализует лишь что-то одно) и так далее.

Мы редко доходим в детализации происходящего к ассемблерному коду, но вот на уровне языка С мы действительно думаем и разговариваем.

image

Возможность работать над интересными проектами


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

image

Вывод


Миром управляют не масоны. Миром управляют программисты на С.

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

Мир полон устройств, в которых работает код на С. Мы используем их каждый день. Язык С — это не только прошлое, настоящее, но и, насколько хватает взгляда, будущее во многих областях разработки ПО.
Tags:
Hubs:
+59
Comments 143
Comments Comments 143

Articles

Information

Website
www.infopulse.com
Registered
Founded
1992
Employees
1,001–5,000 employees
Location
Украина