Язык программирования C все еще используется?

96

Я программист на C #, и большая часть моей разработки предназначена для веб-сайтов вместе с несколькими приложениями Windows. Что касается C, я давно не использовал его, так как в этом не было необходимости. Меня удивило, когда одна из моих подруг сказала, что ей нужно изучать C для тестирования рабочих мест, пока я помогал ей изучать C #.

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

C все еще используется в какой-либо новой разработке программного обеспечения или что-то еще?

Monomeeth
источник
46
Вы когда-нибудь видели компилятор C ++ для PIC?
SK-logic
195
Разве я единственный, кому грустно, что кто-то приравнивает обучение к потере времени и денег?
Джетти
37
« Насколько мне известно, все разработки, связанные с COM и дизайном оборудования, также выполняются на C ++ » - похоже, вы на самом деле не проектируете аппаратный интерфейс.
Эд С.
32
Люди забывают, что модные языки высокого уровня, которые мы все любим, часто реализуются в C.
Дэвид Кауден
13
@ThomasEding Мертвый язык? У вас, конечно, очень ограниченные знания языков программирования, если вы считаете C мертвым языком.
JesperE

Ответы:

214

Преимущество C в том, что он является относительно небольшим языком , что облегчает реализацию компилятора C (тогда как компилятор C ++ является монстром для написания) и облегчает изучение языка . Также см. Индекс TIOBE , согласно которому C немного опережает C ++.

В (ИМО) порядке убывания оправдания, C все еще используется для

  • Внедренные вещи Портировать
    компилятор C на маленькую платформу гораздо проще, чем портировать компилятор C ++. Также сторонники C утверждают, что C ++ «делает слишком много за их спинами». Тем не менее, ИМО это ФУД.

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

  • Программное обеспечение с открытым исходным кодом
    Это, в основном, проблема отношения: в OSS всегда предпочитали C, а не C ++ (тогда как во многих отраслях это наоборот). Иррациональная ненависть Торвальдса на самом деле может быть самой важной причиной этого в Linux .

sbi
источник
16
Это больше история, чем отношение. Многие из того, что вы могли бы назвать «основными» пакетами с открытым исходным кодом, были изначально разработаны, когда C ++ не был так широко доступен, как сейчас, и ресурсов по-прежнему было мало.
Blrfl
65
Индекс TIOBE - это шутка. Поисковые хиты бессмысленны.
DeadMG
29
@Sedate: То, что шаблоны обычно вызывают раздувание кода, является мифом, восходящим ко временам древних компиляторов C ++. Современные компиляторы сворачивают идентичные экземпляры шаблона. OTOH, шаблоны позволяют метапрограммирование шаблонов, которое выполняет код во время компиляции, а не во время выполнения, что приводит к меньшему количеству генерируемого кода. Кроме того, они делают для намного более безопасных программ (меньше кастинг), что часто очень важно во встроенном домене. Эксперты C ++ до смерти избили EC ++ из-за (среди прочего) явной глупости выбрасывания шаблонов.
sbi
18
@James: Вы имеете в виду такие вещи, как эффективные абстракции, общее программирование и безопасность типов? Да, кто бы этого хотел.
Xeo
11
@JesperE Так получилось, что с тех пор, как я это написал, я сменил работу и сейчас занимаюсь программированием для встраиваемых устройств. Мы используем C ++, и удивительно, что STL и метапрограммирование шаблонов могут сделать для вас, когда у вас слабое оборудование и жесткие ограничения реального времени, а также необходимость обеспечения надежности. (Мы работаем на электростанциях.) Да, вы должны знать, следует ли вам использовать a std::vectorили a std::mapдля определенного фрагмента кода - но вам не нужно реализовывать его самостоятельно, но вы можете положиться на хорошо проверенные, высокопроизводительные, и надежные реализации библиотеки, предлагающие высокие абстракции.
ВОО
119

C часто используется во встроенном аппаратном программировании, где ресурсы ограничены.

Ядро Linux написано на C, потому что, по словам Линуса Торвальдса, C ++ - ужасный язык .

