it-roy-ru.com

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

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

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

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

97
Pankaj Upadhyay

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

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

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

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

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

215
sbi

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

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

119
Joonas Pulakka

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

  • C++
  • Java
  • C #
  • Python
  • Haskell
  • Цель С

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

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

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

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

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

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

94
Matthieu M.

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

У каждого языка есть свое использование. Разные языки определенно имеют свои ниши. Но спрашиваю про 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, он отражает то, что знают люди в моем магазине (хотя наши соотношения будут немного отличаться, поскольку у нас гораздо меньший размер выборки).

45
Martin York

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

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

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


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


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

23
Jose Faeti

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

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

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

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

Это неверно.

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

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

20
GonzoKnight

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

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

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

16
jsternberg

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

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

11
Valentin Radu

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

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

11
tehnyit

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

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

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

7
tidbeck

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

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

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

7
Xavier T.

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

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

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

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

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

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

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

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

5
niko

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

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

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

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

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

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

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

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

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

1
juhist

Я до сих пор использую 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 его там, не беспокоясь о создании конструкторов, деструкторов и исключений.

0
user204677