Многие из проектов на языке С, существующих сегодня, начинали разрабатываться ещё десятилетия назад. Операционная система 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

Вывод


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

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

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

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


  1. udattsk
    29.01.2018 16:42

    www.youtube.com/watch?v=cdX8r3ZSzN4

    Простите, не удержался :)


    1. KirEv
      29.01.2018 16:55

      я подсел на Научно-технический рэп )


      1. Error1024
        29.01.2018 18:20

        Они еще те кидалы, на Chaos Constructions 2017 кинули всех(не уверен точно, но вроде как на $$$), в первую очередь посетителей, отказавшись выступать в последний момент, из-за «неправильного» звука на площадке.
        <ИМХО>Поэтому, я только убедился в том, что реперы, в большинстве своем — мрази.</ИМХО>


    1. Evgen52
      29.01.2018 17:45

      Ну тогда уж вот ещё: https://youtu.be/1S1fISh-pag


  1. KirEv
    29.01.2018 16:45

    С — крутой язык, сложно представить какой ЯП сможет его заменить.

    Чуть личной истории
    Помнится, лет десять назад, программировали на С используя Borland С++, славные были времена.

    Сейчас что не более-менее новый язык — так сразу плагины для него к многим IDE и т.п., автодополнения строк\функций и т.п…

    … у нас в универе были контрольные работы по программированию: дают аркуш А4, и сиди пиши программу ) потом бумажку на проверку преподу и можешь переносить свой код в ПК и компилировать.

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

    С давних времен — привычка похожая осталось, когда на серваке быстро чтото сделать\проверить — открывается nano, и пишешь) полезная практика.


    1. catsmile
      29.01.2018 17:30

      Если вам надо «на серваке» быстро что-то сделать/проверить на C, то у меня для вас плохие новости.


      1. KirEv
        29.01.2018 17:39

        Если читаете по диагонали и отвечаете не понимая контекста — у меня для вас плохие новости.


        1. catsmile
          29.01.2018 17:43
          -1

          Если вы додумываете за собеседника то, чего он не делал и не писал — у меня для вас плохие новости.
          /* Я этим до вечера могу заниматься. */


          1. MacIn
            29.01.2018 20:53

            Но человек реально не писал, будто ему нужно что-то сделать/проверить на С, вы эту часть действительно додумали (специально или невольно — неважно).


    1. VioletGiraffe
      29.01.2018 17:47

      ИМХО только С++.
      После С++ голый С кажется языком, подходящим только для отстреливания себе ног.


      1. Sencho_Pens
        29.01.2018 20:03
        +2

        ИМХО только Rust.
        После Rust голый C++ кажется языком, подходящим только для отстреливания себе ног.
        Не подвергайте себя и других опасности, используя небезопасные языки. Ваш код может и убить кого-нибудь.


        1. 0xd34df00d
          29.01.2018 22:13
          +1

          ИМХО только Haskell.
          После Haskell голый Rust кажется языком, подходящим только для отстреливания себе ног.
          Не подвергайте себя и других опасности, используя нечистые языки. Ваш код может и убить кого-нибудь.

          Да что там…
          ИМХО только Idris.
          После Idris голый Haskell кажется языком, подходящим только для отстреливания себе ног.
          Не подвергайте себя и других опасности, используя неверифицируемые языки без проверки тотальности и с неразрешимой проверкой типов. Ваш код может и убить кого-нибудь.


      1. LeonidY
        29.01.2018 23:54
        -1

        С++? О, да — замечательный язык!


        myprint(a);
        b = a;
        myprint(b);

        0x00143020
        0x00285040

        Я был в полном… «восторге»! Operation overload!


        1. VioletGiraffe
          30.01.2018 00:12

          Ничего не понял, кроме того, что С++, как и С — непростой инструмент, перед использованием нужно прочитать инструкцию.


          1. LeonidY
            30.01.2018 03:54
            -1

            Скажите, если не секрет — вам приходилось адаптировать под новую платформу некую, систему на C++ размером в двоичном коде от 10MB до 16MB кода и числом строчек исходного кода за 200000?

            Мне пришлось, и она тупо падала неизвестно где и откуда. Я потратил дня 3-4 прежде чем понял, что результат присвоения не гарантирован. Инструкцию к языку я конечно прочел годы назад. Но не был готов, что на C++ надо проверять каждый шаг и если упустил перезагрузку оператора в 200тыс строк кода для этого типа данных, то увы…


            1. sumanai
              30.01.2018 16:25

              То есть кто-то перезагрузил оператор, явно не документировав это, а виноват С++?


              1. LeonidY
                30.01.2018 23:32

                О! Документированые перезагрузки. Извините, не встречал, ни разу. Комментарии около текста, где определяется перезагрузка еще могут быть, но их еще найти надо в коде на тысячи строк и сотен файлов. А чтобы искать, надо ЗНАТЬ, что они есть и какие есть, между прочим.


                1. sumanai
                  31.01.2018 18:07

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

                  IDE обычно позволяет перейти к определению и реализации метода.


                  1. LeonidY
                    31.01.2018 21:02

                    Ну IDE не всегда доступен, если это работает на голом железе да еще и хитро собирается, то никак.


        1. Hokum
          30.01.2018 01:07

          Я так понимаю, что Вам ближе языки где нет перегрузки функций/методов и запрещено не явное приведение типов? Но тогда причем тут C++, такой пример можно написать много на чем.


          1. LeonidY
            30.01.2018 03:55
            -1

            Здесь идет речь про С vs С++, так что про другие языки не стоит толковать как оправдание кривостей C++.


        1. Nick_Shl
          30.01.2018 05:57

          У нас есть класс для возвращаемых ошибок. Он может содержать одну ошибку. Иногда возникает необходимость вызова подряд нескольких функций, каждая может вернуть ошибку. Без перегрузки операторов пришлось бы иметь два объекта, в первый получать результат функции и если во втором нет ошибки приравнивать второй к первому.
          С перегрузкой же это реализуется элементарно и перегрузив оператор |= вызываем функции подряд, а в конце получаем первую возникшую ошибку.
          P.S. все ошибки фатальные, важно получить первую возникшую и не замаскировать ее успешным выполнением следующей функции.


          1. LeonidY
            30.01.2018 07:57

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


      1. RomanArzumanyan
        30.01.2018 10:03

        С++ кажется языком, подходящим для отстреливания чужих ног.
        А Perl просто отстреливает всех, кто пытается прочесть исходники.


        1. tBlackCat
          30.01.2018 13:55

          Да не помянем язык ADA всуе :)
          Про него неплохо написал (раскритиковал) в 1994 году Мэлор Стуруа.


      1. saterenko
        30.01.2018 11:31

        Вы сильно ошибаетесь, в плюсах не меньше способов отстрелить себе ногу, а может даже больше, учитывая, что он сильно сложнее голого си…


        1. VioletGiraffe
          30.01.2018 11:55

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


          1. saterenko
            30.01.2018 12:23

            Вы умеете вести диспут без гипербол и доведения до абсурда?


            1. 0xd34df00d
              30.01.2018 19:21

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


    1. Error1024
      29.01.2018 18:21

      Embarcadero Rad Studio (C++Bulder) — по прежнему — один из лучших инструментов для написания C кода :)


      1. tronix286
        29.01.2018 20:08

        И это хорошо! Потому что я знаю, что могу в Си запросто отстрелить себе ногу 1000 способами. Свобода! А вот в явах всяких и прочих похапе попробуй-ка? Шаг в сторону — и… и ничего. Скукота и тошнота, прям как бейсик.


        1. MacIn
          29.01.2018 20:54
          +1

          Шаг в сторону — и… и ничего. Скукота и тошнота, прям как бейсик.

          Я попрошу не оскорблять Бейсик! В нем тоже есть возможность стрелять по ногам — POKE, например.


          1. tronix286
            30.01.2018 07:36

            Согласен. Значит Бейсик лучше, чем явы и похопе.


          1. tBlackCat
            30.01.2018 14:02

            Несмотря на то, что Basic считался учебным языком (в моё время им Фортран заменили в ВУЗе), существует приличный вариант DarkBASIC Professional, который теперь позволяет всем желающим поковыряться в своих исходниках.


        1. volkoff_roman
          30.01.2018 11:50

          Переходите на плотное использование JNI в Java и жизнь станет немного ярче.


        1. Gryphon88
          30.01.2018 15:37

          Попробовал на Rust сделать 1 << 65, а он мне не дал. Я сел и заплакал: как же без этого? Или целочисленное переполнение… Куча милых фич недоступна. В Сях выстрел в ногу ценен и сам по себе, и удовольствием, когда ногу успел отдёрнуть.


          1. lain8dono
            31.01.2018 04:22

            А что вы имели ввиду под 1 << 65? Что оно вообще должно делать? При компиляции результат не влезает в 64 бита, о чём компилятор и говорит.


            Или целочисленное переполнение…

            Там оно есть. Просто по умолчанию считается, что эта фигня не должна происходить и debug-сборка паникует на этом. release-сборка паниковать не будет.


            Если же нам требуется переполнение, как часть того, чего мы хотим достичь, то есть удобные варианты сказать "здесь должно быть переполнение". Все эти checked_, saturating_, wrapping_, overflowing_ версии позволяют задокументировать сей процесс. https://doc.rust-lang.org/std/primitive.i64.html (для остальных типов тоже самое). Плюс тип std::num::Wrapping.


            Куча милых фич недоступна.
            В Сях выстрел в ногу ценен и сам по себе, и удовольствием, когда ногу успел отдёрнуть.

            Всё там есть. Нужны UB? Есть их там. Так что спортивная стрельба по ногам тоже присутствует. Можно ставить у всего unsafe и радоваться. К вашим услугам нестабильная функциональность. Там тоже изредка можно в биатлон поиграть. В том числе и с компилятором.


            Или вам не нравится, что подобное можно найти в коде простым grep? Хочется творить какую-то магию, которая by design нечитаема? Тогда да, rust не для вас.


        1. WinPooh73
          31.01.2018 19:18

          Интересно, что в рамках этой метафоры можно сделать с ногами, например, в Хаскеле…


          1. 0xd34df00d
            31.01.2018 20:52

            Ну, единственный раз, когда мне в хаскеле нужно было работать с битами, я ноги себе чуточку отстрелил, по своей глупости (Word32 не в том месте конвертировался в Word64).

            К счастью, quickcheck эту ошибку поймал сразу после написания кода.


          1. potan
            01.02.2018 01:32

            Сделать ленивую структуру зависимой от самой себя

            let a = a ++ [1] in a

            Воспользоваться функцией (!!) и удивиться изменению в типе второго аргумента.
            Написать let n1 = n+1 in… и внутри перепутать значения n и n1.

            На моей практике пожалуй самые заметные проколы.


      1. Amomum
        29.01.2018 22:35

        (покашливает) Как насчет С99?


        1. Hokum
          29.01.2018 23:22

          А почему не спрашиваете о С11?


          1. Amomum
            29.01.2018 23:27

            Потому что С11 от С99 отличается не так существенно. А вот С89 с его объявлениями только в начале функций, отсутствием однострочных комментариев, отсутствием stdbool.h, отсутствием нормального inline, отсутствием designated-initializer'a для структур и т.д. довольно сильно раздражает.


            1. Hokum
              29.01.2018 23:38

              Я с чего-то решил, что это было добавлено начиная с C11, а не C99. Мне designated-initializer не хватает временами в C++ :) Жаль в него этого не добавили.


              1. Amomum
                29.01.2018 23:39

                Вроде как в С++20 его одобрили.


    1. Nick_Shl
      30.01.2018 05:48

      Как говорил один мой преподаватель в университете(в который мы пришли после колледжа) "В колледже учат КАК сделать, а в университете учат КАКУЮ КНИГУ взять с полки, что бы прочитать как сделать".
      Помнить наизусть все библиотечные функции языка — далеко не главное в программировании.


    1. impwx
      30.01.2018 15:51

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

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

      Во-вторых, память в голове не бесконечна. Лучше потратить ее на что-то важное, а тонкости API оставить компьютеру.

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


    1. potan
      31.01.2018 18:47

      Что, кроме нежелание учить что-то новое и унаследованный код, мешает заменить C и C++ на Rust или Ivory?


  1. interprise
    29.01.2018 16:57

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


    1. Free_ze
      29.01.2018 17:42

      Раст настолько крут, что сам фиксит любые баги за программистом?


      1. ozkriff
        29.01.2018 17:45
        +3

        O.o анекдот_сибирские_лесорубы_бензопила.docx


      1. Ugrum
        29.01.2018 18:29

        Нет, он фиксит самих программистов.


      1. potan
        31.01.2018 18:52

        Вы не верите, что количество ошибок на реализацию той же функциональности может сильно зависеть от языка?


        1. Free_ze
          31.01.2018 19:02
          +1

          Я не верю в серебряные пули) В крайности впадать наивно.


          1. potan
            31.01.2018 19:18

            Но и пользоваться первобытным луком в эпоху огнестрельного оружия со свинцовыми и стальными пулями — тоже не самая полезная крайность.


            1. Free_ze
              31.01.2018 19:22

              В самом деле, есть же C++


              1. potan
                31.01.2018 19:27

                Английский длинный лук.


    1. Hokum
      29.01.2018 17:51

      Был бы «талант», а написать уязвимости можно на любом языке. :) Программист никогда не сможет до конца предвидеть как будет использоваться его продукт, для чего и как его будет применять пользователь. А программист это обычный пользователь со своими потребностями и желаниями, когда речь заходит о компиляторе. Раньше попадались байки, как «баги» компилятора использовались «во благо», а на пустом месте байки редко рождаются. :)


    1. BogdanF
      29.01.2018 18:01
      +1

      Очень сомнительно, что это произойдёт в ближайшие 10 (если не больше) лет. Даже если это случится, Rust займёт какую то полку, в лучшем случае вытеснит от туда какой нибудь язык (или просто слегка подвинет) и всё на этом закончится. Си ему не заменить.


      1. PsyHaSTe
        29.01.2018 19:13

        Си ему не заменить.

        Какие-нибудь аргументы будут? Ну кроме «на нем столько всего написано». Как показывает опыт какого-нибудь COBOL'а, это не карт-бланш.


        1. RomanArzumanyan
          30.01.2018 10:13

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

          Как вы сами оцениваете вероятность появления такого языка общего назначения и чудо-компилятора под него?


          1. red75prim
            30.01.2018 16:22

            Скоростью и размером бинарника занимается LLVM. Ему почему-то не понадобилось 40 лет, чтобы догнать GCC. Или вы про какой-то другой компилятор говорили?


            1. RomanArzumanyan
              30.01.2018 16:40
              -1

              Не будем забывать, что llvm начался в 2000 году, 18 лет назад. Кроме того, llvm является бэк-эндом, который работает не с синтаксисом языка напрямую, а с ассемблером виртуальной risc машины. При создании нового языка нужно ещё написать фронт-энд для него, что тоже небыстро и недешёво (индустрия любит стандарты, а комитеты быстро ничего не решают).

              Кроме того, в новом языке нужно заинтересовать производителей железа, потому что именно они являются основными contributor'ами таких проектов, как gcc.

              Наконец, по данным Phoronix, в конце 2017 года связка clang + llvm всё-таки немного отставала от gcc по производительности.


              1. 0xd34df00d
                30.01.2018 19:23

                Я, конечно, не Phoronix, и публичных бенчмарков у меня нет, но в моей практике clang/llvm опережает gcc, иногда существенно.


        1. OYTIS
          30.01.2018 13:18

          Например огромный недостаток по сравнению с C — отсутствие стандарта. Пока что стандарта языка не только нет, он даже не планируется: постоянно подкачивать новые фичи языка с гитхаба — это модно, молодежно, динамично, но не годится для индустрии.
          Еще есть проблема со стандартной библиотекой. Насколько я смог понять, там большие проблемы с модульностью. Если в С, например, я пишу под микроконтроллер, я могу использовать урезанную стандартную библиотеку без тредов хэш-мапов и всего такого, и все еще иметь возможность вызывать printf или memcpy. Даже нажористую плюсовую библиотеку, кажется (см. Christopher Kormanyos «Real-time C++») можно использовать на системах без динамической памяти подсовывая кастомные аллокаторы.
          Растовая библиотека же работает по принципу «все или ничего». Или ты ограничен функциональностью core или же будь добр портируй std целиком: с динамической памятью, тредами и прочими радостями.


          1. PsyHaSTe
            30.01.2018 17:35
            +1

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

            По-моему ничем не отличается от переизобретения в каждой компании своего си-подобного языка при помощи макросов. Точнее, отличается, но в лучшую сторону
            Растовая библиотека же работает по принципу «все или ничего». Или ты ограничен функциональностью core или же будь добр портируй std целиком: с динамической памятью, тредами и прочими радостями.

            Кто вас так жестоко обманул?


            1. PsyHaSTe
              30.01.2018 17:50
              +1

              Прошу прощения, перечитал еще раз. Да, много чего завязано на std, но вообще в планах это починить: internals.rust-lang.org/t/refactoring-std-for-ultimate-portability/4301. Подключаем отдельные крейты и готово.

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


            1. OYTIS
              30.01.2018 19:02

              Про «ultimate portability» — интересно, спасибо. Надеюсь, у них получится.
              Аналогии с макросами я не понял, честно говоря. Я вот о чем: для C сейчас существует множество компиляторов. С открытым кодом, с закрытым кодом, оптимизированные под конкретный процессор, со встроенным theorem-prover'ом, компилирующие в прошивку для FPGA и т.д. — полный зоопарк под любую бизнес-модель и область применения.
              Все это стало возможным благодаря тому, что язык С стандартизирован, любой может взять стандарт и написать под него компилятор. С Rust же это невозможно в принципе, просто потому что стандарта нет и не планируется. По сути Rust = rustc, и это достаточно серьезное ограничение для языка, который хочет захватить мир.


        1. BogdanF
          31.01.2018 13:57

          Ну, например, кроме крохотной кучки энтузиастов, увидевших в Rust будущее индустрии, на него нужно пересадить еще производителей железа, огромное сообщество Linux и игровую индустрию (последнее — C++, но это дела не меняет). И так далее, дополнять можно еще долго. Каков процент вероятности, что это произойдёт?


    1. Akon32
      29.01.2018 18:47

      Rust какой-то "инопланетный" и многословный, что ли. Хорошо, если он "взлетит", но сейчас попытки его использования оставляют странные впечатления. Он почему-то отпугивает больше, чем любой из C, C++, Java, Scala, Python, Lua, Delphi, R, Haskell.


      1. PsyHaSTe
        29.01.2018 19:16

        Засунуть в одну копилку R, Hashell, Delphi и скриптовые языки это сильно :)

        Хаскель отпугивает намного сильнее, моё мнение. По крайней мере его я освоить так и не мог, а с растом спокойно подружился — достаточно прочитать растбук. Из сложных концепций можно разве что лайфтаймы назвать, но стоит понять, что это просто декларативный способ указания отношений «Х живет дольше У» и все становится очевидно.


        1. 0xd34df00d
          29.01.2018 22:15

          Хаскель отпугивает намного сильнее, моё мнение.

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


          1. PsyHaSTe
            29.01.2018 23:50

            Да особо рассказывать нечего. Поставил IDE, начал смотреть примеры, книжки, статьи. Не сказать, что что-то непонятно: опыт F# у меня, например, уже был, как и лиспов всяких. Но как-то не зашло. Хотя я как раз хотел проникнуться всей мощью IO монад и прочих методов гамбургера. Мб попробую еще раз позже. Сейчас приоритет — научиться писать на расте :)


            1. 0xd34df00d
              30.01.2018 19:24

              Может, от статей-книжек зависит. Мне в своё время по Real World Haskell отлично зашло. Сейчас уже всякие Haskell From The First Principles рекомендуют.


      1. lain8dono
        29.01.2018 19:19

        попытки его использования оставляют странные впечатления

        Надо ли полагать, что это из-за его главной фичи? Которая ownership. Такого действительно нет в других ЯП.


      1. potan
        31.01.2018 18:58

        По сравнению с C++ Rust не многословен. И там и там приянто полностью прописывать пространства имен, но в библиотеках Rust они организованы более продумано и лучше работает вывод типов.


  1. KirEv
    29.01.2018 18:12

    Меня смущает, что допускают публиковать дубликаты.

    И кстати, это не первый перевод, мягко говоря, давней статьи.

    тоже самое

    PS: искал инфу про С, случайно напоролся.


    1. maisvendoo
      29.01.2018 22:36

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


    1. tangro Автор
      29.01.2018 23:22
      +1

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



  1. andy_p
    29.01.2018 18:33

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

    Массоны — это такие масоны, которые пишут на С.


  1. Akon32
    29.01.2018 18:38
    +1

    Имхо, почти про любой язык из TOP-10 Tiobe Index (ладно, TOP-5) можно сказать, что он "управляет миром". У них нет многих преимуществ C, но есть масса других преимуществ.
    Какая-то односторонняя статья. Создаёт впечатление, что других языков почти нет, или они не работают.


    1. SeriousAlexej
      29.01.2018 23:23
      +1

      Имхо, есть неиллюзорная вероятность того, что рантайм и интерпретаторы тех языков в Топ10 написаны на С.
      Какой-то односторонний отзыв. Создает впечатление, что С почти ничего не стоит, или он легко заменим.
      ;)


  1. geher
    29.01.2018 19:34

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

    Замечаю, что в этом деле все больше набирает обороты С++.
    Часто не используются классы, но код все же именно на С++ (используются фишки именно этого языка).
    Да и классы тоже частенько стали пользовать.
    Даже ардуина программируется на С++ (даром что Wiring, но это всего лишь библиотека-обертка).


    1. Nick_Shl
      30.01.2018 06:02

      А чему удивляться? C++ — это структуры данных + функции обработки данных в этих структурах с неявным указателем this… ну и ещё немного приятных мелочей.


    1. Gryphon88
      30.01.2018 15:40

      Исключения все равно надо прибивать. И stl не всегда влезает.


  1. vagran
    29.01.2018 20:36

    Оверхед C++ всё же отключается, и да, при системной и embedded разработке на C++ стандартная библиотека заменяется специально спроектированной под нужную среду. В целом на сегодняшний день нет смысла что-либо писать на си, любую задачу, выполнимую на си можно выполнить и на плюсах (каком-то его подмножестве, но в любом случае это будет удобнее). Проблема обычно только в наличии специалистов с нужной компетенцией, для таких задач все особенности языка и его рантайма нужно знать досконально.


  1. ilmarin77
    29.01.2018 21:26

    В советские времена слышал высказывание «Язык C придуман западными программистами для борьбы с капиталистическими эксплуататорами»… а в 90х видел комментарий в коде «на C писать — идиотом стать»


    1. Free_ze
      30.01.2018 11:11
      -1

      Ох уж эти хипсторы 90х, пихающие С куда можно и нельзя…


  1. zenkz
    29.01.2018 21:38

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


    1. Free_ze
      30.01.2018 11:13
      +1

      От дурака никакая защита не спасет. Чем ниже порог вхождения в технологию, тем более бестолковые люди придут в IT.


      1. zenkz
        31.01.2018 17:48

        Ну в ИТ уже много бестолковых пришло, но от этого толковых меньше не стало, а их ценность только повысилась. А про защиту от дурака могу сказать одно — "=" в условиях. Кому нужно присваивать что либо в условиях?! Почему разработчики языка сразу не заблокировали этот источник ошибок?! А таких вещей в С очень много… И именно поэтому я его и не люблю…


        1. Free_ze
          31.01.2018 18:03
          +1

          Кому нужно присваивать что либо в условиях?!
          Ну, сишники любят лаконичные циклы, например
          while ((nbytes = getline(&buffer, &bufsiz, fp)) != -1) {...}
          или
          if ( B *b = dynamic_cast<B*>(a) ) {...}

          Честно говоря, на практике никогда не сталкивался с подобными ошибками. Тем более, что современные статические анализаторы умеют отыскивать потенциальные ошибки с присваиванием.


          1. potan
            31.01.2018 19:07

            Можно было бы сделать присваиванием ':=', а сравнение '==' — тогда бы их сложнее было перепутать.


            1. Free_ze
              31.01.2018 19:39

              Может просто освоить слепую печать и контролировать свои действия визуально?)


      1. potan
        31.01.2018 19:05

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


        1. Free_ze
          31.01.2018 19:09

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


          1. potan
            31.01.2018 19:20

            Факторов меньше не становится. Просто компилятор вовремя сообщает, что какой-то фактор неучтен.


            1. Free_ze
              31.01.2018 19:28

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


              1. potan
                31.01.2018 19:38

                Что бы понимать, что компилятору не понравилось.


                1. Free_ze
                  31.01.2018 19:40

                  Мой компилятор обычно пишет причину и даже указывает предполагаемое место проблемы, а рантайм бросает исключения, которые подробно описаны в референсе. А ваш?)


    1. Alexeyslav
      30.01.2018 12:29
      -2

      Этот язык просто попал в классическую ловушку — для него написано слишком много библиотек чтобы от него можно было отказаться и в то же время по этой же причине никто не будет писать аналогичные библиотеки для других языков. ИМХО лучше было бы чтобы победил именно паскаль. Если бы его развивали, сейчас по свойствам был бы на том же уровне что и С но более выразительный. Просто видимо изначально кому-то не понравилось много писать begin-end и подкупили краткие скобочки {} языка С, но это как раз и есть АД си-шечки — в более-менее сложных программах просто в глазах рябит от этих скобочек.


      1. sumanai
        30.01.2018 16:57

        но это как раз и есть АД си-шечки — в более-менее сложных программах просто в глазах рябит от этих скобочек

        (Чувствую (на (лиспе (вы (не (писали))))))


      1. zenkz
        31.01.2018 17:56

        Скобочки это хорошо и намного более короче и нагляднее, чем begin-end. А вот настоящий ад C — это всё что связано с указателями (*, ^ и т.д.), а также особая любовь к _ в названиях переменных и функций, а также разбавление кода знаками вроде <>, # и % Из-за этого код C выглядит как набор символов. Добавьте к этому не очень явное наименование стандартных функций вроде scanf или puts и получится мощный язык, на котором не очень-то хочется писать…


        1. MacIn
          31.01.2018 23:14

          Скобочки это хорошо и намного более короче и нагляднее, чем begin-end.

          Короче — да. Нагляднее — ничуть. Обозначение блока словами создает «отчеркивание» сверху и снизу, это визуально выделяет блок, причем много сильнее, чем со скобками.


      1. potan
        31.01.2018 19:11

        Паскаль гораздо конвервативнее, чем C.
        Так разделение statement/expression в нем заметно более выраженое, а современная тенденция как раз в сторону expression-based языков.
        На тот момент все-таки C был лучшим выбором, просто не надо было делать его окончательным.


    1. potan
      31.01.2018 19:00

      А чем Rust не такой язык?


  1. stDistarik
    29.01.2018 22:06

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

    Наверное стоило бы добавить — «однако писать на нём очень не просто».


  1. tgz
    29.01.2018 22:26

    Прадед мой лопухом подтирался.
    Дед мой лопухом подтирался.
    Отец мой лопухом подтирался.
    Я сам лопухом всю жизнь подтирался.
    И тебе, сынок, придется.


  1. saw_tooth
    29.01.2018 22:30

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


  1. quwy
    30.01.2018 02:43

    Помнится, первая (а может и вторая) версия Windows была написана на Pascal. От него осталась соответствующая конвенция вызова функций Win16 API.


  1. red75prim
    30.01.2018 06:27

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


    Впрочем, не все довольны возможностями, предоставляемыми C. Microsoft использует SAL (source-code annotation language) в драйверах, API и, надо полагать, в ядре. SAL позволяет в машиночитаемой форме сказать что-то вроде: "Этот параметр — не просто указатель, а указатель на массив, длина которого содержится вот в этом параметре", а также многое другое.


    1. red75prim
      30.01.2018 06:37

      Дополнение. QWERTY не предотвращает сцепление рычагов (клавиши E и R для часто встречающегося в английском "er" расположены рядом) и не самая удобная раскладка для печати.


      1. TheKnight
        01.02.2018 11:58

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


  1. Barabek
    30.01.2018 08:46

    Описание утра порадовало. Перед гаражом с пультом не хватает еще утренней пробежки с плеером на Си, а потом душа, подогретого умным домом на Си.


    А я утром встал, сходил в туалет, умылся — и уже опаздываю (с)


  1. rail-ka
    30.01.2018 09:28
    -1

    Еще Redis, Nginx, SQLite, которые есть в большинстве проектов.


  1. malishich
    30.01.2018 11:50

    Более того, все промышленные «вещи» спроектированы в CAD системах, написанных на С/С++. Думаю С/С++ на сегодня самый лучший язык.


    1. Evgen52
      31.01.2018 00:04

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


      1. Alexeyslav
        31.01.2018 14:21

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


  1. Durimar123
    30.01.2018 13:36


  1. tBlackCat
    30.01.2018 14:14

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