Недавно мы опубликовали перевод статьи, в которой приводились аргументы в пользу изучения языков семейства С. Этот пост вызвал немало споров, в том числе была высказана точка зрения, что языки семейства С сходят со сцены; их востребованность хоть и велика, но снижается. Возможно, это и так. Но всё же язык С по-прежнему остаётся одним из наиболее распространённых.

Операционные системы


Многие проекты, написанные на этом языке, стартовали десятилетия назад. Разработка UNIX началась в 1969 году, а её код был переписан на С в 1972. Изначально ядро ОС было написано на ассемблере. И язык С создавался для того, чтобы переписать ядро на языке более высокого уровня, выполняющем те же задачи с использованием меньшего количества строк кода.

В 1985 году вышла Windows 1.0. Хотя код Windows закрыт, в Microsoft утверждают, что ядро её написано по большей части на С. То есть в основе операционной системы, занимающей около 90% мирового рынка в течение десятилетий, лежит язык С.

Разработка ядра Linux началась в 1991 году, оно также по большей части написано на С. В 1992 году ядро Linux вышло под лицензией GNU и использовалось как часть GNU Operating System. А многие компоненты самой ОС GNU написаны на С, поскольку при разработке проекта использовался этот язык и Lisp. Сегодня 97% суперкомпьютеров из Топ 500 наиболее мощных вычислительных систем мира используют ядро Linux. Не говоря уже о миллионах серверов и персональных компьютеров.

Ядро OS X, как и в случае с двумя вышеперечисленными ОС, также в основном написано на С.

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



Базы данных


Все наиболее популярные СУБД, включая Oracle, MySQL, MS SQL Server и PostgreSQL написаны на С (первые три — на С и С++). Эти СУБД используются по всему миру, в финансовых, правительственных, медиа, телекоммуникационных, образовательных и торговых организациях, в социальных сетях и многих других сферах.



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

3D-видео


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

Встроенные системы


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

  • Автоматическая КПП
  • Система контроля давления в шинах
  • Всевозможные датчики (температуры, уровня масла, уровня топлива и т.д.)
  • Управление зеркалами и сиденьями
  • Бортовой компьютер
  • Антиблокировочная система
  • Система удержания в своей полосе
  • Круиз-контроль
  • Климат-контроль
  • Замки с защитой от детей
  • Центральный замок с брелоком
  • Подогрев сидений
  • Система управления подушками безопасности

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

Большинство встречающихся нам устройств оснащены встроенными системами, то есть процессором/микроконтроллером с соответствующими прошивками и необходимой элементной обвязкой. Это позволяет в небольшом объёме реализовать быструю обработку алгоритмов (иногда достаточно сложных) и взаимодействие с пользователями. Например, тот же будильник определяет, какую кнопку вы нажали, как долго её удерживаете, и в соответствии с этим выполняет ту или иную процедуру, выводя на экран необходимую информацию. Или антиблокировочная система в автомобиле: за очень короткий промежуток времени нужно определить, произошла ли блокировка колёс после начала торможения, и при необходимости циклично включать и отключать тормоза, предотвращая неконтролируемое скольжение автомобиля.

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



Почему мы всё ещё используем С?


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

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

Портируемость и эффективность


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

Портируемость и эффективность языка также связаны с тем, что «компиляторы, библиотеки и интерпретаторы других языков программирования часто реализуются на С». Основные реализации таких интерпретируемых языков, как Python, Ruby и PHP также написаны на С. Данный язык даже используется компиляторами других языков для взаимодействия с аппаратной составляющей. Например, С используется как посредник для языков Eiffel и Forth. Это означает, что вместо генерации машинного кода для каждой архитектуры компиляторы этих языков генерируют промежуточный С-код, его обрабатывает С-компилятор и уже генерирует машинный код.

Язык С фактически стал «лингва франка» для разработчиков. Как отмечает Алекс Эллэйн, руководитель инженеров в Dropbox и создатель сайта www.cprogramming.com:

