Чому вбудовано строго C / C ++ [закрито]


15

Мені це питання не сподобалось, оскільки на нього не можна легко відповісти, але, можливо, я можу перефразувати: "Що втримує Embedded від зміни мов?"

Наприклад, ми в значній мірі бачимо C / C ++ для вбудованих (я думаю, я раніше теж чув АДА? Виправте мене, якщо я помиляюся)

Але що саме утримує Вбудований світ від зміни мов? Це просто те, що C занадто простий у використанні або просто немає насправді "потреби" в зміні, оскільки C робить все добре?

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

Я усвідомлюю, що це свого роду суб'єктивне запитання, однак моє головне питання "Чому", а не "ЯКЩО / КОЛИ"


2
Чи є особлива мова вищого рівня, яку ви хотіли б бачити у вбудованих системах? EDIT: а точніше, які мовні особливості вас цікавлять, що C не надає?
Джон Л

1
@JonL - Я хотів би мати низку функцій низького рівня. EG краще, маніпулювання бітом / ніблом / байтом / словом у великих ints. Краща підтримка безпеки EG - типи функцій, які має Ada.
Rocketmagnet

3
Вбудований не суворо C. Ось купа мов високого рівня для вбудованих систем: electronics.stackexchange.com/questions/3423/…
Kellenjb

1
"Вбудований" має різні значення. 4-бітний мікроконтролер, що працює з тостером, відрізняється від ECU або телевізора. Цей спектр ускладнює відповідь на ваше запитання.
Тобі Джаффі

1
І, як очікувалося, це було закрито. На це запитання я сподівався отримати якісні відповіді, і люди працюватимуть над тим, щоб це було чудовим питанням. Це не так. Натомість ми отримуємо багато відповідей, що це одне речення, яке отримує кілька оновлень, у нас є відповідь, що це проза, яка має протизаконну війну на ній з прапорами, а інші відповіді генерують більше прапорів за 1 день, а решта сайту об’єднана . Питання в тому, що для багатьох людей існує багато правильних відповідей на те, чому вони не змінилися.
Кортук

Відповіді:


18

Перш за все: забудьте про "вбудований", оскільки це не корисна відмінність. Найважливіша властивість - "обмежена ресурсами". Найважливішим ресурсом часто є час, і в цьому випадку ми говоримо про системи реального часу, але це також може бути пам'ять або потужність.

  • Затвердження нової мови є важким і рідкісним. Це вимагає перепідготовки, нових інструментів та пошуку хорошого способу роботи з новою мовою. Це коштує дорого, особливо для раннього усиновлювача. Це також проблема з курячими яйцями: без великої бази користувачів не буде хороших інструментів та бібліотек, але без них не буде великої бази користувачів. Отже, нова мова повинна мати велику перевагу перед існуючою, інакше вона не матиме шансів.

  • Більшість "останніх" нових розробок у мовах заповнюють розрив між наявною потужністю процесора та тим, що потрібно користувачеві. Іншими словами: вони можуть бути неефективними у швидкості, але компенсувати, легше програмісту. Подумайте про зростання таких мов, як Java, Python, Perl, Tcl, якими по суті керує інтерпретатор (можливо після деякої компіляції), і широко використовуйте динамічне управління пам’яттю. Але це не добре відповідає світу, обмеженому ресурсами, де ми хочемо отримати а) максимум використання наявних ресурсів, навіть за рахунок більше зусиль програмування, і б) передбачуваного використання ресурсів.

  • C і C ++ (або підходящий підмножина) все ще є загальноприйнятими мовами найвищого рівня (достатньо, щоб були доступні хороші інструменти, достатньо підготовлених програмістів та широкі бібліотеки), які можуть відповідати передбачуваним вимогам щодо простору та часу, які далеко не далеко від того, що можливо на поточному обладнання. Єдиним претендентом є, я думаю, Ада, але це постраждало від поганого початку: перші реалізації були (сприймаються?) Занадто повільними та неефективними, а тепер (навіть якщо хороші реалізації доступні) мова трохи відстала в функції (порівняно з C ++). Особисто я думаю, що це шкода, а за інших рівних речей я б летів у літаку, який запрограмований на Ада, ніж той, що робився на C або C ++.