Joonas Pulakka
источник
14
Я думаю, что большая часть ядра Windows тоже C. И много устаревших систем.
Кодер
14
Чтобы быть полным, Линус попробовал C ++ в ядре. Это было больше проблемой, чем плюсом. В любом случае, развитие ядра - это действительно специфическая тема, но это не значит, что C ++ в целом плох.
Deadalnix
75
По мнению других , аргументация Линуса ужасна.
ВОО
36
Аргументы Линуса могут быть или не быть действительными, но ядро ​​Linux все еще написано на простом C :-)
Joonas Pulakka
15
Линус это мерзавец
ubiyubix
94

Все современные языки, которые я видел, могут взаимодействовать с C:

  • C ++
  • Ява
  • C #
  • питон
  • Haskell
  • Цель С

Необходимость взаимодействия с C вытекает из:

  • С, имеющий простой ABI
  • C быть вокруг в течение длительного времени

Это означает, что, поскольку эти языки могут общаться с C, они могут:

  • использовать свои библиотеки
  • общаться друг с другом через C (например, Clang написан на C ++, но предлагает привязки Python, подключенные к его интерфейсу C).

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

C - это Lingua Franca языков программирования и один из самых простых (с точки зрения ABI), не привязанный к конкретной архитектуре (как, например, ассемблирование), потребуется большой сдвиг, чтобы избавиться от него.

Matthieu M.
источник
45

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

У каждого языка есть свое использование. Разные языки определенно имеют свои ниши. Но спрашиваю про C! Я уверен, что меньше людей используют C #, чем C ежедневно (с абсолютно предвзятой точки зрения работы в магазине, где никто не использует C #).

Быстрый гугл смотрит на относительную популярность языков.
Я уверен, что ничего из этого не является авторитетным, но мы можем использовать его, чтобы увидеть тенденции:

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/

Даже смотря на SO соотношение вопросов по тегам:
https://stackoverflow.com/tags

  • C #: 209845
  • 16 других тегов
  • C: 38790

Таким образом, C - это 18 самых популярных тем для SO (и там много других языков).

Примечание. Указанный выше индекс TIOBE постоянно обновлялся в течение более десяти лет (и содержит некоторые данные за последние три десятилетия), что должно измерять инженеров, работающих на каждом языке (хотя я не знаю, насколько это точно). Из 10 лучших языков, кроме Java / Visual Basic, он отражает то, что знают люди в моем магазине (хотя наши соотношения будут немного отличаться, поскольку у нас гораздо меньший размер выборки).

Loki Astari
источник
1
Этот ответ сбивает меня с толку ... вы продолжаете о C # и затем показываете SO теги вопросов, но ничего из этого не имеет никакого отношения к использованию C. Популярность (особенно в langpop, где для определения популярности используются запросы поисковых систем) на самом деле не отражает современное использование языка, а только современные поисковые запросы на языке. При поиске необходимо учитывать, что C часто используется в университетах для классов более низкого уровня, что может увеличить количество запросов, а также сообщений SO.
Джетти
3
@Jetti: Вот почему я прямо говорю: I am sure none of this is authoritative but we can use it to see trendsно я не согласен с вашим вторым утверждением; C больше не является основным языком, преподаваемым в высших учебных заведениях (если бы это было так, новая партия выпускников не была бы столь бесполезной). Люди обычно изучают Java / C # в наши дни. Также отчет Tiobe о заданиях, а не запросах.
Мартин Йорк,
Оглядываясь назад, мне кажется, что выбор слов плохой с моей стороны. Я не имел в виду классы с малым числом (начальные классы), я имел в виду системные классы (компьютерная архитектура), где используется язык C.
Джетти
4
Количество тегов SO не определяет популярность языка в целом, оно просто показывает популярность языка между пользователями SO .
Эд С.
4
@ Эд С. Очевидно. Но вопрос не в популярности. Речь идет о существовании языка Си. Количество тегов SO показывает нам, что это определенно не мертвый язык. Тот факт, что C находится в топ-2 на других сайтах, не делает его первым / вторым наиболее используемым языком. Но его существование в топ-10 является значительным показателем того, что он не умер. Конечно, ничто из этого не является доказательством того, что C все еще активно используется.
Мартин Йорк,
23

Возможно, вам придется использовать C, когда у вас мало ресурсов и вам не нужны объектно-ориентированные возможности.

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

Согласно индексу Тиобе , C по-прежнему является наиболее используемым языком.