Язык С позволяет удобно и понятно выражать различные общие идеи в программировании. Более того, многие вещи, используемые здесь, — например, argc и argv для параметров командной строки, операторы циклов, типы переменных, — применяются и во многих других языках. Так что, зная С, вам будет гораздо проще общаться со специалистами в других языках программирования.

Управление памятью


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

При взаимодействии ПО с аппаратной составляющей происходит выделение памяти для периферийных компонентов компьютерных систем и задач ввода/вывода. Системные приложения должны использовать выделенные для них участки памяти для взаимодействия с «миром». И здесь как нельзя кстати приходятся возможности языка С по управлению произвольным доступом к памяти.

К примеру, микроконтроллер можно запрограммировать так, чтобы байт, расположенный по адресу 0x40008000, отправлялся универсальным асинхронным приёмопередатчиком (UART, стандартный компонент аппаратной составляющей для взаимодействия с периферийными устройствами) каждый раз, когда четвёртому биту адреса 0x40008001 присваивается значение 1. Причём после того, как это значение присвоено, оно обнуляется периферийным устройством.

Вот как выглядит код на С, отправляющий байт через UART:

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

void send_uart(char byte) 
{ 
   UART_BYTE = byte;    // write byte to 0x40008000 address 
   UART_SEND;           // set bit number 4 of address 0x40008001 
}

Первая строка будет представлена в виде:

*(char *)0x40008000 = byte;

Эта запись говорит компилятору интерпретировать значение 0x40008000 в качестве указателя на char, потом с помощью первого оператора * разыменовать указатель (получить значение по адресу), и наконец присвоить значение byte разыменованному указателю. Иными словами, записать значение переменной byte в память по адресу 0x40008000.

Вторая строка будет представлена в виде:

*(volatile char *)0x40008001 |= 0x08;

Здесь мы выполняем побитовую операцию «ИЛИ» над значением по адресу 0x40008001 и значением 0х08 (00001000 в двоичном представлении, то есть 1 в 4-м бите), и сохраняем результат снова по адресу 0x40008001. То есть присваивается значение четвёртому биту байта, расположенного по адресу 0x40008001. Также декларируется, что значение по этому адресу является изменчивым (волатильным). Компилятор понимает, что оно может быть изменено внешними по отношению к нашему коду процессами, поэтому не делает каких-либо предположений относительно этого значения после завершения записи по этому адресу. В данном случае UART возвращает бит в прежнее состояние сразу после того, как ПО присвоило ему значение.

Эта информация важна для оптимизатора компилятора. Если, например, сделать это внутри цикла for, без указания изменчивости значения, то компилятор может предположить, что оно никогда не меняется после записи, и после завершения первого цикла останавливает исполнение команды.

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


Одной из стандартных возможностей языка, на которую нельзя полагаться в системном программировании, является сборка мусора. Для некоторых встроенных систем недопустимо даже динамическое распределение памяти. Встроенные приложения должны выполняться быстро и оперировать очень ограниченными ресурсами памяти. Чаще всего это системы реального времени, в которых непозволительно делать недетерменированный вызов сборщика мусора. И поскольку динамическое выделение нельзя использовать из-за недостатка памяти, то необходимо применять иные механизмы управления памятью, например, размещать данные по конкретным адресам. Указатели в С позволяют это делать. А языки, которые зависят от динамического выделения памяти и сборщика мусора не могут быть использованы в системах с ограниченными ресурсами.

Размер кода


Код на С выполняется очень быстро и задействует меньше памяти, чем в большинстве других языков. Например, двоичные файлы на С для встроенных систем получаются примерно вдвое меньше аналогичных файлов на С++. Это происходит во многом благодаря поддержке исключений.

Исключения — это замечательный инструмент, появившийся в С++, и если пользоваться им с умом, то они практически не влияют на время исполнения файла, хотя и увеличивают размер кода.

Пример на С++:

// Class A declaration. Methods defined somewhere else; 
class A
{
public:
   A();                    // Constructor
   ~A();                   // Destructor (called when the object goes out of scope or is deleted)
   void myMethod();        // Just a method
};

