Чи використовуєте ви сьогодні C для проекту програмного забезпечення? [зачинено]


18

Якщо так, то де і навіщо це використовувати?

Якщо ні, будь ласка, надайте пояснення, чому C не прийнятний для вас.


10
Звичайно, є додатки, для яких C - правильний і очевидний вибір, але особисто, якщо я ніколи більше не заробляю блок пам'яті, я помру щасливим.
Адам Кросленд

Так- Коні на курси.
Мартійн Вербург

Що це означає?
Лука Маттейс

Це стара приказка для тих, хто стежить за скачками. В основному це означає, що будь-який Кінь може виграти в свій день, якщо Курс (Сухий, Брудний, Довгий, Короткий, що завгодно) йому підходить. Те саме стосується мов програмування - це завжди залежить від контексту та проблемної області.
Мартійн Вербург

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

Відповіді:


38

C - чудова мова для системного програмування

Я використовував би C, якщо я реалізував деякі драйвери програмного забезпечення. І я би використовував C, якщо реалізую власне ядро ​​операційної системи або власну віртуальну машину.

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


4
Чи можете ви вказати, де "Mac OS - це Linux"? Я думав, що Mac OS - Дарвін: en.wikipedia.org/wiki/Darwin_%28operating_system%29
LennyProgrammers

1
@Stephen Furlani: LOL - так, це заниження. :-) Є багато мертвих Unices, таких як Xenix, DYNIX та A / UX, і поточні версії більшість з нас не бачать як HP-UX. Родинне дерево настільки ж складне і заплутане, як у європейських королівських родин.
Боб Мерфі

4
C - жахлива мова для системного програмування. Ми знаємо, що вже більше 20 років, з моменту черв’яка Морріса, і будь-хто, хто все ще використовує його для будь-якого проекту з будь-якими вимогами безпеки, особливо операційні системи або застосовані до мережі додатки, повинен зазнати звинувачення у кримінальній недбалості.
Мейсон Уілер

2
@Mason Wheeler: Що ми повинні використовувати замість цього?
Стів S

1
@ Мейсон Уілер: Хм ... Я відкинув Паскаля в минулому, але, можливо, настав час поглянути ще один (ближче) погляд. Чи є у вас інші пропозиції?
Стів S

17

Так, звісно. Я б використовував C для написання критичних фрагментів системи або частин зв'язку низького рівня. Наприклад, я б використовував C для написання NIF в проекті Erlang лише тому, що це правильний інструмент (tm) для такої роботи. Або я б використав C для написання подібних частин (XS) у проекті Perl.


16

Я використовую C професійно, майже кожен день. Насправді С є найвищим мова рівня, на якій я регулярно програмую.

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

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

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


6
Здається, у вас справді весела робота!
Пол Натан

Це моя робота мрії.
rsmahanti

5

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

Я також бачив програміста на C ++, який намагався створити об'єкт 10K на стеці 1К, що не дуже добре.


2
насправді virtualфункції нормально, оскільки вони дотримуються принципу "ви не платите за те, що не використовуєте", але в обмеженій пам'яті середовищі ви можете вимкнути винятки та RTTI.
Матьє М.

Я відчуваю, що я завжди просто створюю одиночні об'єкти в C ++, щоб забезпечити периферійні інтерфейси. Я думаю, що люди обирають C ++ над C у вбудованих системах, тому що вони думають, що C ++ "кращий".
Ерік

5

Я працюю здебільшого з гіпервізором Xen, з різними бібліотеками, в яких є, та з ядром Linux. Іноді я мушу написати драйвер пристрою (або переписати його знову, щоб nxx віртуальні машини могли спільно використовувати один пристрій, наприклад HRNG). С - моя основна мова, і я цілком задоволений цим.

Чи спробую я написати програму електронних таблиць, використовуючи її? У жодному разі. Кожен інструмент має свої програми, і я радий, що у мене є багато інструментів.

Я люблю C, але не намагаюся молоти гвинти молотком.

Якщо C - розумний вибір для нового проекту, обов'язково. Якщо ні, я використаю щось інше.


4

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

Якщо він відповідає проекту, у мене немає проблем з цим.

Якщо ви хочете розробити веб-додаток, хм, мабуть, це не так (або мені потрібно побачити дуже сильне та фактично підтверджене обгрунтування).

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


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

@qdot: Це поважна причина. Також є причина, чому існують хороші рамки для веб-розробників C і C ++. Просто не було б моїм першим вибором, якщо потрібно розробити загальний веб-додаток чи веб-сайт. У випадку такої рамки, як запам'ятована, це, очевидно, має ідеальний сенс. Так само мати сервер на C може мати сенс. Звідси ймовірно, що ні. Програмовані (і ваша конкретна C реалізація інтенсивно обчислювальної частини веб-додатка) - цілком коректне використання C для веб-розробників. Але для цього вам потрібен хороший програміст C. Тільки не хтось, хто взяв би її в дорогу чи не очікував проблем.
хайлем

А якщо інші люди мають інші поважні причини, такі як, будь ласка, опублікуйте їх тут! Це корисно для читачів.
хайлем

Якщо ви використовуєте C, спочатку ви навчитеся очікувати великої продуктивності, гарного досвіду навчання та безлічі незрозумілих проблем. Я просто намагався заохотити людей використовувати C, оскільки це стає дуже важливим, коли ви переходите від розробника PHP / Ruby / Python "один на мільйон" і починаєте чухати голову проти великих проблем з обчисленнями.
qdot