Как предположил tcrosley, вы можете взглянуть на этот связанный вопрос .


Вы также должны проверить некоторые связанные статьи о различиях между C и C ++, такие как эта вики или эта, например.

Jose Faeti
источник
4
гм !! это отличный момент. Я никогда не думал, что «возможности ООП на самом деле увеличивают накладные расходы для языка». Спасибо за разъяснение этого правильного положения. Теперь я могу понять, где C опережает других
Pankaj Upadhyay
7
@Pankaj C ++, как правило, не обязательно добавляет много времени выполнения, большая сложность языка заключается в принципе «не платить за то, что вы не используете» - если вы не используете исключения, то исключения не делают замедлите или добавьте размер к своему коду. Компилятор больше и сложнее
Мартин Беккет
2
о C во встроенном поле, см. также этот вопрос и ответы: programmers.stackexchange.com/questions/84514/…
tcrosley
6
На самом деле вам никогда не нужны возможности ООП, это просто хорошо работает в некоторых сценариях.
Эд С.
2
@Jose Faeti: Мой босс согласился бы, потому что мой босс - опытный, рациональный парень. Он не увлекается программированием религии.
Эд С.
20

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

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

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

«Насколько мне известно, все разработки, связанные с COM и дизайном оборудования, также выполняются на C ++».

Это неверно.

«Поэтому изучение C не имеет смысла, если вам нужно использовать C ++. Я также не верю в историческое значение, так зачем тратить время и деньги на изучение C?»

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

оборота GonzoKnight
источник
7
C является подмножеством C ++. Это то, что вы имели в виду ?? , C не является подмножеством C ++; на самом деле они довольно разные. Да, C ++ является расширением C, или иногда упоминается как C с классами и ООП , но говорить, что C является подмножеством, не оправдывает себя
Pankaj Upadhyay
7
C ++ - это в основном надмножество старой версии C, и с тех пор C пошёл в несколько ином направлении. Некоторые аспекты языков шли в основном в параллельных направлениях, а другие - нет ( кроме C ++ есть много других вещей).
Donal Fellows
Я согласен в голосовании за разъяснение этого факта, что не все действующие программы на C являются действительными программами на C ++, то есть C ++ не является надмножеством C. Однако это надмножество того, как C был в момент принятия решения, чтобы он был суперсет, как упоминал Донал Феллоуз. Просто не имеет смысла говорить, что это уже так, когда это уже не так.
Джошуа Хеджес
16

В дополнение к встроенным системам, большинство новых языков имеют некоторый способ взаимодействия с C. При написании библиотеки, которую вы хотите легко использовать на всех этих языках, C является очевидным выбором. C ++, хотя он также может взаимодействовать с некоторыми языками (такими как Python (только CPython)), C ++ не может взаимодействовать с большим количеством языков из-за некоторых его функций (особенно искажение имен, но шаблоны не помогают в этом вопросе). Интерфейс C ABI является одним из самых простых для взаимодействия (я знаю, что вы можете написать C ++ и использовать extern «C» для интерфейса. Мне все равно).

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

Сейчас, когда есть другие языки, которые хотят стать популярным системным языком (я знаю, в частности, о D ), большая часть программного обеспечения написана на C / C ++. Такие языки, как D, требуют, чтобы кто-то создал оболочку для библиотеки C, а не просто использовал ее напрямую (как вы это сделали бы в C ++).

