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


15

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

Переваги / недоліки, які я бачу, є:

Переваги:

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

Недоліки:

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

17
Гм ... ласкаво просимо в нове століття. Вам сподобається тут. У нас є мікроконтролери під керуванням .NET , Java , Linux і навіть люди, які використовують python для програмування фотографій .
ZJR

@ZJR Як ви використовуєте Python для програмування ПОС? Який ПОС?
детлі

2
@detly Це не повноцінний пітон, а лише підмножина ядра. Шар синтаксису python над функціоналом контролера , якщо ви хочете. pyastra - це перший приклад, з якого я повернувся, але я пам’ятаю, що читав документи іншого, що також робив ATMEL.
ZJR

4
Якщо чесно, то зі складністю сучасних процесорів я був би здивований, якби багато програмістів могли написати більш жорсткий, ефективніший асемблер, ніж сучасний компілятор C може все-таки генерувати. Наприклад, я б не хотів намагатися запрограмувати процесор архітектури EPIC в асемблері - Мел був би вдома з Itanium . * 8 ')
Марк Бут

5
@ZJR Це нове століття звучить захоплююче! Мені цікаво, на якій мові було написано .NET виконання, Java VM та Linux для цих мікроконтролерів? Як і в, на якій мові було зроблено власне програмування мікроконтролерів? О ... С або асемблер також цього століття ...

Відповіді:


17

Ось кілька відповідей щодо переповнення стека, які можуть вам допомогти (це найкраща відповідь, прийняті відповіді):

Переваги

/programming/143561/is-there-a-need-to-use-assembly-these-days (лише для користувачів 10K) або Архів

  • Збірка використовується на самих ранніх стадіях завантажувача. Коли повноваження процесора на стеці недоступні, і його важко утримати компілятор C від спроб збереження речей до стеку. Більшість завантажувача, тим не менш, записується на С, як тільки буде здійснена перша рання ініціалізація.
  • Збірка використовується для написання примітивів, що блокують мютекс. По суті, неможливо отримати компілятор C, щоб випромінювати вказівки щодо бар'єру пам'яті в необхідних місцях.
  • Такі збори, як memset () або memcpy (), часто проводяться в зборах. Наприклад, я написав memset () з великим розкрученим циклом, який динамічно обчислює адресу гілки, щоб перейти в середину цього циклу для однієї остаточної ітерації. Процедура змінного струму генерувала б більше коду, забираючи додаткові пропуски I. Крім того, набори інструкцій CPU часто включають завантаження рядка кеша або інші інструкції, які можуть різко прискорити memcpy (), які компілятор C не використовуватиме.

Недоліки

/programming/2684364/why-arent-programs-written-in-assembly-more-often

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

Приклад

Останнє повідомлення нижче - це повідомлення про переповнення стека, в якому викладений сценарій, в якому буде показаний приклад складання, швидший за С (при виконанні тієї ж функції).

/programming/577554/when-is-assembler-faster-than-c


20
  • Програмувати C простіше, порівняно з Асамблеєю. Є очевидні причини, які не варто повторно проводити.

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

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

  • C досить дивно низький рівень, і рідко ви хочете піти набагато нижче. Маючи доданий шар абстракції рідко буває поганою справою.

  • Коли вам потрібно опуститися нижче, ви можете скористатися збіркою, інакше ви можете використовувати C.

  • Ви можете написати Асамблею в С-коді, але не С у Асемблерному коді.


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

@crucified - це вже було поширеним (і зазвичай виправданим) твердженням в середині-кінці 90-х. Компілятор застосовує оптимізації надійно та систематично - не лише тоді, коли помічає можливість.
Стів314

15

Програма змінного струму може бути складена для різних мікропроцесорних архітектур.


4

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

Не бійтеся, більше ніхто не розробляє нові програми в 100% асемблері. На сьогоднішній день C можна використовувати навіть для найдрібніших, найсміливіших 8-бітових архітектур. Однак знання деяких асемблерів робить вас значно кращим програмістом на C. Крім того, у програмі завжди є якась невелика деталь чи дві деталі, які потрібно записати в асемблері.

Я можу сказати, що синтаксис C набагато простіше засвоїти, ніж синтаксис Assembler.

Так, звичайно, синтаксис простіше. Однак вивчення всієї мови С з усіма прикрими деталями набагато складніше, ніж вивчення всіх деталей конкретного асемблера. С - набагато більша і ширша мова. Але знову ж таки, можливо, вам не потрібно буде вивчати всі деталі.

