Будете ли вы использовать C сегодня для программного проекта? [закрыто]


18

Если да, где и зачем вы это используете?

Если нет, пожалуйста, объясните, почему C не приемлем для вас.


10
Конечно, есть приложения, для которых C является правильным и очевидным выбором, но лично я, если я никогда больше не выделю блок памяти, я умру счастливым.
Адам Кроссленд

Да - Лошади для курсов.
Мартейн Вербург

Что это обозначает?
Лука Маттеис

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

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

Ответы:


38

C - отличный язык для системного программирования

Я бы использовал C, если бы внедрил некоторые драйверы. И я бы использовал C, если бы внедрил свое собственное ядро ​​операционной системы или собственную виртуальную машину.

Это очень хороший язык для выполнения низкоуровневых задач, если вам приходится иметь дело с аппаратными средствами или низкоуровневыми API-интерфейсами ОС для Windows API, Linux, Mac OS X, Solaris и т. Д ... Встроенные системы обычно имеют хорошую поддержку C с компилятором + комплект разработчика.


4
Можете ли вы указать, где "Mac OS - это Linux"? Я думал, что Mac OS - это Дарвин: en.wikipedia.org/wiki/Darwin_%28operating_system%29
LennyProgrammers

1
@ Стефан Фурлани: LOL - да, это своего рода преуменьшение. :-) Есть много мертвых Unices, таких как Xenix, DYNIX и A / UX, и текущие версии, которые большинство из нас не видит как HP-UX. Семейное древо столь же сложное и запутанное, как и европейские королевские семьи.
Боб Мерфи

4
Си - ужасный язык для системного программирования. Мы знаем, что в течение более 20 лет, начиная с Morris Worm, и любой, кто все еще использует его для любого проекта с любыми требованиями безопасности, особенно для операционных систем или сетевых приложений, должен быть привлечен к уголовной ответственности за халатность.
Мейсон Уилер

2
@ Мейсон Уилер: Что мы должны использовать вместо этого?
Стив С.

1
@ Мейсон Уилер: Хм ... Я уволил Паскаля в прошлом, но, может быть, пришло время еще раз взглянуть поближе. У вас есть другие предложения?
Стив С

17

Да, конечно. Я бы использовал C для написания критически важных для системы частей системы или коммуникационных компонентов низкого уровня. Например, я бы использовал C для написания NIF-файлов в проекте Erlang только потому, что это правильный инструмент (tm) для такого рода работы. Или я бы использовал C для написания похожих частей (XS) в проекте Perl.


16

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

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

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

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


6
Похоже, у тебя действительно веселая работа!
Пол Натан

Это работа моей мечты.
rsmahanti

5

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

Я также видел программиста на C ++, который пытался создать 10K-объект в стеке 1K, но это не очень хорошая идея.


2
на самом деле с virtualфункциями все в порядке, поскольку они следуют принципу «вы не платите за то, что вы не используете», но в условиях ограниченной памяти вы можете отключить исключения и RTTI.
Матье М.

Мне кажется, что я всегда просто создаю одноэлементные объекты в C ++ для обеспечения периферийных интерфейсов. Я думаю, что люди предпочитают C ++ над C во встроенных системах, потому что они думают, что C ++ "лучше".
Эрик

5

Я работаю в основном с гипервизором Xen, различными библиотеками и ядром Linux. Иногда мне приходится писать драйвер устройства (или переписывать его так, чтобы виртуальные машины nxx могли использовать одно устройство, такое как HRNG). C мой основной язык, и я вполне доволен этим.

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

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

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


4

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

Если это соответствует проекту, у меня нет проблем с ним.

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

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


Хотите причину использовать его для веб-приложения? Memcached написан на C и является основной частью многих веб-приложений. Кроме того, мой коллега написал фрагмент кода, относящийся к сайту социальной сети на C - как только он становится алгоритмически сложным, с наборами данных, граничащими с размером экономически доступной оперативной памяти, и обработкой запросов, которые выполняются в среднем 23 раза на рендеринг страницы. Мы сэкономили 4 месяца на заработной плате программистов на серверах с помощью приложения C на 4 дня.
qdot

@qdot: это уважительная причина. Есть также причина, почему существуют хорошие фреймворки для C и C ++. Просто не будет моим первым выбором, если необходимо разработать общее веб-приложение или веб-сайт. В случае фреймворка, такого как memcached, он, очевидно, имеет смысл. Аналогично, наличие сервера на C может иметь смысл. Следовательно, вероятно, нет. Memcached (и ваша конкретная реализация на C интенсивной вычислительной части веб-приложения) - вполне допустимое использование C для веб-разработчика. Но для этого вам нужен хороший программист на Си. Просто не тот, кто поднимет его по дороге или ожидает проблем.
Хайлем

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

Если вы используете C, вы научитесь ожидать высокой производительности, хорошего опыта обучения и множества необъяснимых проблем. Я просто пытался убедить людей использовать C, так как это быстро становится критически важным, когда вы перестаете быть «миллионным» разработчиком PHP / Ruby / Python и начинаете ломать голову над большими вычислительными проблемами.
qdot

@qdot: действительно. Позор, что многие люди больше не знают C, правда.
Хайлем

4

Каждый язык имеет достойную нишу использования. Я часто сталкиваюсь с реализацией вещей на языках более высокого уровня, а затем постепенно переносу их на C-land, если мне нужно, чтобы они были более производительными или даже просто более переносимыми. Есть компиляторы C для почти всего существующего, и если вы пишете в универсально доступный API (такой как POSIX), то это может быть очень полезно.