// Class B declaration. Methods defined somewhere else;
class B
{
public:
   B();                    // Constructor
   ~B();                   // Destructor
   void myMethod();        // Just a method
};

// Class C declaration. Methods defined somewhere else;
class C
{
public:
   C();                    // Constructor
   ~C();                   // Destructor
   void myMethod();        // Just a method
};

void myFunction()
{
   A a;                    // Constructor a.A() called. (Checkpoint 1)
   {                       
      B b;                 // Constructor b.B() called. (Checkpoint 2)
      b.myMethod();        //                           (Checkpoint 3)
   }                       // b.~B() destructor called. (Checkpoint 4)
   {                       
      C c;                 // Constructor c.C() called. (Checkpoint 5)
      c.myMethod();        //                           (Checkpoint 6)
   }                       // c.~C() destructor called. (Checkpoint 7)
   a.myMethod();           //                           (Checkpoint 8)
}                          // a.~A() destructor called. (Checkpoint 9)

Методы классов А, B и C задаются где-то ещё (например, в других файлах). Поэтому компилятор не может проанализировать их и понять, выдадут ли они исключения. А значит компилятор должен быть готов к обработке возможных исключений от любых конструкторов, деструкторов или вызовов прочих методов. Вообще, деструкторы не должны выдавать исключения, это очень плохая практика, но пользователь может это сделать. Зато деструкторы могут вызвать функции или методы (явно или неявно), которые выдадут исключение.

Если один из вызовов в myFunction выдаёт исключение, то механизм возврата стека (stack unwinding) должен иметь возможность вызова всех деструкторов для уже созданных объектов. Для проверки «номера контрольной точки» (checkpoint number) вызова, инициировавшего исключение, механизм возврата стека использует адрес возврата последнего вызова функции. Делается это с помощью вспомогательной автогенерируемой функции (нечто вроде справочной таблицы), которая используется для возврата стека в том случае, если исключение выдаётся из тела этой функции:

// Possible autogenerated function
void autogeneratedStackUnwindingFor_myFunction(int checkpoint)
{
   switch (checkpoint)
   {
      // case 1 and 9: do nothing;
      case 3: b.~B(); goto destroyA;                     // jumps to location of destroyA label
      case 6: c.~C();                                    // also goes to destroyA as that is the next line
      destroyA:                                          // label
      case 2: case 4: case 5: case 7: case 8: a.~A();
   }
}

Если исключение выдаётся в контрольных точках 1 и 9, то объекты не нуждаются в уничтожении. Если выдаётся в контрольной точке 3, то необходимо уничтожить B и A. Если в точке 6 — нужно уничтожить C и A. В каждом из этих случаев должен соблюдаться порядок уничтожения. В точках 2, 4, 5,7 и 8 уничтожается только объект A.

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

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

Почему ст?ит изучать С


Этот язык не труден в изучении, поэтому вам не придётся лезть вон из кожи. Какие вы получите преимущества, освоив С?

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

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

Понимание машины. Зачастую, когда разработчики обсуждают поведение того или иного участка кода или функционала в других языках, то разговор ведётся в «терминах С»: Здесь передаётся только указатель на объект, или он копируется целиком? Возможно ли, что здесь есть какое-либо приведение? И т.д.

При анализе поведения кода высокоуровневого языка мало кто дискутирует в терминологии команд ассемблера. Когда мы обсуждаем действия машины, то обычно говорим (и думаем) на С.



Работа над многими интересными проектами, созданными на С. На этом языке создано много любопытных проектов, от больших СУБД и ядер ОС до маленьких приложений для встроенных систем. Ст?ит ли отказываться от работы с продуктами, которые вам нравятся, только потому, что вы не изучили старый, компактный, мощный и проверенный временем язык программирования?



Заключение


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

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

Мир наполнен устройствами, чьё ПО написано на С. Эти устройства ежедневно используют миллиарды людей. Не надо снисходительно относиться к этому языку: он очень активно используется по сей день и, судя по всему, будет использоваться ещё очень долго в самых разных сферах.