C легше використовувати для створення складніших програм.

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

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

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

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

І до "продуктивних" є багато аспектів. Дуже важливим аспектом є час обслуговування, а особливо час, який потрібно на виправлення помилок, викликаних технічним обслуговуванням. C набагато простіше в обслуговуванні, ніж асемблер.

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

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

Набагато гнучкіше натякає на роботу з пам'яттю, перериваннями, мікрорегістрами тощо.

Це неправильно. C дозволяє вам зробити все це теж, хоча вам, можливо, доведеться покладатися на специфічний для компілятора код C, такий як ключове слово переривання.


Зрештою, вам потрібно знати обидві мови для програмування MCU з акцентом на C.


Яким чином вся мова С є складнішою, ніж деякі з більш прихованих машинних мов? Зробивши те й інше, я думаю, що C без бібліотек значно менш складний. Якщо ви маєте на увазі стандартну бібліотеку C, вам також потрібно щось подібне в асемблері, щоб зробити щось корисне. Можливо, мова є ширшою та ширшою, але вам не потрібно знати її з однаковим рівнем деталізації. a = b[i] + c;набагато менш складна, ніж інструкції щодо завантаження b[i](що займає обчислення) та cв регістри (які повинні бути доступні), додавання та зберігання.
Девід Торнлі

1
@DavidThornley Чим більше ви дізнаєтесь про C, тим більше зрозумієте, наскільки він складний. Чи знаєте ви всі сотні випадків невизначеної / не визначеної / визначеної імплом поведінки? Чи докладно ви знаєте всі правила неявного типу просування (цілі акції, звичайні арифметичні перетворення)? Усі своєрідні правила та синтаксис щодо специфікаторів типу? Всі різноманітні форми статичних / динамічних багатовимірних масивів, включаючи вказівники масиву (не плутати з вказівниками на 1-й елемент масиву) Усі можливості C99 і C11? І так далі.

1
@Lundin: Що важливо для C, це те, що ти можеш задати всі ці питання та знайти конкретні відповіді. Компілятори, що відповідають стандарту, зобов'язані документувати, як вони поводяться для визначених 62 (не "сотень") способів поведінки. Сучасна простота Асамблеї робить це пропозицією обіду, який, в свою чергу, вивантажує складність, з якою C займається на ваш власний код. Я можу протиставити ваш аргумент, запитавши, скільки бібліотек з плаваючою комою написано в зборі для будь-якої заданої архітектури та чому їх поведінка визначається реалізацією.
Blrfl

1
@Lundin: 62 - кількість поведінки, визначеної компілятором, переліченої в розділі 4 посібника GCC. Якщо вийти з того, що визначено бібліотекою, можна порівняти яблука з яблуками, оскільки немає стандартної бібліотеки для складання. Вимога документування - це перше речення §J.3. GCC та жменька комерційних компіляторів, які я купував або використовував з моменту ратифікації C89 (Intel, Sun, IBM, Portland Group), тому ваші "більшість", які не турбуються, не можуть назвати себе відповідними. Якщо говорити про стандарти, як складеться збірка x86, написана з синтаксисом Intel на асемблері з синтаксисом AT&T?
Blrfl

1
@Lundin: Моя машина чудова, дякую. Рульове колесо, прискорювач, гальмо, зчеплення та поворотник розташовані в стандартних місцях, мають стандартну поведінку, а інші елементи керування чітко позначені символами стандарту ISO. Усі визначені реалізацією речі, такі як система розваг, HVAC, nav, круїз-контроль тощо, задокументовані у жировій книзі в рукавичці. Асамблея схожа на мій Плімут 1973 року: її було не так багато, але в сирому вигляді вона не була десь такою здатною, як те, що я зараз веду. Збірка - це той самий спосіб; складність полягає в тому, що ви додаєте до нього.
Blrfl

1

Залежно від того, наскільки вбудованим потрібно зайти, C збирається створювати великі, повільні програми. Що помітно збільшить вартість тієї частини продукту. Це може бути крапля океану для загального продукту або може докорінно змінити продукт. Так, дехто може сказати, що зусилля з розробки та обслуговування програмного забезпечення дешевші, знову ж таки це може бути правдою чи помилкою, якщо це глибоко вбудоване і спрямоване на частину, що мала потужність, невелика і недорога, ви не говорите про багато коду. Цей код здебільшого специфічний для цього постачальника або того чи іншого чіпа, тому, перебуваючи в C, має нульові переваги при переносимості, вам все одно потрібно переписати перед кожною ціллю. З серією cortex-m від ARM ми тільки починаємо мати можливість конкурувати з C asm, не те, що люди не використовували C або інші мови вищого рівня у своїх вбудованих продуктах,

