Я программист на C #, и большая часть моей разработки предназначена для веб-сайтов вместе с несколькими приложениями Windows. Что касается C, я давно не использовал его, так как в этом не было необходимости. Меня удивило, когда одна из моих подруг сказала, что ей нужно изучать C для тестирования рабочих мест, пока я помогал ей изучать C #.
Я подумал, что кто-то выучил бы C для тестирования только в том случае, если бы разработка велась на C. Насколько мне известно, вся разработка, связанная с COM и разработкой аппаратного обеспечения, также осуществляется на C ++. Поэтому изучение C не имеет смысла, если вам нужно использовать C ++. Я также не верю в историческое значение, так зачем тратить время и деньги на изучение C?
C все еще используется в какой-либо новой разработке программного обеспечения или что-то еще?
источник
Ответы:
Преимущество C в том, что он является относительно небольшим языком , что облегчает реализацию компилятора C (тогда как компилятор C ++ является монстром для написания) и облегчает изучение языка . Также см. Индекс TIOBE , согласно которому C немного опережает C ++.
В (ИМО) порядке убывания оправдания, C все еще используется для
Внедренные вещи Портировать
компилятор C на маленькую платформу гораздо проще, чем портировать компилятор C ++. Также сторонники C утверждают, что C ++ «делает слишком много за их спинами». Тем не менее, ИМО это ФУД.
Системное программирование
Опять же, это обычно из-за утверждений, что легче «знать, что делает компилятор». Тем не менее, многие встроенные программы выиграют, например, от шаблонов и других ключевых функций C ++.
Программное обеспечение с открытым исходным кодом
Это, в основном, проблема отношения: в OSS всегда предпочитали C, а не C ++ (тогда как во многих отраслях это наоборот). Иррациональная ненависть Торвальдса на самом деле может быть самой важной причиной этого в Linux .
источник
std::vector
или astd::map
для определенного фрагмента кода - но вам не нужно реализовывать его самостоятельно, но вы можете положиться на хорошо проверенные, высокопроизводительные, и надежные реализации библиотеки, предлагающие высокие абстракции.C часто используется во встроенном аппаратном программировании, где ресурсы ограничены.
Ядро Linux написано на C, потому что, по словам Линуса Торвальдса, C ++ - ужасный язык .
источник
Все современные языки, которые я видел, могут взаимодействовать с C:
Необходимость взаимодействия с C вытекает из:
Это означает, что, поскольку эти языки могут общаться с C, они могут:
И я бы поспорил, что все они полагаются на C для их времени выполнения (если они не пошли на полную сборку - сомнительно).
C - это Lingua Franca языков программирования и один из самых простых (с точки зрения ABI), не привязанный к конкретной архитектуре (как, например, ассемблирование), потребуется большой сдвиг, чтобы избавиться от него.
источник
На мой взгляд, это очень недальновидный вопрос, похожий на «Мои друзья и я слушаем регги. Кто-нибудь еще слушает рэп?».
У каждого языка есть свое использование. Разные языки определенно имеют свои ниши. Но спрашиваю про C! Я уверен, что меньше людей используют C #, чем C ежедневно (с абсолютно предвзятой точки зрения работы в магазине, где никто не использует C #).
Быстрый гугл смотрит на относительную популярность языков.
Я уверен, что ничего из этого не является авторитетным, но мы можем использовать его, чтобы увидеть тенденции:
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/
Даже смотря на SO соотношение вопросов по тегам:
https://stackoverflow.com/tags
Таким образом, C - это 18 самых популярных тем для SO (и там много других языков).
Примечание. Указанный выше индекс TIOBE постоянно обновлялся в течение более десяти лет (и содержит некоторые данные за последние три десятилетия), что должно измерять инженеров, работающих на каждом языке (хотя я не знаю, насколько это точно). Из 10 лучших языков, кроме Java / Visual Basic, он отражает то, что знают люди в моем магазине (хотя наши соотношения будут немного отличаться, поскольку у нас гораздо меньший размер выборки).
источник
I am sure none of this is authoritative but we can use it to see trends
но я не согласен с вашим вторым утверждением; C больше не является основным языком, преподаваемым в высших учебных заведениях (если бы это было так, новая партия выпускников не была бы столь бесполезной). Люди обычно изучают Java / C # в наши дни. Также отчет Tiobe о заданиях, а не запросах.Возможно, вам придется использовать C, когда у вас мало ресурсов и вам не нужны объектно-ориентированные возможности.
Многие используемые сегодня программы написаны на C, не говоря уже об аппаратных драйверах.
Согласно индексу Тиобе , C по-прежнему является наиболее используемым языком.
Как предположил tcrosley, вы можете взглянуть на этот связанный вопрос .
Вы также должны проверить некоторые связанные статьи о различиях между C и C ++, такие как эта вики или эта, например.
источник
Похоже, вы пытаетесь убедить себя, что C бесполезен и поэтому может быть проигнорировано. Давайте разберем ваш вопрос:
«Я подумал, что кто-то может выучить C для тестирования только в том случае, если разработка на C ведется».
Нет, есть много причин, чтобы выучить C. Даже если бы вы не знали, что я все равно избегал бы использования таких общих выражений, особенно в сочетании с круговой логикой. Очевидно, что нужно знать язык, на котором написан код, чтобы иметь возможность правильно его тестировать / исправлять, но это предполагает, что язык все еще используется как данность и верен для любого языка, а не только для C.
«Насколько мне известно, все разработки, связанные с COM и дизайном оборудования, также выполняются на C ++».
Это неверно.
«Поэтому изучение C не имеет смысла, если вам нужно использовать C ++. Я также не верю в историческое значение, так зачем тратить время и деньги на изучение C?»
Это самая сомнительная логика из всех. Прежде всего, вам следует верить в историческое значение , потому что если бы вы это сделали, вы бы знали, что C - это подмножество C ++, и поэтому знание C может помочь вам стать лучшим программистом C ++. Конечно, C также оказал влияние на большинство языков, которые появились после него, поэтому преимущества на этом не заканчиваются. Кроме того, поскольку C так важен, его нельзя считать имеющим только историческое значение. Он все еще широко используется и, следовательно, не может быть переведен на второстепенную позицию. Вы можете утверждать, что это не тот язык, который должен использовать каждый программист и который у него есть глубокие знания, и это было бы правильно, но, пожалуйста, не опирайтесь на аргумент, что вы не верите чему-то, не изучив сначала его истинные достоинства.
источник
В дополнение к встроенным системам, большинство новых языков имеют некоторый способ взаимодействия с C. При написании библиотеки, которую вы хотите легко использовать на всех этих языках, C является очевидным выбором. C ++, хотя он также может взаимодействовать с некоторыми языками (такими как Python (только CPython)), C ++ не может взаимодействовать с большим количеством языков из-за некоторых его функций (особенно искажение имен, но шаблоны не помогают в этом вопросе). Интерфейс C ABI является одним из самых простых для взаимодействия (я знаю, что вы можете написать C ++ и использовать extern «C» для интерфейса. Мне все равно).
Преимущество также в том, что C и C ++ действительно лучшие языки для системного программирования, а время компиляции C намного быстрее. Время компиляции C ++ заметно худшее из всех языков, которые я использовал.
Сейчас, когда есть другие языки, которые хотят стать популярным системным языком (я знаю, в частности, о D ), большая часть программного обеспечения написана на C / C ++. Такие языки, как D, требуют, чтобы кто-то создал оболочку для библиотеки C, а не просто использовал ее напрямую (как вы это сделали бы в C ++).
источник
extern(C)
на D, тогда как на C ++ пишетеextern "C"
Проверьте langpop.com , особенно графики от Freshmeat и Google Code. Это показывает, что C все еще далеко впереди.
C по-прежнему популярен в системах, где вам нужно быть ближе к металлическим (то есть встроенным системам) и приложениям, требующим высокой производительности.
источник
Я использую его почти каждый день, разрабатывая для iPad / iPhone. Многие библиотеки написаны на C и не имеют эквивалента Objective-C. Так что да, он все еще используется и одним из новейших устройств на рынке.
С помощью C вы можете программировать множество встроенных систем, они маленькие и удобные, и, вероятно, будут доступны в течение многих лет (иначе вы не тратите время и деньги на обучение)
источник
Как правило, для встроенной системы C все еще широко используется.
Этот вопрос дает другой пример.
Индекс Tiobe , который пытается классифицировать язык по популярности / использованию , последовательно ставит C на первое место.
источник
Переносимость.
Составьте список всех систем, которые, по вашему мнению, будут запускать код на C, а затем аналогичный список для всех остальных языков, которые вам нравятся.
Если вы пришли к тому же самому ответу, что и я, то вывод - да.
источник
Ну, я думаю, что C является самым мощным языком по следующим причинам!
1) AT first C, это системный язык (что означает, что его можно использовать для низкоуровневого программирования с минимальным временем выполнения или без него).
2) Скорость результирующего приложения. Исходный код на C может быть оптимизирован гораздо больше, чем языки более высокого уровня, потому что набор языков относительно мал и очень эффективен. Это почти как можно ближе к программированию на ассемблере, без программирования на ассемблере. и вы даже можете использовать сборку и C вместе!
3) C имеет свое применение в программировании прошивки (аппаратное обеспечение). Это связано с его способностью использовать / работать со сборкой и напрямую связываться с контроллерами, процессорами и другими устройствами.
4) C является строительным блоком для многих других известных в настоящее время языков. Посмотрите историю C и вы обнаружите, что она существует уже некоторое время (так или иначе, языки программирования работают). Взгляните на Python, например, полностью объектно-ориентированный язык программирования высокого уровня. Он написан на C (возможно, C ++ тоже). Это говорит вам, хотите ли вы когда-нибудь узнать, что происходит под капотом на других языках; понимание C и того, как оно работает, имеет важное значение.
Прикладной язык используется для программирования высокого уровня, например, для написания текстового процессора или игры. Примерами языков приложений являются Java, C #. Причина в том, что они содержат сборщик мусора, автоматическую типизацию, проверку во время выполнения и т. Д., Где основное внимание уделяется производительности.
Системный язык используется для низкоуровневого программирования. например, микроконтроллер, драйвер и ядро ОС. Примеры включают сборку, C. Для выполнения кода непосредственно на оборудовании им требуется мало времени или нет времени выполнения, и основное внимание программисту должен иметь непосредственный контроль над оборудованием.
В целом, он снижается как язык приложений, но все еще остается сильным как системный язык.
источник
О да, это используется. Я работаю в области обработки сетевых пакетов. Я был в двух разных компаниях, где мы обрабатываем сетевые пакеты. Итак, мы работаем на уровне 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 произвел сборку.
источник
Я до сих пор использую 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
там, не беспокоясь о создаваемых конструкторах, деструкторах и исключениях.источник