Комментарии (68)


  1. Voley
    26.08.2015 11:55
    +43

    Nice try, C programmers recruiter.


    1. alafix
      26.08.2015 12:19
      +3

      Я бы даже сказал, C programmers trainer. Very costly!


  1. Alexeyco
    26.08.2015 12:00
    +9

    > Миром правят не иллюминаты, а программисты на С
    Но кто правит программистами на С?


    1. stychos
      26.08.2015 12:17
      +15

      Очевидно, Си.


      1. JIghtuse
        26.08.2015 12:24
        +42

        Напомнило.

        Скрытый текст
        Спят подружки вредные
        Безмятежным сном.
        Снятся мышкам хлебные
        Крошки под столом,
        Буратинам — досточки,
        Кошкам — караси,
        Всем собакам — косточки,
        Программистам — Си.

        Евгений Романов, Колыбельная


        1. stychos
          26.08.2015 13:10
          +2

          Отличная колыбельная!


        1. Mishok2000
          26.08.2015 13:32
          +1

          Спасибо, своим детям буду петь перед сном :)


        1. Skaner
          26.08.2015 15:30
          +1

          Надо сохранить! Шедевр!


  1. ruslanys
    26.08.2015 12:39
    +7

    Не надо снисходительно относиться к этому языку: он очень активно используется по сей день и, судя по всему, будет использоваться ещё очень долго в самых разных сферах.

    Нет сомнений в том, что С никуда не денется. Нет аналогов такому прекрасному низкоуровневому языку. Но ведь такую статью можно написать практически про каждый язык программирования.
    * PHP — миллиарды веб-сайтов, от персональных страниц, до корпоративных решений, и пр.
    * JavaScript — ни один веб-сайт на текущий момент не обходится без него (если уж не вспоминать о Node.JS)
    * Java/.NET — миллионы корпоративных решений, банковский сектор, и пр.
    * Python, Ruby, Go…

    В общем, в мире полно прекрасных языков программирования и у каждого свое предназначение и свои фанаты. Я бы не стал выделять ни один из них.


    1. JIghtuse
      26.08.2015 13:04
      +8

      Но ведь такую статью можно написать практически про каждый язык программирования.

      Так и пусть будут, отчего нет? Я с историей и областью применения Си хорошо знаком, а вот о Ruby например мало что знаю.

      К слову, в статье стоило бы упомянуть хотя бы Дэнниса Ритчи.


      1. ruslanys
        26.08.2015 13:24

        Согласен!


      1. IvanIDSolutions
        26.08.2015 23:51
        +2

        Поддерживаю. Конкретно, стоило бы упомянуть книгу, которую многие разработчики, как и я считают ни много не мало Библией Программиста:
        Брайан Керниган, Деннис Ритчи — The C Programming Language


    1. Beltoev
      26.08.2015 13:22
      +11

      Не холивара ради, а «на подумать»: все интерпретируемые выше языки написаны на Си. Если углубляться, то и не только они


      1. ruslanys
        26.08.2015 13:44
        +2

        Согласен. Даже в случае с .NET/Java, байткод исполняет платформа, написанная на С и это даже можно было указать в качестве части этой статьи.

        Но ведь это не значит, что программы, написанные на других языках программирования, написаны на С, верно?


      1. APXEOLOG
        26.08.2015 14:32
        +3

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


        1. TimsTims
          27.08.2015 14:07
          -1

          Добавлю, что текущий уровень прогресса не был бы на таком уровне, если бы человечество не изобрело колесо, затем палку копалку… потом молотки, печи, ножи, свёрла, станки, станки которые делают станки, которые делают другие высокоточные станки итд. Один инструмент позволяет сделать другой. Не сказать ведь сейчас, что без колеса не было бы компьютеров? А без С не было бы php? Заставляет задуматься — Где та граница значимости, кто кого сделал и без кого небыло бы другого


      1. Shablonarium
        03.09.2015 11:04

        .NET сейчас переписывается на C#.


        1. KvanTTT
          04.09.2015 01:07

          .NET не является интерпретируемым языком, да и большая часть .NET уже давно была написана на нем же. На плюсах только CLR.


    1. vilgeforce
      26.08.2015 13:24
      +3

      PHP, JS-машины, Python совершенно точно написаны на С/С++. Популярность всего вами перечисленного только добавляет веса сям :-)


      1. guai
        27.08.2015 19:08
        +1

        ПХП добавляет веса сям — сомнительное преимущество :)


        1. SerafimArts
          27.08.2015 20:21

          хм, почему?


          1. xaizek
            27.08.2015 21:35
            +1

            Просто сейчас модно хаить PHP.


            1. SerafimArts
              27.08.2015 21:42

              Модно было когда пых был совсем откровенной дрянью (во времена 4ки). Сейчас «хейт» просто разоблачает человека, последний раз видевшего PHP во времена институтской жизни лет десять назад, ныне он покрасивее и удобнее многих современников.

              Имхо конечно же.


              1. guai
                02.09.2015 01:53

                вы прям меня заинтриговали. на фоне каких таких совсеменников пых блещет красотой и удобством?
                пых был дрянью, оброс легали и всё, потерял любые перспективы оклематься. современники, с котрыми его имеет смысл сравнивать, тоже на месте не стояли


    1. bodqhrohro
      26.08.2015 20:10
      +3

      ни один веб-сайт на текущий момент не обходится без него
      А как же грёбаные веб-сайты и иже с ними?


      1. ruslanys
        26.08.2015 20:13
        -2

        Смешно :)


      1. shogunkub
        27.08.2015 07:08

        У него там комментарий забавный,

        перед скриптом Google Analytics
        <!-- yes, I know...wanna fight about it? -->


  1. Beholder
    26.08.2015 13:58
    +6

    Вы только определитесь — C или C++. Это, по слухам, всё-таки разные языки. И даже не подмножество один другого.


    1. ruslanys
      26.08.2015 13:59

      Кстати да! У них даже создатели разные…


      1. ruslanys
        26.08.2015 16:05

        Не понимаю почему минусуют. Всегда считал создателем Си — Денниса Ритчи, а С++ Бьёрна Страуструпа.


        1. SerafimArts
          26.08.2015 16:27
          +3

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


          1. ruslanys
            26.08.2015 16:34

            Спасибо за разъяснение.


    1. MrGobus
      26.08.2015 14:42
      +2

      Если исключить С++ статья станет в разы меньше =) Хотя именно после таких вот статеек Линуса Торвальдса спрашивают почему он пишет ядро на С а не на передовом С++ =)


      1. ankh1989
        27.08.2015 05:02
        +2

        После такого вопрошающий обычно много нового узнает о своих программерских скиллах от Линуса и о С++ в целом :)


  1. The_Floyd
    26.08.2015 14:10
    +6

    Какая то нездоровая пропаганда С от Nix Solutions. Статья ни о чем.


    1. Duduka
      26.08.2015 14:56
      -8

      … плюс, за подобные бездарные опусы от си-голодного мозга, авторов просто обязаны ссылать на трехгодичную каторгу по поддержению легаси на фортране, коболе и пл/1, с последующей чисткой остатка сознания бейсиком, модулой-2 и остальными ассемблерами.
      Автор пропустил, практически, всю историю программирования, и ее завоевания (создания стандартизации, посикс стандарта и юниксподобных файловых систем, с их плюсами и минусами), дескредитирует своей интерпретацией этих результатов как победы языка си. Чтож, эта «победа» имеет и обратную сторону — тотольную забагованность програмного обеспечения (тот же миникс и сеЛ4, не гарантируют полное отсутсвие багов в своем коде), постоянные переписывания кода, приводящие к появлению новых-старых си уязвимостей (в эпоху си-благоденствия и мира, как жаль, что все нельзя переписать на си… приходится использовать всякие питоны, явы, диезы и баш), Этот язык — язык легаси, и должен быть использоват только там. Те кто призывает его использовать теперь, и только его, чтож, выше описан приговор ему.


      1. random1st
        26.08.2015 15:13
        +12

        Такое чувство, что программист-сишник увел у Вас девушку. По крайней мере другой аргументации по поводу подобной ненависти к этому прекрасному языку я в Вашем опусе не увидел.


        1. Duduka
          26.08.2015 17:15

          ))) нет, программировал, на этом прекрасном и чудном языке, и вершине программистской мысли, и т.д.т.п. У Вас есть факты опровергающие мои заявления? Да, си не самый кривой из языков, есть и корявее, но то, что он делает с наивными детьми печалит, он состоит из дефектов которыми кастылили систему 70х. И вопрос: «Назовите причины, по которым Вы его считаете более „прекрасным“ по сравнению с модулой, растом или фортом»?


          1. Denvery
            02.09.2015 00:25
            +2

            Не знаю, насколько будет уместным сравнение. Но выскажу точку зрения. Есть куча музыкальных инструментов, но фортепиано — классика. Кроме того, оно наиболее универсально во всех музыкальных смыслах (ну кроме портативности:). Ударные непревзойдённо решают свою узкую задачу, духовые — свою, струнные незаменимы в своей области. Но фортепиано, рояль были и остаются классикой.

            Аналогичное место, как мне кажется, на данный момент занимает С в мире разработки.


            1. Duduka
              02.09.2015 06:16
              -2

              В Ваших аналогиях, си был сконструирован как балалайка или еще более древний предок струнных, можно воткнуть куда угодно и что-то «изобразить», но всегда получатся будет «светит месяц», хотя и в оркестровой обработке.
              Во время разработки си было засилье «монстров» и корпораций, языки оркестры гремели, создавались новые технологии, все было в новинку и никто не мог предвидеть, что мелкомягкие сотворят с этом бизнесом. Все было сложно, хрупко и непредсказуемо, идея мультикс накрылась из-за забагованность ПЛ/1, со сложностью которого IBM не справилось, и появилось вполне логичное решение — занять рынок встроенных решений, для которых нужны были простые os — unix, cp/m, dos; для которых нужна была эта балалайка, которую мог разработать небольшой коллектив балалайко-строителей.


        1. 0xd34df00d
          26.08.2015 17:51
          +2

          Он прекрасный только для очень ограниченного ряда задач, вроде embedded-систем или FFI-обвязок (которые по-хорошему должны кодогенерироваться, и человек к ним притрагиваться не должен).

          Да и в очередной раз скажу, что под attiny на полноценном C++ (с -fno-rtti -fno-exceptions, правда) я в своё время успешно писал. Типобезопасность, шаблоны, это всё.


  1. pasha_golub
    26.08.2015 16:56
    -5

    Ой можно подумать. До начала 19 века все тоже только на угле было завязано. И где он сейчас?


    1. xandr
      26.08.2015 18:32
      +16

      В полном порядке. В мире добывают больше угля, чем нефти.


      1. bodqhrohro
        26.08.2015 20:16
        +6

        Мало того, угля, по прогнозам, хватит ещё на несколько веков, а вот нефти…


      1. xenohunter
        26.08.2015 23:10

        Вы тоже недавно читали статью Тима Урбана про Тесла?


        1. xandr
          31.08.2015 08:57

          Да нет, просто привел известный факт. А статью почитаю, спасибо за наводку.


    1. beeruser
      26.08.2015 23:05

      http://www.vestifinance.ru/articles/44747


  1. OlegTar
    26.08.2015 18:37
    -8

    Работа над многими интересными проектами, созданными на С.

    Работа над легаси, который был написан ещё во времена Си


    1. OlegTar
      26.08.2015 18:46
      -5

      ладно, наверное есть и хорошие примеры, когда программа живет долго и хорошо


  1. forgotten
    26.08.2015 22:15
    +7

    > Лингва франка. Как уже упоминалось выше, С является своеобразным «универсальным» языком для разработчиков.

    Ахаха.
    Осталось напомнить, что C в одном проекте из списка реализованных на C похож на другой проект, ммм, ничем.

    Под C реализована невероятная гора библиотек и фреймворков. Каждый конкретный проект использует какой-нибудь свой.
    Если говорить про C++, то тут вообще полный ахтунг, особенно если в данном конкретном проекте принято упрываться с template-ами или, скажем, всё писать на Boost. Толку-то от лингвы франки, если в кажом новом проекте придётся пару месяцев привыкать к местным конвенциям.


    1. Kunis
      01.09.2015 17:40
      -3

      Абсолютно согласен. В каждом проекте собственный набор понятий.

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

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


  1. IvanIDSolutions
    26.08.2015 23:20
    +3

    Могла не с авторами. Как и многие программисты, начинал именно с С, причем по классической книге Кернигана/Ричи и очень благодарен этому опыту. Java и PHP с этим бэкгрундом зашли очень легко


    1. IvanIDSolutions
      26.08.2015 23:27

      *Согласен с авторами, сорри:)


      1. Alexeyco
        27.08.2015 10:12
        +2

        Т9 тоже написан на С? )))


        1. IvanIDSolutions
          27.08.2015 13:34

          Не знаю насчет T9, но iOS с которого писался коммент — да, на C)))


  1. saterenko
    27.08.2015 09:16
    +3

    C прекрасен, мне больше нечего сказать :)


  1. xaizek
    27.08.2015 11:22
    +1

    Стандартная Библиотека Шаблонов активно использует исключения для информирования об ошибках.
    Меня одного удивило это утверждение? Нашёл небольшой список, который только подтвердил, что до «активно» там далековато и немало начиная с C++11. По факту: iostreams надо попросить их бросать, at() (но он для этого и сделан), new и dynamic_cast для ссылок. IMHO, «активно» не то слово (это не ошибка перевода).

    Кстати, про исключения сказали, а про RTTI нет, их часто вместе отключают (хотя вес у RTTI меньше).


    1. khim
      27.08.2015 17:11

      У RTTI не только вес меньше, но и область применимости. Он даёт вам фактически только dynamic_cast и кой-какая диагностика. Был бы там полноценный reflection — смысла его не отключать было бы больше.


  1. dyadyaSerezha
    27.08.2015 18:30

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


  1. guai
    27.08.2015 19:18
    -5

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


    1. mugisbrows
      01.09.2015 13:50
      +2

      > Основная проблема С в том что он кому-то нужен, а вот D никому не нужен и это не его проблема
      ясно понятно


      1. guai
        01.09.2015 13:58
        -2

        Об чем я и говорю, сишникам ничего не надо, они уже шибко умные


        1. khim
          01.09.2015 21:19

          Тем не менее внушительная часть их приняла C++. Потому что он был полезен. D же долгое время был «конструктором для любителей»: «подшей, подстрочи, укороти — и носи сколько хочешь». Даже вы, рекламируя его не сказали «можно сборщик мусора и отключить, если сделать A, B, и C», а «допилить его работу без сборщика мусора можно было сто лет назад». Ну и кому оно такое нужно, спрашивается?

          Сишники, вы не поверите, решают большую часть реальные задачи, а не занимаются улучшением языка C!


          1. guai
            01.09.2015 21:44
            -3

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


        1. mugisbrows
          02.09.2015 01:22
          +2

          Это чувство когда «сильно умные» используется в качестве оскорбления.


  1. forth
    01.09.2015 17:15

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

    Для FORTH это не так. Большинство взрослых Форт-систем написаны на Форте и генерируют код (шитый код или машинный) без посредства Си.


  1. antoxin
    01.09.2015 21:55

    Подскажите с чем связана мода на define, как в примере об управлении памятью? Ведь можно написать так:

    void send_uart(char byte) 
    { 
       *(char *)0x40008000 = byte;
       *(volatile char *)0x40008001 |= 0x08;
    }
    


    1. diserkin
      02.09.2015 08:34

      Это правило хорошего тона и программирования. Иначе можно «утонуть» в многочисленных константах и адресах. Нужно обрамлять их define с понятными названиями. С этим кодом могут работать другие люди или приходить новые разработчики и им нужно это читать и понимать.