+1 - приємна відповідь. Ада здається цікавою мовою, чи є компілятори Ada для маленьких мікросхем навколо?
Олі Глазер

Є GNAT, компілятор GCC Ada. Але AFAIK його не використовували багато в мікросередовищі, тому вам буде важко знайти щось, що читається для запуску.
Wouter van Ooijen

Так, я бачив GNAT, згаданий на сторінці Wiki. Ви маєте рацію, не так вже й багато для невеликих мікросхем, але, здається, існує досить велика підтримка (як ви могли очікувати) для критичних матеріалів місії на 68k, x86, MIPS тощо (наприклад, DDCI )
Oli Glaser

Я бачу, що є і SPARK Ada, про що Deek згадував нижче. Мені доведеться перевірити це, коли у мене є якісь невловимі речі, які вони називають часом ...
Олі Глазер

2
Ада, у формі Gnat, чудово працює на мікропроцесорі AVR, як це спостерігається в Arduino. Найменший виконаний із мене гнат - 65 байт. Справді, все це блимав світлодіод, хоча еквівалентний ескіз Arduino був понад 1 К. На той час, коли мій виконуваний файл досяг 600 байт, він керував двома кроковими двигунами незалежно ... Вам не потрібно SPARK - якщо ви не хочете довести, що ваш світлодіодний блимач формально правильний!
Брайан Драммонд

9

Із вбудованими системами на основі 8 та 16 біт мікроконтролерів зводиться до цього простіше розробити програмне забезпечення, яке може вписатися в обмежені ресурси цих дуже скромних обмежень на зберігання (можливо, кілька 100 байт оперативної пам'яті для 8-бітових мікроконтролерів низького класу , з 2-8 KiB ПЗУ або EPROM / Flash для зберігання коду).

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

Якщо ви дивитесь на мікросети вищого класу (16-розрядні та здебільшого 32-розрядні, із досить рідкісними 64-бітовими) та DSP у вбудованих середовищах, обмеження слабшають, а розробка програмного забезпечення може становити основну частину розробки. зусиль, тому має сенс використовувати найпродуктивніші інструменти розробки, включаючи більш вдосконалені мови з такими функціями, як об'єктно-орієнтоване програмування (OOP), такі як C ++ та новіші мови (Java, Perl, Ruby, Python).

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

Мови, засновані на віртуальних машинах, на яких працює байт-код (Java, Perl, Python), менш зрілі у вбудованому досвіді розробника, і оскільки ці мови призначені для ізоляції програміста від конкретного обладнання, це також ускладнює сумління такі обмеження та обмеження вбудованої апаратної системи. Це менше проблеми зі швидкими 32-бітовими процесорами (наприклад, ARMv7) з MiB, якщо не GiB оперативної пам'яті.

Усі реабілітації BASIC, про які я знаю, досить спрощені в мовних особливостях, залишаючись значною мірою вірним спадщині Dartmouth BASIC з 1960-х. Це означає, що мова не має жодних складних бібліотек виконання часу чи обробку винятків, а інтерпретатор або компілятор пише досить просто, а також має невеликий розмір файлу. Більшість мікроконтролерів мають принаймні один компілятор BASIC.

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


5

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

Справа не в тому, що "C - це поганий або застарілий вибір, але ми все ще використовуємо його за звичкою" (як клавіатури QWERTY).

C сам по собі є дуже хорошим вибором для вбудованої розробки, особливо в критичних для часу додатках. Чому?

  • це досить низький рівень, щоб його легко використовувати для реалізації програм у режимі реального часу. Якщо вам потрібно виміряти час у наносекундах, вибирати переривання кожні 5 мікросекунд або доводиться використовувати точно 64 байти загальної оперативної пам’яті, то з дуже високим рівнем мови це найчастіше буде або неможливо, або дуже важко вирішити це . C дає набагато кращий контроль над апаратним забезпеченням, ніж мови вищого рівня, це одна з найважливіших відмінностей між розробкою для вбудованого порівняно з ПК.

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

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


1
Я думаю, що головним аспектом на користь С є те, що він дозволяє оптимізувати код для певної платформи, дозволяючи такому коду працювати (можливо, не настільки ефективно) на інших. На чомусь подібному до PIC, багато інструкцій з C передбачувано перекладаються на машинні інструкції; цикл на зразок unsigned char i=63,j=128; do {something;} while(--j); while(--i);не буде настільки читабельним, як unsigned int i=16000; do {something;} while(--i);, але він працюватиме швидше та буде ефективнішим на PIC. Якби код було переміщено до ARM, другий підхід був би більш ефективним, але перший все-таки спрацював би.
supercat

4

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

  1. Величезна кількість існуючого коду (бібліотеки / існуючі реалізації)
  2. Великий набір інструментів, який може працювати з цими мовами (IDE, симулятори, ...)

4

У вбудованому світі може бути набагато важче (або неможливо) забезпечити оновлення програмного забезпечення, і тому ще більш важливо гарантувати правильність. На жаль, С дуже мало допомагає в цьому плані і дозволяє програмісту грати швидко і вільно.

Мене болить використовувати C для вбудованих систем, і хотілося б, щоб я міг хоча б перейти до C ++ для багатьох переваг, які він надає у вигляді обмежень, таких як const, посилання, набір строфі тощо.

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

Я думаю, тому люди все ще використовують PHP .

Двомісний молот PHP


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

Ви завжди можете використовувати Pascal - начебто, є додаткові обмеження, яких ви шукаєте :-). Або якась форма Суперлінта.
Рассел Макмахон