@qdot: справді. Ганьба, багато людей насправді вже не знають С.
haylem

4

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

Те , що я часто говорю людям , які зацікавлені у вивченні програмування сьогодні , щоб переконатися , що в деяких момент вони навчаються С та їм стає комфортно. Ви можете опинитися в обставинах, коли вам це потрібно. Мені вже не один раз доводилося складати крихітну стаціонарно пов'язану програму "швидкого перезавантаження" і використовувати scp, щоб розмістити її на диску оперативної пам'яті на сервері, звідки підсистема диска повністю відійшла. (Дешеві, дешеві сервери, відсутність надмірності в Інтернеті, і лише можливість завантаження невеликої програми? C - це шлях.)

Крім того, навчитися працювати на C, не стріляючи в ногу, може істотно сприяти вміння ефективно писати іншими мовами та навколишнім середовищем. Принаймні, це був мій досвід.

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


4

Так, я роблю це постійно.

Якщо ви не викликаєте жодної бібліотеки, код, згенерований із C, не потребує підтримки ОС. Це також дає точний контроль над створеною машинною мовою. Тож він чудово підходить для написання драйверів або іншого коду, який живе у просторах ядра, та інших обмежених ситуацій, як-от багато видів вбудованих систем. Це також основна мова для проектів з відкритим кодом, з якими я працюю, як X Windows, GTK + та Clutter.

Хоча ви можете робити все, що на C, ви можете в C ++, часто механізми C ++ полегшують і швидше писати код. Я люблю OOP і те, як класи C ++ інкапсулюють функціональність, і я люблю RAII. Ретельне використання автоматичного виклику деструктора, коли об’єкт виходить із сфери застосування, виключає більшість витоків пам'яті та ресурсів, які є основою програмування на С. STL - це в основному гігантська бібліотека високооптимізованих алгоритмів та структур даних; якщо ви хотіли використовувати їх із C, вам доведеться написати їх самостійно або придбати їх десь.

На жаль, з незрозумілих мені причин, система виконання Linux в Linux потребує спеціальної бібліотеки спільних об'єктів (еквівалентної DLL в Windows, dylib на Mac) для запуску будь-якого C ++, і вона не знайдена при запуску програми C. Тому я не можу виконувати один з моїх улюблених трюків для Mac та Windows, а саме - написати спільний об’єкт на основі C ++ за допомогою API на основі C та викликати його з програми C.

Тож ось мій процес прийняття рішень:

  1. Я працюю в обмеженій ситуації, як драйвер пристрою? Використовуйте C.
  2. Я пишу бібліотеку Linux, хтось іншим доведеться користуватися? Використовуйте C.
  3. Я працюю в коді, який уже написаний на С? Використовуйте 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.
Bob Murphy

3

Так, але це залежить від проекту. C дуже добре підходить для деяких проектів низького рівня або частини найбільшого рішення.

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


2

якщо це повинно бути обом

  • швидко, і
  • портативний

то я використовую C. Можливо, C ++.


Швидкий і портативний, який може бути також Java або C #.
Йонас

11
@Jonas: ні. Переносний не означає лише "windows або linux" ;-)
Стівен А. Лоу

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

2
@Jonas: прочитайте; зверніть увагу на застереження, і знову ж таки, "портативний" не означає лише windows / linux. Питання задає питання, коли ви використовували C; відповідь така: коли вона повинна швидко бігати скрізь . Я люблю Java та C #, але вони кувалди, а в старих / вбудованих системах немає часу виконання. Багато з них навіть не мають місця для проведення часу виконання!
Стівен А. Лоу

2
@Jonas: Я ціную вашу пристрасть, але "нові платформи" - це не тема. Дозвольте навести більш конкретний приклад, щоб побачити, чи це допомагає: мікропроцесори, що забезпечують підтримку вогневого контролю танків на полі бою, мають компілятори C. Вони не мають, ні вони ніколи не матимуть СВМ.
Стівен А. Лоу

2

Так, насправді я останнім часом!

Мені подобається програмування в C. Найбільше я програмую в python, але бувають випадки, коли мені потрібен швидкий код, і мені дуже подобається елегантність, що виходить із простоти мови.

Проект, над яким я зараз працюю, - це база даних, яка, як ви уявляєте, є критично важливою. Наразі я використовую C та деякий пітон, але це з часом буде переважно, якщо не цілком C.


2

Так!

C - мова низького рівня, і є ситуація, коли C - це майже єдиний варіант, як я використовую C для програмування мікроконтролерів, або складаю якийсь код разом для взаємодії з пристроями з класичних портів, таких як паралельний, послідовний або навіть модем!


2

Так. Я витратив більшу частину своєї кар’єри на програмування на C ++, але зараз я пишу більшу частину свого коду в Ruby, і якщо мені потрібна продуктивність або доступ до матеріалів низького рівня, я пишу розширення на C. Це майбутня Людина!


Деякі відповіді стосуються портативності та швидкості як переваг коду С, але зв’язок - ще одна важлива характеристика. Пов’язати "іноземний" код, написаний на С, порівняно легко, завдяки його простої "класичної" стеки дисципліни. Багато компіляторів C дозволять "вбудованому асемблеру" як зручності перейти на дуже низький рівень в архітектурі (очевидно, приносячи в жертву портативності в акті).
hardmath

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.