web-dev-qa-db-fra.com

Quels sont les avantages / inconvénients de l'utilisation de C par rapport à l'assemblage?

J'étudie actuellement l'ingénierie dans les télécommunications et l'électronique et nous avons migré de l'assembleur vers le C dans la programmation de microprocesseurs. Je doute que ce soit une bonne idée. Quels sont les avantages et les inconvénients du C par rapport à l'assemblage?

Les avantages/inconvénients que je vois sont:

Avantages:

  • Je peux dire que la syntaxe C est beaucoup plus facile à apprendre que la syntaxe Assembler.
  • C est plus facile à utiliser pour créer des programmes plus complexes.
  • L'apprentissage de C est en quelque sorte plus productif que l'apprentissage de l'assembleur car il y a plus de choses à développer autour de C que l'assembleur.

Inconvénients:

  • L'assembleur est un langage de programmation de niveau inférieur à C, ce qui en fait un bon outil pour programmer directement sur le matériel.
  • Est beaucoup plus flexible pour vous faire travailler avec de la mémoire, des interruptions, des micro-registres, etc.
16

Voici quelques réponses de débordement de pile qui peuvent vous aider (ce sont les meilleures réponses, les réponses acceptées):

Avantages

https://stackoverflow.com/questions/143561/is-there-a-need-to-use-Assembly-these-days (pour les utilisateurs 10K uniquement), ou Archive

  • L'assemblage est utilisé dans les premières étapes du chargeur de démarrage. Lorsque le processeur alimente la pile n'est pas disponible, et il est difficile d'empêcher le compilateur C d'essayer d'enregistrer des choses dans la pile. La majeure partie du chargeur de démarrage est néanmoins écrite en C, une fois la première initialisation effectuée.
  • L'assemblage est utilisé pour écrire des primitives de verrouillage mutex. Il est essentiellement impossible d'obtenir un compilateur C pour émettre des instructions de barrière de mémoire aux endroits requis.
  • Les routines comme memset () ou memcpy () sont souvent effectuées dans Assembly. Par exemple, j'ai écrit un memset () avec une grande boucle déroulée, qui calcule dynamiquement une adresse de branche pour sauter au milieu de cette boucle pour une dernière itération. Une routine C aurait généré plus de code, prenant des I $ manquants supplémentaires. De même, les jeux d'instructions CPU incluent souvent le chargement de la ligne de cache ou d'autres instructions qui peuvent accélérer considérablement memcpy (), que le compilateur C n'utilisera pas.

Inconvénients

https://stackoverflow.com/questions/2684364/why-arent-programs-written-in-Assembly-more-often

  • ASM a une faible lisibilité et n'est pas vraiment maintenable par rapport aux langages de niveau supérieur.
  • En outre, il y a beaucoup moins de développeurs ASM que pour d'autres langages plus populaires, tels que C.
  • De plus, si vous utilisez un langage de niveau supérieur et que de nouvelles instructions ASM deviennent disponibles (SSE par exemple), il vous suffit de mettre à jour votre compilateur et votre ancien code peut facilement utiliser les nouvelles instructions.

Exemple

Le dernier post ci-dessous est un post Stack Overflow décrivant un scénario qui montrera un exemple d'assemblage plus rapide que C (lors de l'exécution de la même fonction).

https://stackoverflow.com/questions/577554/when-is-assembler-faster-than-c

