Каковы некоторые преимущества / недостатки использования C перед сборкой? [закрыто]


15

В настоящее время я учусь на инженера в области телекоммуникаций и электроники, и мы перешли с ассемблера на C в программировании микропроцессора. У меня есть сомнения, что это хорошая идея. Каковы некоторые преимущества и недостатки C по сравнению со сборкой?

Преимущества / недостатки, которые я вижу:

Преимущества:

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

Недостатки:

  • Ассемблер является языком программирования более низкого уровня, чем С, поэтому он подходит для программирования непосредственно на аппаратном уровне.
  • Гораздо более гибко намекает на работу с памятью, прерываниями, микрорегистрами и т. Д.

17
Хм ... добро пожаловать в новый век. Тебе здесь понравится. У нас есть микроконтроллеры, работающие на .NET , Java , Linux и даже люди, использующие python для программирования PIC .
ZJR

@ZJR Как вы используете Python для программирования PIC? Какое изображение?
детально

2
@detly Это не полноценный питон, а лишь часть ядра. Слой синтаксиса Python над функциональностью контроллера , если хотите. Pyastra - это первый пример, который я нашел в Google, но я помню, что читал документы другого типа, которые также использовали ATMEL.
ZJR

4
Честно говоря, учитывая сложность современных процессоров, я был бы удивлен, если бы многие программисты могли написать более жесткий и эффективный ассемблер, чем современный компилятор Си. Я не хотел бы пытаться программировать процессор архитектуры EPIC на ассемблере - например, Мел был бы дома с Itanium . * 8 ')
Марк Бут

5
@ZJR Этот новый век звучит захватывающе! Мне любопытно, на каком языке были написаны среда выполнения .NET, Java VM и Linux для этих микроконтроллеров? Как, на каком языке было фактически программирование микроконтроллера? Ох ... С или ассемблер этого века тоже ...

Ответы:


17

Вот некоторые ответы о переполнении стека, которые могут вам помочь (это самые популярные ответы, принятые ответы):

преимущества

/programming/143561/is-there-a-need-to-use-assembly-these-days (только для пользователей 10K) или Архив

  • Сборка используется на самых ранних этапах загрузчика. Когда процессор загружается в стек, он недоступен, и компилятор C не может попытаться сохранить его в стеке. Основная часть загрузчика, тем не менее, написана на C, как только будет выполнена самая ранняя инициализация.
  • Сборка используется для записи мьютекс-блокирующих примитивов. По сути невозможно заставить компилятор C выдавать инструкции барьера памяти в нужных местах.
  • Подпрограммы, такие как memset () или memcpy (), часто выполняются в сборке. Например, я написал memset () с большим развернутым циклом, который динамически вычисляет адрес ветви, чтобы перейти в середину этого цикла за одну последнюю итерацию. Подпрограмма AC генерировала бы больше кода, принимая дополнительные пропуски. Аналогично, наборы команд процессора часто включают в себя загрузку строки кэша или другие инструкции, которые могут значительно ускорить memcpy (), который компилятор C не будет использовать.

Недостатки

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

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

пример

Последнее сообщение ниже - это сообщение о переполнении стека, в котором описан сценарий, в котором будет показан пример сборки, более быстрый, чем C (при выполнении той же функции).

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


20
  • С легче программировать, по сравнению со сборкой. Есть очевидные причины, которые не стоит перефразировать.

  • Благодаря простоте использования, C позволяет писать программы быстрее. Как правило, эти программы также легче отлаживать и поддерживать. Кроме того, в Си проще управлять большими и сложными программами.

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

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

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

  • Вы можете написать Assembly в C-коде, но не C в Assembly-коде.


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

@crucified - это было обычное (и обычно оправданное) требование в середине-конце 90-х годов. Компилятор применяет оптимизацию надежно и систематически, а не только тогда, когда он замечает эту возможность.
Steve314

15

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


4

мы перешли с ассемблера на C в программировании микропроцессора. У меня есть сомнения, что это хорошая идея

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

Я могу сказать, что синтаксис C намного легче выучить, чем синтаксис Ассемблера.

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

C легче использовать для создания более сложных программ.

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

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

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

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

И есть много аспектов "продуктивного". Очень важным аспектом является время обслуживания, и особенно время, необходимое для устранения ошибок, вызванных техническим обслуживанием. С гораздо проще поддерживать, чем ассемблер.

Ассемблер является языком программирования более низкого уровня, чем С, поэтому он подходит для программирования непосредственно на аппаратном уровне.

Аппаратное программирование может быть выполнено непосредственно на любом языке. Единственное, что вы не можете сделать в C - это получить доступ к указателям стека, регистрам условий и т. Д. Самого ядра ЦП. Так что, если под аппаратным программированием вы имеете в виду общение с вашим собственным процессором, тогда да, ассемблер позволяет немного больше, чем C. Если вы имеете в виду доступ к внешнему оборудованию, то ассемблер не дает никаких преимуществ по сравнению с C. Но, возможно, это и недостатки, так как зачастую труднее писать универсальный ассемблерный код для конкретного внешнего устройства, чем универсальный C-код.