Я часто говорю людям, которые заинтересованы в изучении программирования сегодня, чтобы убедиться, что в какой-то момент они изучат C и освоятся с ним. Вы можете оказаться в обстоятельствах, когда вам это нужно. Неоднократно мне приходилось компилировать крошечную статически связанную программу «быстрой перезагрузки» и использовать scp, чтобы поместить ее на диск RAM на сервере, на котором дисковая подсистема полностью исчезла. (Дешевые, дешевые серверы, без онлайн-резервирования и только возможность загрузить небольшую программу? C - это путь.)

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

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


4

Да, я делаю это все время.

Если вы не вызываете никаких библиотек, код, сгенерированный из C, не требует поддержки ОС. Это также дает вам прекрасный контроль над сгенерированным машинным языком. Так что он отлично подходит для написания драйверов или другого кода, который находится в пространствах ядра, и других ограниченных ситуациях, таких как работа многих встроенных систем. Это также основной язык для проектов с открытым исходным кодом, с которыми я работаю, таких как X Windows, GTK + и Clutter.

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

К сожалению, по причинам, которые я не понимаю, системе времени выполнения в Linux требуется специальная библиотека совместно используемых объектов (эквивалент DLL в Windows, dylib на Mac) для запуска любого C ++, и она не обнаруживается при запуске программы на Си. Поэтому я не могу выполнить один из моих любимых трюков для Mac и Windows, а именно написать общий объект на C ++ с API на основе C и вызвать его из C-программы.

Итак, вот мой процесс принятия решений:

  1. Я работаю в стесненной ситуации, как драйвер устройства? Используйте C.
  2. Я пишу библиотеку Linux, которую кому-то еще придется использовать? Используйте C.
  3. Я работаю внутри кода, который уже написан на C? Используйте C.
  4. Пишу ли я библиотеку Mac или Windows, или я буду использовать только библиотеку Linux? Напишите внутреннее содержимое на C ++, но только открывайте интерфейс C, чтобы избежать проблемы хрупкого двоичного интерфейса.
  5. Используйте C ++.

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


Вы не можете «скомпилировать все это с помощью компилятора C» из-за проблемы malloc с C ++ - вы должны приводить в C ++, но не в C. Конечно, все нормально, если вы приводите в C-код, который совершенно законен, но раздражает ,
альтернатива

1
@mathepic: Да, C ++ определенно строже, чем C, по многим причинам, включая назначение пустых указателей типизированным указателям. Тем не менее, я исправляю ошибки в нескольких унаследованных проектах, частично путем компиляции файлов C с помощью C ++. Я считаю, что приведение типов результатов malloc - это небольшая цена за то, что компилятор C ++ обнаруживает тонкие ошибки из-за совершенно законного кода в C.
Боб Мерфи

3

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

Например. Для бизнес логики хорошо, но не для пользовательского интерфейса.


2

если это должно быть как

  • быстро и
  • портативный

тогда я использую C. Может быть, C ++.


Быстрый и переносимый, это может быть также Java или C #.
Джонас

11
@Jonas: нет. Портативный не означает просто «Windows или Linux» ;-)
Стивен А. Лоу

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

2
@Jonas: читай это; обратите внимание на предостережения, и опять же, «портативный» не означает только Windows / Linux. Вопрос спрашивает, когда вы будете использовать C; Ответ: когда он должен быстро бегать везде . Я люблю Java и C #, но они кувалдой, а старые / встроенные системы не имеют времени выполнения. У многих из них нет даже места для выполнения!
Стивен А. Лоу

2
@Jonas: я ценю вашу страсть, но «новые платформы» не в тему. Позвольте мне привести более конкретный пример, чтобы посмотреть, поможет ли это: микропроцессоры, обеспечивающие поддержку управления огнем для танков на поле боя, имеют компиляторы Си. У них нет и никогда не будет JVM.
Стивен А. Лоу

2

Да на самом деле я недавно!

Мне нравится программирование на C. Я больше всего программирую на python, но бывают моменты, когда мне нужен быстрый код, и я действительно наслаждаюсь элегантностью, которая проистекает из простоты языка.

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


2

Да!

C - это язык низкого уровня, и есть ситуация, в которой C является почти единственным вариантом, как я использую C для программирования микроконтроллеров, или соединяю некоторый код для взаимодействия с устройствами из классических портов, таких как Parallel, Serial или даже Modem!


2

Да. Я посвятил большую часть своей карьеры программированию на C ++, но теперь я пишу большую часть своего кода на Ruby, и если мне нужна производительность или доступ к низкоуровневым материалам, я пишу расширение на C. Это будущий Человек!


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

1

Я бы использовал C, если бы писал операционную систему. Поскольку этого не произойдет в течение следующих двадцати лет, если только я не стану играть в лотерею и у меня не останется ничего, кроме как создать собственный потрясающий дистрибутив Linux, я, вероятно, просто буду придерживаться C #, Java, Python и т. Д. И т. Д. У меня нет не использовал C очень долгое время, но мне всегда нравилось его использовать; Я думаю, однако, что в эти дни моя голова настолько обернута вокруг ОО, что если мне придется вернуться к ней, мне понадобится немного времени, чтобы снова покатиться.


0

C ++ переносим между платформами и встроенными устройствами, такими как микроконтроллеры. (C ++ может быть скомпилирован в C, поэтому микроконтроллеры.)

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

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


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

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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.