18
jmq
  • C est plus facile à programmer que l'assemblage. Il y a des raisons évidentes qui ne méritent pas d'être retravaillées.

  • Plus facile à utiliser, C vous permet d'écrire des programmes plus rapidement. Généralement, ces programmes sont également plus faciles à déboguer et plus faciles à maintenir. De plus, il est plus facile de gérer de gros programmes complexes en C.

  • Souvent, le code généré par un compilateur est tout aussi bon (en termes de vitesse et d'efficacité) qu'un assembleur écrit à la main - sinon mieux.

  • C est sacrément bas niveau, et il est rare que vous souhaitiez aller beaucoup plus bas. Avoir une couche d'abstraction supplémentaire est rarement une mauvaise chose.

  • Lorsque vous devez descendre plus bas, vous pouvez utiliser Assembly, sinon vous pouvez utiliser C.

  • Vous pouvez écrire Assembly en C-code, mais pas C en Assembly-code.

21
BBB

Un programme C peut être compilé pour différentes architectures de microprocesseur.

15
cgull

nous avons migré de l'assembleur vers C dans la programmation des microprocesseurs. J'ai des doutes que c'est une bonne idée

N'ayez crainte, personne ne développe plus de nouveaux programmes en 100% assembleur. De nos jours, C peut être utilisé même pour les architectures 8 bits les plus minuscules et les plus folles. Cependant, connaître un assembleur fait de vous un programmeur C bien meilleur. En outre, il y a toujours quelques petits détails ou deux dans un programme qui doivent être écrits en assembleur.

Je peux dire que la syntaxe C est beaucoup plus facile à apprendre que la syntaxe Assembler.

Oui, la syntaxe est plus facile, certainement. Cependant, l'apprentissage de tout le langage C avec tous les détails ennuyeux est beaucoup plus complexe que l'apprentissage de tous les détails d'un assembleur particulier. C est un langage beaucoup plus grand et plus large. Mais là encore, vous n'aurez peut-être pas besoin d'apprendre tous les détails.

C est plus facile à utiliser pour créer des programmes plus complexes.

En effet, C fournit des mécanismes pour la conception de programmes modulaires, tels que l'encapsulation et les étendues locales/variables locales. Et C a une bibliothèque standard, ainsi qu'une énorme quantité de ressources écrites au cours des 30 dernières années. Et surtout, C est portable.

L'apprentissage de C est en quelque sorte plus productif que l'apprentissage de l'assembleur car il y a plus de choses à développer autour de C que de l'assembleur.

C possède de nombreuses fonctionnalités, bibliothèques et ressources prédéfinies, il y aura donc moins de réinvention de la roue. Mais à part cela, votre déclaration est subjective. Je crois que c'est une question de préférence personnelle.

Par exemple, je suis un programmeur C expérimenté, programmant occasionnellement du C++. Je me trouve beaucoup moins productif en C++, parce que je ne connais pas ce langage aussi bien que je connais C. Mais juste parce que je ressens cela, cela ne signifie pas nécessairement que la programmation en C est plus productive que la programmation en C++. Un programmeur C++ expérimenté aurait sûrement l'opinion contraire.

Et il y a de nombreux aspects à "productif". Un aspect très important est le temps de maintenance, et en particulier le temps nécessaire pour corriger les bugs induits par la maintenance. C est beaucoup plus facile à entretenir que l'assembleur.

L'assembleur est un langage de programmation de niveau inférieur à C, ce qui en fait un bon outil pour programmer directement sur le matériel.

La programmation matérielle peut être effectuée directement dans les deux langues. Les seules choses que vous ne pouvez pas faire en C sont d'accéder aux pointeurs de pile et aux registres de condition, etc., du cœur du processeur lui-même. Donc, si par programmation matérielle, vous voulez parler avec votre propre CPU, alors oui, l'assembleur autorise un peu plus que C. Si vous voulez accéder à du matériel externe, l'assembleur n'a aucun avantage sur C. Mais peut-être des inconvénients, car il est souvent plus difficile d'écrire code assembleur générique pour un périphérique externe particulier, que le code C générique.

Est beaucoup plus flexible pour vous faire travailler avec de la mémoire, des interruptions, des micro-registres, etc.

Ce n'est pas correct. C vous permet également de faire tout cela, même si vous devrez peut-être vous fier au code C spécifique au compilateur, comme le mot-clé d'interruption.


En fin de compte, vous devez connaître les deux langues pour programmer les MCU, en mettant l'accent sur C.

4
user29079

Selon la façon dont vous devez vous embarquer, C va produire de gros programmes lents. Ce qui augmentera sensiblement le coût de cette partie du produit. Il pourrait s'agir d'une goutte d'eau dans l'océan pour le produit global ou pourrait radicalement changer le produit. Oui, certains pourraient dire que les efforts de développement et de maintenance de logiciels sont moins chers, encore une fois, cela peut être vrai ou faux, si cela est profondément intégré et vise une partie à faible puissance, petite et peu coûteuse, vous ne parlez pas de beaucoup de code. Ce code est principalement spécifique à ce fournisseur ou à cette puce spécifique, donc être en C n'a aucun avantage de portabilité, vous devez de toute façon réécrire avant chaque cible. Avec la série cortex-m de ARM nous commençons tout juste à être en mesure d'avoir C en concurrence avec asm, non pas que les gens n'aient pas utilisé C ou d'autres langages de niveau supérieur dans leurs produits intégrés, mais ils l'ont fait à un prix.

Le débat C vs ASM, professionnellement, se résume toujours à l'écrire en C et à utiliser ASM où vous pouvez le justifier. Et vous pouvez le justifier. Dans le monde intégré, il y a des performances et de la taille.

Vous devez inclure la cible dans cette discussion. Bien que beaucoup aient utilisé C avec Microchip (les anciennes photos, pas le pic32 qui est mips) à un coût énorme, c'est un jeu d'instructions affreux pour les compilateurs, un jeu d'instructions très éducatif et intéressant mais un compilateur peu amical. msp430, avr, bras, pouce, mips, tous bons pour les compilateurs. 8051 aussi mauvais.

Encore plus que la langue des outils. Surtout dans les cas où le souci du développement et de la gestion du code est un argument, vous avez besoin d'outils pour être là aujourd'hui et demain. Avoir un outil source unique, y compris même un seul mod gcc, géré par un groupe, est risqué d'un point de vue commercial. Vous trouverez probablement plus d'un assembleur, et toute personne digne de faire partie de cette équipe pourrait concocter un assembleur en un week-end (tant que l'assemblage que vous écrivez n'est pas une directive ghee whiz et une macro heureuse). Pour asm et C, vous voudriez utiliser des outils open source (ou vos propres outils internes) où vous avez une meilleure chance, même si cela signifie utiliser une machine virtuelle pour exécuter une distribution linux vieille de 10 ans, d'avoir des outils disponibles pour la durée de vie du produit.

En fin de compte, encore une fois, utilisez/apprenez/enseignez le C et l'asm, commencez par C et utilisez asm où vous pouvez le justifier.

1
old_timer

Pour l'assemblage, il existe un compromis inévitable entre la maintenabilité du code et les performances. Vous pouvez écrire Assembly facile à lire/maintenir, ou vous pouvez écrire du code hautement optimisé; mais vous ne pouvez pas faire les deux.

Pour C, le compromis ne disparaît pas tout à fait, mais il est beaucoup moins visible - vous pouvez écrire un C facile à lire/à entretenir qui est raisonnablement bien optimisé.

Un excellent programmeur de langage d'assemblage sera capable de battre le compilateur presque tout le temps, mais la plupart du temps, il choisira délibérément d'écrire du code facile à lire/à maintenir; et donc un excellent programmeur de langage d'assemblage sera battu par un compilateur la plupart du temps.

La manière intelligente consiste à utiliser à la fois Assembly et C (au lieu de seulement Assembly ou seulement C) - par exemple utilisez C pour les parties du code où un excellent programmeur en langage assembleur aurait choisi d'écrire du code maintenable/lent, et utilisez Assembly pour le reste (où "hautement optimisé et difficile à maintenir" est en fait justifié).

1
Brendan