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.
Désavantages:
- 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.
Réponses:
Voici quelques réponses de débordement de pile qui peuvent vous aider (ce sont les meilleures réponses, les réponses acceptées):
Les avantages
/programming/143561/is-there-a-need-to-use-assembly-these-days (pour les utilisateurs 10K uniquement) ou Archive
Désavantages
/programming/2684364/why-arent-programs-written-in-assembly-more-often
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).
/programming/577554/when-is-assembler-faster-than-c
la source
C est plus facile à programmer que l'assemblage. Il y a des raisons évidentes qui ne méritent pas d'être reprises.
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.
la source
Le programme AC peut être compilé en différentes architectures de microprocesseur.
la source
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.
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.
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.
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.
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 dire accéder au matériel externe, alors 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.
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.
la source
a = b[i] + c;
est beaucoup moins compliqué que les instructions à chargerb[i]
(qui nécessitent des calculs) etc
dans des registres (qui doivent être rendus disponibles), à ajouter et à stocker.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 peut s'agir d'une goutte d'eau dans l'océan pour l'ensemble du produit ou peut 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 d'ARM, nous commençons à peine à pouvoir concurrencer C avec asm, pas que les gens n'utilisent pas C ou d'autres langages de niveau supérieur dans leurs produits intégrés,
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 C et asm, commencez par C et utilisez asm où vous pouvez le justifier.
la source
Pour l'assemblage, il existe un compromis inévitable entre la maintenabilité du code et les performances. Vous pouvez écrire un assemblage facile à lire / à entretenir, 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 en langage assembleur 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 en langage assembleur sera battu par un compilateur la plupart du temps.
La façon intelligente consiste à utiliser à la fois l'assembly et le C (au lieu de l'assembly ou du C uniquement) - par exemple, utilisez C pour les parties du code où un excellent programmeur de langage d'assemblage aurait choisi d'écrire du code maintenable / lent, et utilisez l'assembly pour le reste (où "hautement optimisé et difficile à maintenir" est en fait justifié).
la source
la source