jsternberg
источник
D может вызывать C-код напрямую, как C ++. Все что вам нужно, если прототип функции (опять же, как в C ++). Вы просто пишете extern(C)на D, тогда как на C ++ пишетеextern "C"
Peter Alexander
@Peter Alexander Я знаю о extern (C) в D. Это то, что я имел в виду, когда говорил обертку. Вы не можете напрямую включать заголовок C (что вы можете сделать в C ++, предполагая, что заголовок C использует extern "C" и имеет блоки #ifdef __cplusplus, что большинство делает). Существуют и другие несовместимости только при использовании extern (C) (особенно в том, как обрабатываются строки. Насколько мне известно, у них нет нулевого терминатора в D. Поэтому вы должны специально изменить массив при передаче его в C).
Йтернберг
11

Проверьте langpop.com , особенно графики от Freshmeat и Google Code. Это показывает, что C все еще далеко впереди.

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

tehnyit
источник
4
НЕ ОТКРЫВАЙТЕ этот URL! Веб-сайт больше не существует, и URL перенаправляет на некоторые раздражающие страницы со спамом.
Николай Суванджиев
11

Я использую его почти каждый день, разрабатывая для iPad / iPhone. Многие библиотеки написаны на C и не имеют эквивалента Objective-C. Так что да, он все еще используется и одним из новейших устройств на рынке.

С помощью C вы можете программировать множество встроенных систем, они маленькие и удобные, и, вероятно, будут доступны в течение многих лет (иначе вы не тратите время и деньги на обучение)

Валентин Раду
источник
2
«Objective-C еще молод», он на самом деле с середины 1980-х, примерно такой же старый, как C ++. Большинство людей, которые используют его, не сталкивались с этим до 2007 года.
Правда, я хотел сказать, что в основном есть много библиотек C, которые не имеют эквивалента в Objective-C для iOS. Действительно, сам язык совсем не молод (проверено с помощью Wiki). Спасибо что подметил это.
Валентин Раду
7

Как правило, для встроенной системы C все еще широко используется.

Этот вопрос дает другой пример.

Индекс Tiobe , который пытается классифицировать язык по популярности / использованию , последовательно ставит C на первое место.

Ксавье Т.
источник
2 место (после Java).
Мартин Йорк,
7
Интересно, что C ++ и Java оба, похоже, имеют тенденцию к снижению в популярности за последние 10 лет, в то время как C остается более или менее статичным.
Пол Р
7

Переносимость.

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

Если вы пришли к тому же самому ответу, что и я, то вывод - да.

tidbeck
источник
5

Ну, я думаю, что C является самым мощным языком по следующим причинам!

1) AT first C, это системный язык (что означает, что его можно использовать для низкоуровневого программирования с минимальным временем выполнения или без него).

2) Скорость результирующего приложения. Исходный код на C может быть оптимизирован гораздо больше, чем языки более высокого уровня, потому что набор языков относительно мал и очень эффективен. Это почти как можно ближе к программированию на ассемблере, без программирования на ассемблере. и вы даже можете использовать сборку и C вместе!

3) C имеет свое применение в программировании прошивки (аппаратное обеспечение). Это связано с его способностью использовать / работать со сборкой и напрямую связываться с контроллерами, процессорами и другими устройствами.

4) C является строительным блоком для многих других известных в настоящее время языков. Посмотрите историю C и вы обнаружите, что она существует уже некоторое время (так или иначе, языки программирования работают). Взгляните на Python, например, полностью объектно-ориентированный язык программирования высокого уровня. Он написан на C (возможно, C ++ тоже). Это говорит вам, хотите ли вы когда-нибудь узнать, что происходит под капотом на других языках; понимание C и того, как оно работает, имеет важное значение.

Прикладной язык используется для программирования высокого уровня, например, для написания текстового процессора или игры. Примерами языков приложений являются Java, C #. Причина в том, что они содержат сборщик мусора, автоматическую типизацию, проверку во время выполнения и т. Д., Где основное внимание уделяется производительности.

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

В целом, он снижается как язык приложений, но все еще остается сильным как системный язык.

Niko
источник
1

О да, это используется. Я работаю в области обработки сетевых пакетов. Я был в двух разных компаниях, где мы обрабатываем сетевые пакеты. Итак, мы работаем на уровне Ethernet или IP, а не на уровне выше TCP.

Интересно, что в обеих компаниях C был выбран над C ++. В одной из компаний один из двух продуктов был построен поверх ядра Linux, тогда как другой продукт был построен в пользовательском пространстве Linux. Продукт ядра, очевидно, использовал C, так как ядро ​​Linux запрограммировано на C, но они решили использовать C и для продукта пользовательского пространства. Оба продукта были разработаны примерно с 2000 года (продукт ядра чуть раньше 2000 года и продукт пользователя чуть позже 2000 года).

В компании, куда я пошел после этого, продукт был построен на C, а не на C ++. Фактически это продолжение проекта середины 1990-х годов, хотя из-за недавних требований к повышению производительности было решено, что по сути все будет переписано. У нас была возможность выбрать C ++ из-за этого переписывания, но мы этого не сделали.