Дебати C проти ASM, в професійному плані, завжди зводиться до того, щоб написати це на C та використовувати ASM там, де ви можете це виправдати. І ви можете це виправдати. У вбудованому світі є продуктивність і розмір.

Ви повинні включити ціль у цю дискусію. Хоча багато хто використовує C з Microchip (старші фотографії, а не pic32, що є мипом) величезною ціною, це жахливий набір інструкцій для компіляторів, дуже навчальний та цікавий набір інструкцій, але компілятор недружній. msp430, avr, arm, thumb, mips, все добре для компіляторів. 8051 також поганий.

Навіть більше, ніж мова інструменти. Окрім тих випадків, коли турбота про розробку та управління кодом є аргументом, вам потрібні інструменти, щоб бути там сьогодні та завтра. Наявність єдиного інструмента джерела, навіть включаючи єдиний мод gcc, який управляється однією групою, є ризиковим з точки зору бізнесу. Ви, швидше за все, знайдете більше одного асемблера, і кожен, хто гідний бути в цій команді, може зібрати асемблера у вихідні дні (доки ви не пишете збірку, це директива ghee whiz і макрос задоволена). І для ASM, і для C ви хочете використовувати інструменти з відкритим кодом (або власні інструменти в домашніх умовах), де ви маєте більше шансів, навіть якщо це означає використовувати віртуальну машину для запуску 10-річного Linux-дистрибутива, щоб мати доступні інструменти для термін служби виробу.

Підсумок, знову ж таки, використовуйте / вивчайте / навчайте і C, і ASM, почніть з C і використовуйте asm там, де ви можете це виправдати.


Ці аргументи звучать для мене старомодно. Якщо ви використовуєте сучасний компілятор, написаний за останні 10 років, то, я вважаю, вам буде важко написати програму асемблера, яка значно ефективніша, ніж програма C. Якщо, можливо, ви не використовуєте 30-річну архітектуру динозаврів, як PIC або 8051, тоді у вас буде повільна програма, незалежно від того, що ви робите ...

Це досить тривіально, щоб виправити повільну збірку, породжену найсучаснішими gcc та llvm. 4.x gcc створює повільніший, менш ефективний код, ніж серія 3.x (для деяких цілей, принаймні тих, які я оцінив, наприклад, ARM). Я думаю, що важливо розвіяти уявлення про те, що компілятор працює краще, ніж люди, тому що це не так. І навіть коли це робить, це робить це лише тоді, коли людина знає, що вони роблять. "знайте свої інструменти", якщо ви хочете їх ефективно використовувати. Почніть з C і використовуйте ASM, коли це потрібно, якщо ви можете це виправдати ...
old_timer

Оскільки gcc є відкритим кодом, це дивний звір. Можливо, саме цей порт погано зроблений. Усі оптимізації коду повинні бути виконані для конкретної платформи, це не є тривіальним завданням. Більш справедливо було б порівняти продуктивність ручного асемблера з комерційним компілятором для цієї платформи.

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

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

1

Для складання існує неминучий компроміс між технічним обслуговуванням та продуктивністю. Ви можете легко збирати / читати / підтримувати збірку, або ви можете написати високооптимізований код; але не можна робити обох.

Для C компроміс не зовсім зникає, але він набагато менш помітний - ви можете легко писати / підтримувати C, який досить добре оптимізований.

Прекрасний програміст з мовної збірки зможе бити компілятор майже весь час, але більшу частину часу вони навмисно вирішать замість цього легко писати / підтримувати код; і тому відмінний програміст з мовної збірки буде бити компілятором більшу частину часу.

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


-3
  1. Відносно добре для ефективності програмування.
  2. Програмувати легко за допомогою мови c, а не за допомогою монтажу.
  3. Мова C може бути досить швидкою, ніж мова збірки.
  4. Можна складати збірку в коді С, але не в С в складі коду.

3
переваги лише ....
Кіран Сапкале

3
Це здебільшого перероблена версія « Які існують деякі переваги / недоліки використання C над складанням»? ; ви нічого тут не додали до дискусії.
Martijn Pieters
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.