2
Однією з найважливіших причин C є те, що НАРОДНЕ простіше написати базовий компілятор C, ніж компілятор C ++. Я працював над одним певний час, перш ніж більш важливі завдання відтягнули мене. Веселі речі! Написання компілятора C ++? Тьфу. Однак я вважаю за краще C ++.
darron

1
@RussellMcMahon - я не можу використовувати Pascal, оскільки для MCU, який я використовую, немає компілятора Pascal.
Rocketmagnet

@darron - Це дуже вдалий момент. Однак є дуже хороші компілятори з відкритим кодом C ++, як-от gpp. Їм просто потрібно було б написати зворотній кінець для цього.
Rocketmagnet

4

Ніхто тут не чув про SPARK Ada?

Це "мала" версія мови Ada та пов'язані з нею інструменти розробки для вбудованих систем, наприклад, авіоніка та інші критично важливі для безпеки програми, такі як медичне обладнання.

Дослідження показують лише 5-10% втрати швидкості обробки порівняно з C / C ++ з більш надійним кодуванням SPARK.

Я думаю, що розповсюдження C у вбудованих системах обумовлено економічними причинами:

  • Він уже є і зазвичай працює в більшості застосунків - і більшість застосувань на об’ємній основі не критичні, ніхто не загине, якщо пральна машина перезаряджена - так навіщо міняти?

  • Набір інструментів SPARK стане додатковою витратою сам по собі і для того, щоб навчити персонал її використовувати.

  • Додаткових переваг SPARK (або інших мов, що не належать до C) для вбудованої системи контролера / управління може виявитися недостатньо для виправдання необхідної премії в ціні товару в очах споживача - особливо, коли вони бачать, як видається, "хороші" конкуруючі бренди, що продають за нижчу ціну.

  • Компанія AdaCore дбає про те, щоб не заглиблюватися в програми масового ринку, оскільки це неминуче вимагатиме значного збільшення персоналу технічної підтримки для вирішення непрофільних питань. AdaCore - компанія високого рівня експертизи, гордість себе такою і виставляє свої продукти та послуги у компанії з високими технологіями. Мова незвична для проникнення на нові ринки, якщо справді цього не хочуть її основні зацікавлені сторони.

Тож, @ Wouter, вам не потрібно турбуватися про те, щоб померти в небі на користь вбудованого коду Ада!