В области обработки сетевых пакетов производительность очень важна. Итак, я хочу реализовать свою собственную хеш-таблицу, имеющую более высокую производительность, чем существующие хеш-таблицы. Я, а не автор хеш-таблицы, выбираю, какую хеш-функцию использовать. Возможно, я хочу производительность и перейти на MurMurHash3 . Возможно, я хочу безопасности и пойти на SipHash . Распределители памяти явно пользовательские. Фактически, все важные структуры данных, которые мы используем, были реализованы на заказ для максимально возможной производительности.

Хотя нет ничего, что могло бы помешать использованию C ++, обычно это плохая идея. Одно выброшенное исключение на пакет снизит скорость обработки пакетов до неприемлемых уровней! Таким образом, мы не можем использовать исключения C ++. Слишком медленно. Мы уже используем своего рода объектно-ориентированный код C, реализуя структуры данных как структуры, а затем реализуя функции, работающие на этих структурах. C ++ позволил бы иметь виртуальные функции, но опять же вызовы виртуальных функций снизили бы производительность, если бы они использовались повсеместно. Итак, лучше быть явным и иметь указатель на функцию, если нужны вызовы виртуальных функций.

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

В качестве примера микрооптимизации, которую вы можете выполнять при программировании на C, взгляните на макрос container_of в ядре Linux. Конечно, вы можете использовать container_of в коде C ++, но кто это делает? Я имею в виду, что это вполне приемлемо в большинстве программ на C, но типичные программисты на C ++ сразу предложили бы что-то еще, например, связанный список, который выделяет узлы ссылки в виде отдельных блоков. Мы не хотим этого, потому что каждый выделенный блок памяти ухудшает производительность.

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

В одной из компаний у нас фактически был собственный скомпилированный язык, в котором была реализована часть функций. Угадайте, какой язык был целевым для компилятора? Ассамблея? Нет, нам пришлось поддерживать как 32-битные, так и 64-битные архитектуры. C ++? Конечно, ты шутишь. Очевидно, это был C с вычисленным goto GCC . Таким образом, пользовательский язык был скомпилирован в C (или фактически в gcc-варианте C, который поддерживает вычисленное goto), а компилятор C произвел сборку.

juhist
источник
0

Я до сих пор использую C ежедневно, и одна из основных причин - взаимодействие с другими языками и SDK, предназначенный для использования плагинами, созданными всеми видами компиляторов на разных языках.

Я не могу написать C ++ API, который использует классы с конструкторами и деструкторами и vtables, перегрузкой функций, выбросами исключений и т. Д., Которые можно использовать из Lua, C #, Python, C и т. Д., Не говоря уже о плагине C ++, написанном с использованием разных компиляторов. и настройки от наших.

Я не могу написать C # SDK, который может быть вызван из Python, например, или Python SDK, который может быть вызван из C #.

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

Кроме того, я иногда нахожу C самым простым языком для работы с такими вещами, как низкоуровневые структуры данных и распределители памяти. Вся дополнительная безопасность типов, которую вы получаете в C ++, не помогает, если вы пишете распределитель памяти, предназначенный для объединения выровненных битов и байтов. И несмотря на богатую систему типов C ++ и обработку исключений, нелегко свернуть ваши собственные структуры данных - просто посмотрите, сколько усилий нужно для того, чтобы написать структуру данных так же тривиально, как std::vectorесли бы вы хотели сделать ее безопасной для исключений и избежать вызова ctors и dtors для элементов, которые вы не вставили в контейнер (я говорю как тот, кто реализовал всю стандартную библиотеку C ++). Когда очень трудно реализовать просто растущий массив, представьте себе работу, необходимую для реализации BVH производственного качества.

Я предпочитаю C ++, а не C, когда я хочу использовать существующие структуры данных или реализовать высокоуровневые структуры с использованием существующих, но если я собираюсь реализовать низкоуровневую структуру данных в ядре механизма, который не используется для С существующими структурами данных C определенно делает это намного проще с помощью своей системы упрощенного типа uber, которая позволяет вам просто находить memcpyвещи здесь и memmoveвещи там, mallocнепрерывный блок и reallocтам, не беспокоясь о создаваемых конструкторах, деструкторах и исключениях.

оборота user204677
источник