Гораздо более гибко намекает на работу с памятью, прерываниями, микрорегистрами и т. Д.

Это не правильно. C также позволяет вам делать все это, хотя вам, возможно, придется полагаться на специфичный для компилятора C-код, такой как ключевое слово interrupt.


В конце вам нужно знать оба языка для программирования MCU, с акцентом на C.


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

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

1
@Lundin: Что важно в C, так это то, что вы можете задать все эти вопросы и найти конкретные ответы. Компиляторы, соответствующие стандарту, обязаны документировать, как они ведут себя для 62 (не «сотен») определенных реализацией поведений. Сама простота ассемблера делает его предложением «принеси себе обед», что, в свою очередь, снимает сложность, с которой С сталкивается в вашем собственном коде. Я мог бы противостоять вашему аргументу, спросив, сколько библиотек с плавающей точкой было написано на ассемблере для любой конкретной архитектуры и почему их поведение определяется реализацией.
Blrfl

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

1
@Lundin: Моя машина отличная, спасибо. Рулевое колесо, акселератор, тормоз, сцепление и рычаг поворота находятся в стандартных местах, имеют стандартное поведение, а все остальные элементы управления четко обозначены символами стандарта ISO. Все вещи, определенные реализацией, такие как развлекательная система, система отопления, вентиляции и кондиционирования, навигация, круиз-контроль и т. Д., Документированы в толстой книге в бардачке. Сборка похожа на мой Плимут 1973 года: в этом не было ничего особенного, но в необработанном виде он был далеко не так хорош, как то, что я сейчас веду. Сборка такая же; сложность заключается в том, что вы добавляете к этому.
Blrfl

1

В зависимости от того, как вам нужно встраиваться, 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, где вы можете это обосновать.


Эти аргументы звучат для меня старомодно. Если вы используете современный компилятор, который был написан за последние 10 лет, то, я полагаю, вам будет нелегко написать программу на ассемблере, которая значительно более эффективна, чем программа на Си. Если, возможно, вы не используете 30-летнюю архитектуру динозавров, такую ​​как PIC или 8051, тогда у вас будет медленная программа, независимо от того, что вы делаете ...

Исправить медленную сборку, генерируемую самыми современными gcc и llvm, довольно просто. 4.x gcc создает более медленный и менее эффективный код, чем серия 3.x (для некоторых целей, по крайней мере для тех, которые я оценивал, например для ARM). Я думаю, что важно развеять идею, что компилятор работает лучше, чем люди, потому что это не так. И даже когда он это делает, он делает это только тогда, когда человек знает, что он делает. «знать свои инструменты», если вы хотите использовать их эффективно. Начните с C и используйте ASM при необходимости, если вы можете это оправдать ...
old_timer

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

gcc многоцелевой, так что он в среднем неплохо справляется, но не подходит для какой-то конкретной цели. И это то, что ожидается. но ваша точка зрения о современном компиляторе, последние 10 лет и т. д. Просто не имеет места, компиляторы не улучшаются по мере того, как создаваемый код, они улучшаются в отношении языков, целей и функций за счет стоимости создаваемого кода. Представление о том, что любой современный компилятор делает лучший код из возможных, просто неверно. Совершенно верно, что в среднем НАМНОГО лучше, чем ассемблер с ручным кодированием, трудно сделать любой достойный проект в asm лучше, чем C
old_timer

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

1

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

Для C компромисс не совсем исчез, но он гораздо менее заметен - вы можете написать легко читаемый / поддерживаемый C, который достаточно хорошо оптимизирован.

Отличный программист на ассемблере будет способен побеждать компилятор почти все время, но большую часть времени он намеренно выберет для написания легко читаемый / поддерживаемый код; и поэтому превосходный программист на ассемблере будет побежден компилятором большую часть времени.

Умный способ - использовать как ассемблер, так и C (вместо только ассемблера или только C) - например, использовать C для частей кода, где отличный программист на ассемблере выбрал бы для написания обслуживаемый / медленный код, и использовать ассемблер для остаток (где «высоко оптимизированный и сложный в обслуживании» фактически оправдан).


-3
  1. Относительно хорош для эффективности программирования.
  2. Легко программировать на языке c, а не на ассемблере.
  3. Язык C может быть намного быстрее, чем язык ассемблера.
  4. Можно писать ассемблер в коде C, но не C в коде ассемблера.

3
только преимущества ....
Киран Сапкале

3
Это в основном перефразированная версия « Каковы некоторые преимущества / недостатки использования C перед сборкой?». ; Вы не добавили ничего нового в обсуждение здесь.
Мартейн Питерс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.