Це вже в літакових системах вже багато років. Так само і для вашого кардіостимулятора.

Але що стосується посудомийної машини, системи управління будівельними послугами, контролером лабораторних печей та іншими не настільки суворо регульованими аренами - чи економічно варто пройти додаткову милю?


Цікаво, спасибі - я не чув про SPARK, перевіряю це.
Олі Глазер

Деякі дослідження показують прискорення відносно існуючої програми на C - подивіться на DNS-сервер "Ironsides" ...
Брайан Драммонд

3

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

Існує також той факт, що багато бібліотек, які постачаються з кажуть Java або C #, марні для великої кількості вбудованих проектів.

З іншого боку, у нас є більш старі мови, такі як Pascal або Basic. З моєї точки зору, вони не настільки популярні, оскільки C зробив себе "галузевим стандартом" мови і дуже велика кількість програмістів та інженерів вивчають C сьогодні. У деяких школах Pascal або Basic навіть не вивчаються. Існує також той факт, що багато популярних сьогодні мов мають C-подібний синтаксис, і використання Pascal буде дивно програмісту на C.

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

Зауважте, що у цій відповіді я зосереджувався переважно на менших системах. Існує також багато вбудованих пристроїв, які використовують більш складні операційні системи, такі як GNU / Linux або інша похідна Unix, і для їх програмування можна використовувати більш-менш будь-яку мову popualr.


1
C популярний, тому що C популярний? :-)
stevenvh

2
@stevenvh Так, це правда. Це свого роду цикл позитивних відгуків. Чим він популярніший, тим популярнішим він стає.
AndrejaKo

3

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

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

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

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


3

Деякі причини, про які інші не згадували:

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

  • Обсяг виробництва: Якщо у вас є великі обсяги виробництва, то економічно доцільно економити на кожному апаратному блоці і витрачати більше на програмістів, оскільки програмування - це разова вартість.



1

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

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

З іншого боку, в середніх і великих вбудованих системах (під якими я маю на увазі більше пам’яті та годинника, більший розмір слова) я б не сказав, що C (або C ++) є таким поширеним. Я бачив системи, що підтримують Python, Forth ... навіть Java.

Але, звичайно, у вас майже завжди є можливість використовувати C / C ++, очевидно, з тих же причин, про які я згадував вище. І якщо ви маєте можливість і бути тим, ким ви вже зручні для C для маленьких вбудованих, чому б ви вибрали іншу мову?


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

3
Я повністю згоден з Кортуком. Деякі частини C ++ потребують широкої підтримки під час виконання, але частина, яка не є, є набагато кращою C (і повністю OO). Обмеження цього підмножини легко застосовується деякими компіляторами компілятора та лінкера. У деяких частинах (страхітливий printf, наприклад) C ++ має принаймні мовний потенціал, щоб вимагати набагато меншої підтримки часу виконання (якщо тільки std :: cout були реалізовані з малими системами на увазі ...)
Wouter van Ooijen

1
@Kortuk, вибачте за те, що там не зрозуміло, але коли я сказав, що "C - це єдина мова, яка ..." не означала, що C ++ не має обох цих речей, я мав на увазі, що C має поєднання двох і C ++ має один з них. Мій акцент робився на час виконання. Я також не кажу, що використовувати C ++ без часу виконання абсолютно неможливо, але це досить незвично. Наприклад, я не бачу, як у вас можуть бути такі речі, як обробка виключень та RTTI без виконання, і це досить важливі функції. Але прошу вибачення, якщо спосіб, який я висловив це, призвів до можливих помилок.
fceconel

@fceconel, я ніколи не використовував C ++ із середовищем виконання, і ми тут обговорюємо вбудовані системи, я ніколи не використовував час роботи моїх мікроконтролерів. Це питання дещо інше, ніж ви, можливо, його прочитали, він запитує, чому C / C ++ - єдиний поширений вибір, а не чому C замість C ++. Я визнаю, використовуючи щось навіть таке просте, як cout ніколи не трапиться в моєму мікро, у мене є кілька безкоштовних шпильок, а не екран.
Кортук
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.