Je suppose qu'on est d'accord pour dire qu'un programmeur doit connaitre un minimum de détails de bas niveau comme la hiérarchie mémoire ou a représentation des données. Comment apprendre ça mieux que par la pratique ? En programmant en assembleur on peut réellement se rendre compte de comment sont organisées les données, ce qui se passe quand on appelle une fonction etc.
Quand je vois le nombre de personnes qui se demandent si il vaut mieux utiliser un switch ou des if/else en cascade, ce qui change quand on passe en 64 bits, si la récursivité est plus lente que l'itératif etc., je n'ai pas l'impression que connaitre l'ASM est inutile pour le programmeur moyen.
+1
J'ajoute qu'il y a deux grandes tendances en programmation.
Ceux qui l'approchent comme des « horlogers », avec une grande notion du coût en ressources, de l'aspect « mécanique » si j'ose dire, et ceux qui l'abordent en mathématicien, pour qui la machine n'est finalement que l'étape terminale, que le temps d'exécution d'un algo même mauvais est virtuellement nul et que le reste dépend de la bécane (ceux-là méprisent généralement les programmeurs).
Le problème, c'est que les machines d'aujourd'hui sont tellement puissantes que la différence de coût entre deux approches n'est pas humainement perceptible. On croit donc pouvoir tout faire et on se retrouve bloqué quand le logiciel est inutilisable parce que trop lent ou trop lourd.
Ça vaudrait le coup de refaire des séances d'optimisation extrêmes, comme du temps des démos sur des machines < 100 Mhz. Pas seulement pour la beauté de la discipline mais également pour resituer les limites physiques que l'on risque de rencontrer.
À titre indicatif, 3 Ghz, ça correspond à 10cm-lumière ! À 30Ghz, par exemple, on ne parle même plus de temps de commutation ou autre phénomène électroniques : un front montant n'aurait tout simplement plus le temps de traverser la puce de part en part !
Pas vraiment d'accord avec ca:
L'assembleur c'est utile
* utile si vous débuggez du code sans sources
* utile si vous codez des drivers
* indispensable si vous devez manipuler les registres (ex. passage dynamique d'arguments a une fonction ... quand va_list n'est pas suffisant dans le cas du C)
Et oui on peut optimiser du code objet même du GCC -O3 !!! (le plus dur étant de bien localiser la ressource critique dans le code)
Pour nombre de professionnels du développement embarqué, les trois compétences a maitriser sont C, assembleur et électronique (sans parler des compétences connexes: gestion de config., normes, ... bref les spécificités métier)
Je me permet de répondre ici car le sujet original de Suliman correspond justement à un questionnement qui m'a amené à mettre en place, avec l'aide d'autres personnes, un Forum sur le développement en langage assembleur.
Pour les uns l'asm doit servir -et servira uniquement - dans le cadre d'optimisations de procédures spécifiques, ce en quoi ils auront tout à fait raison car cela correspond à leurs besoins. Il est clair aussi que dans le cadre d'un travail de programmeur professionnel je vois peu de raisons pour coder des projets consistants en assembleur. Mais cela ne veut pas dire que le faire en assembleur serait beaucoup plus long.
Le langage assembleur a également évolué avec l'aide de contributeurs doués qui ont permis de simplifier le travail si l'on souhaite tout faire en asm. Des macros évoluées, des fonctions de haut niveau, tout comme des librairies de qualité sont mises à disposition des développeurs en assembleur pour faciliter leur travail, mais peu de gens en ont conscience, parce que le plus souvent quand on parle d'asm cela concerne des procédures en codage pur. Or l'assembleur ne s'arrête pas à cela, il est possible de se servir de fonctions de haut niveau puis optimiser le code en asm pur en fonction des besoins. C'est pourquoi j'ai mis en place un Forum qui, je l'espère, permettra d'aider des personnes motivées à réaliser des projets consistants en assembleur s'ils souhaitent s'amuser (le mot est lâché) dans ce langage.
Meilleures Salutations à Tous,
Faiseur
Partager