В настоящее время я учусь на инженера в области телекоммуникаций и электроники, и мы перешли с ассемблера на C в программировании микропроцессора. У меня есть сомнения, что это хорошая идея. Каковы некоторые преимущества и недостатки C по сравнению со сборкой?
Преимущества / недостатки, которые я вижу:
Преимущества:
- Я могу сказать, что синтаксис C намного легче выучить, чем синтаксис Ассемблера.
- C легче использовать для создания более сложных программ.
- Изучение C более продуктивно, чем изучение ассемблера, потому что вокруг C больше развивающих вещей, чем Assembler.
Недостатки:
- Ассемблер является языком программирования более низкого уровня, чем С, поэтому он подходит для программирования непосредственно на аппаратном уровне.
- Гораздо более гибко намекает на работу с памятью, прерываниями, микрорегистрами и т. Д.
Ответы:
Вот некоторые ответы о переполнении стека, которые могут вам помочь (это самые популярные ответы, принятые ответы):
преимущества
/programming/143561/is-there-a-need-to-use-assembly-these-days (только для пользователей 10K) или Архив
Недостатки
/programming/2684364/why-arent-programs-written-in-assembly-more-often
пример
Последнее сообщение ниже - это сообщение о переполнении стека, в котором описан сценарий, в котором будет показан пример сборки, более быстрый, чем C (при выполнении той же функции).
/programming/577554/when-is-assembler-faster-than-c
источник
С легче программировать, по сравнению со сборкой. Есть очевидные причины, которые не стоит перефразировать.
Благодаря простоте использования, C позволяет писать программы быстрее. Как правило, эти программы также легче отлаживать и поддерживать. Кроме того, в Си проще управлять большими и сложными программами.
Часто код, сгенерированный компилятором, одинаково хорош (с точки зрения скорости и эффективности), как рукописный ассемблер - если не лучше.
C чертовски низкоуровневый, и редко вы захотите пойти намного ниже. Добавлять слой абстракции редко бывает плохо.
Когда вам нужно опускаться ниже, вы можете использовать сборку, в противном случае вы можете использовать C.
Вы можете написать Assembly в C-коде, но не C в Assembly-коде.
источник
Программа AC может быть скомпилирована для разных микропроцессорных архитектур.
источник
Не бойтесь, никто больше не разрабатывает новые программы на 100% ассемблере. В настоящее время C может использоваться даже для самых крошечных, самых грязных 8-битных архитектур. Однако знание некоторого ассемблера делает вас значительно лучше программистом Си. Кроме того, в программе всегда есть несколько мелких деталей, которые нужно написать на ассемблере.
Да, синтаксис проще, конечно. Тем не менее, изучение всего языка C со всеми досадными деталями гораздо сложнее, чем изучение всех деталей конкретного ассемблера. Си - это язык намного больше и шире. Но опять же, вам может не понадобиться изучать все детали.
Действительно, C предоставляет механизмы для модульного проектирования программ, такие как инкапсуляция и локальные области видимости / локальные переменные. А у C есть стандартная библиотека плюс огромное количество ресурсов, написанных за последние 30 лет. И самое главное, C является портативным.
C имеет множество готовых функций, библиотек и ресурсов, поэтому будет меньше изобретать колесо. Но кроме этого, ваше утверждение субъективно. Я считаю, что это вопрос личных предпочтений.
Например, я опытный программист на C, иногда программирую на C ++. Я чувствую себя гораздо менее продуктивно в C ++, потому что я не знаю этот язык так хорошо, как я знаю C. Но только потому, что я так думаю, это не обязательно означает, что программирование на C более продуктивно, чем программирование на C ++. Опытный программист C ++ наверняка будет иметь противоположное мнение.
И есть много аспектов "продуктивного". Очень важным аспектом является время обслуживания, и особенно время, необходимое для устранения ошибок, вызванных техническим обслуживанием. С гораздо проще поддерживать, чем ассемблер.
Аппаратное программирование может быть выполнено непосредственно на любом языке. Единственное, что вы не можете сделать в C - это получить доступ к указателям стека, регистрам условий и т. Д. Самого ядра ЦП. Так что, если под аппаратным программированием вы имеете в виду общение с вашим собственным процессором, тогда да, ассемблер позволяет немного больше, чем C. Если вы имеете в виду доступ к внешнему оборудованию, то ассемблер не дает никаких преимуществ по сравнению с C. Но, возможно, это и недостатки, так как зачастую труднее писать универсальный ассемблерный код для конкретного внешнего устройства, чем универсальный C-код.
Это не правильно. C также позволяет вам делать все это, хотя вам, возможно, придется полагаться на специфичный для компилятора C-код, такой как ключевое слово interrupt.
В конце вам нужно знать оба языка для программирования MCU, с акцентом на C.
источник
a = b[i] + c;
намного менее сложен, чем инструкции для загрузкиb[i]
(которая требует вычислений) иc
в регистры (которые должны быть доступны), добавления и хранения.В зависимости от того, как вам нужно встраиваться, C будет выпускать большие, медленные программы. Что заметно увеличит стоимость этой порции продукта. Это может быть капля в море для всего продукта или может радикально изменить продукт. Да, некоторые могут сказать, что усилия по разработке и сопровождению программного обеспечения обходятся дешевле, опять же, это может быть правдой или ложью, если это глубоко внедрено и нацелено на часть с низким энергопотреблением, небольшим и недорогим, вы не говорите о большом количестве кода. Этот код в основном относится к конкретному поставщику или к тому конкретному чипу, поэтому нахождение в C дает нулевые преимущества в отношении переносимости, в любом случае вам придется переписывать для каждой цели. С серией cortex-m от ARM мы только сейчас начинаем иметь возможность конкурировать с C с asm, а не с тем, что люди не использовали C или другие языки более высокого уровня в своих встроенных продуктах,
Дискуссия C против ASM, профессионально, всегда сводится к тому, чтобы написать ее на C и использовать ASM там, где это можно оправдать. И вы можете оправдать это. Во встроенном мире есть производительность и размер.
Вы должны включить цель в это обсуждение. Хотя многие использовали C с Microchip (старые фото, а не pic32, который является mips) с огромными затратами, это ужасный набор инструкций для компиляторов, очень познавательный и интересный набор инструкций, но недружелюбный по отношению к компилятору. msp430, avr, arm, thumb, mips, все хорошо для компиляторов. 8051 тоже плохо.
Даже больше, чем язык инструментов. Особенно в тех случаях, когда беспокойство о разработке кода и управлении является аргументом, вам нужны инструменты, чтобы быть там сегодня и завтра. Наличие одного исходного инструмента, даже включающего один мод gcc, которым управляет одна группа, рискованно с точки зрения бизнеса. Скорее всего, вы найдете более одного ассемблера, и любой, кто достоин того, чтобы быть в этой команде, может поднять ассемблер на выходных (при условии, что написанная вами сборка не является директивой ghee whiz и макрос не радует). Как для asm, так и для C вы бы хотели использовать инструменты с открытым исходным кодом (или ваши собственные собственные инструменты), где у вас больше шансов, даже если это означает использование виртуальной машины для запуска 10-летнего дистрибутива Linux, чтобы иметь инструменты, доступные для жизнь продукта.
Снова, опять же, используйте / учитесь / учите и C, и asm, начните с C и используйте asm, где вы можете это обосновать.
источник
Для сборки существует неизбежный компромисс между обслуживаемостью кода и производительностью. Вы можете написать легкую для чтения / поддержки сборку или написать высоко оптимизированный код; но вы не можете сделать оба.
Для C компромисс не совсем исчез, но он гораздо менее заметен - вы можете написать легко читаемый / поддерживаемый C, который достаточно хорошо оптимизирован.
Отличный программист на ассемблере будет способен побеждать компилятор почти все время, но большую часть времени он намеренно выберет для написания легко читаемый / поддерживаемый код; и поэтому превосходный программист на ассемблере будет побежден компилятором большую часть времени.
Умный способ - использовать как ассемблер, так и C (вместо только ассемблера или только C) - например, использовать C для частей кода, где отличный программист на ассемблере выбрал бы для написания обслуживаемый / медленный код, и использовать ассемблер для остаток (где «высоко оптимизированный и сложный в обслуживании» фактически оправдан).
источник
источник