106 votes

Est-il utile d'apprendre le langage assembleur ?

Est-il encore utile d'apprendre ASM ?

Je connais un peu ce langage, mais je ne l'ai pas vraiment utilisé ou appris correctement parce que tout ce que j'ai appris à faire en assembleur, je peux le faire en 1/10ème de temps avec un langage comme le C ou le C++. Alors, dois-je vraiment apprendre et utiliser l'ASM ? Cela m'apportera-t-il quelque chose sur le plan professionnel ? Cela augmentera-t-il mon ingéniosité ? En bref, cela fera-t-il de moi un meilleur programmeur ?

Remarque : je parle ici d'assemblages de bas niveau tels que FASM o NASM et non quelque chose comme HLA (Assembleur de haut niveau).

123voto

spraff Points 10492

J'ai appris de Kip Irvine's livre. Si vous ignorez les critiques (justes) de ses bibliothèques (non pertinentes), je peux le recommander comme une bonne introduction au langage lui-même -- bien que pour le realmente Il est intéressant de savoir que les obsessionnels sont à l'affût sur le net.

Je pense qu'il est utile de comprendre ce qui se passe aux niveaux inférieurs. En faisant des recherches sur l'assembleur, vous apprendrez ce qu'est le pipelining des processeurs, la prédiction des branchements, l'alignement des caches, le SIMD, le réordonnancement des instructions, etc. La connaissance de ces éléments vous aidera à écrire un meilleur code de haut niveau.

En outre, la sagesse conventionnelle est de ne pas essayer d'optimiser manuellement l'assemblage la plupart du temps, mais de laisser le compilateur s'en occuper. Lorsque vous verrez des exemples de choses tordues générées par les compilateurs, vous comprendrez mieux pourquoi cette sagesse conventionnelle est valable.

Exemple : Les LFSR fonctionnent rapidement avec l'instruction "rotate-with-carry". Pour des cas spécifiques comme celui-ci, il est tout aussi facile d'écrire la version assembleur que de découvrir si le compilateur est assez intelligent pour le comprendre. Parfois vous savez quelque chose que le compilateur n'a pas.

Il vous permet également de mieux comprendre les problèmes de sécurité - écriture ou exécution, dépassement de pile, etc.

Certains concurrence ne deviennent apparents que lorsque l'on est conscient de ce qui se passe au niveau de chaque instruction.

Cela peut parfois être utile lors du débogage si vous n'avez pas le code source complet.

Il y a la valeur de curiosité. Comment les fonctions virtuelles sont-elles mises en œuvre ? Avez-vous déjà essayé d'écrire des programmes DirectX ou COM en assembleur ? Comment les grandes structures sont-elles renvoyées ? La fonction appelante offre-t-elle un espace pour elles ou vice-versa ?

Il existe également des langages d'assemblage spéciaux pour le matériel graphique, bien que les langages de shaders soient devenus de haut niveau il y a quelques années, mais tout ce qui vous permet d'envisager un problème d'une manière différente est bon.

60voto

Je trouve intéressant que tant de personnes s'empressent de dire que oui, il faut/doit apprendre l'assemblage. Pour moi, la question est combien d'assemblages devez-vous connaître ? Je ne pense pas qu'il faille connaître l'assembleur comme un langage de programmation, c'est-à-dire que je ne crois pas que tout le monde doive être capable d'écrire un programme en assembleur, mais d'un autre côté, il suffit d'être capable de le lire et de comprendre ce qu'il signifie réellement (ce qui peut nécessiter davantage de connaissances sur l'architecture que sur l'assembleur).

Je ne peux certainement pas écrire (c'est-à-dire écrire n'importe quel morceau de code non trivial en assembleur), mais je peux le lire et cela, combiné à la connaissance de l'architecture matérielle réelle et des conventions d'appel utilisées, est suffisant pour analyser les performances et identifier le morceau de code C++ qui est à l'origine de cet assembleur.

31voto

sharptooth Points 93379

Oui, la principale raison d'apprendre l'assembleur pour les développeurs C et C++ est qu'il permet de comprendre ce qui se passe sous le capot du code C et C++. Il ne s'agit pas d'écrire du code en assembleur, mais de pouvoir regarder le désassemblage du code. d'évaluer son efficacité et vous comprendrez beaucoup mieux le fonctionnement des différentes fonctionnalités du C et du C++.

26voto

David Hammen Points 17912

Il vaut la peine d'apprendre de nombreux langages différents, à partir de nombreux paradigmes différents. Apprendre Java, C++, C# et Python ne compte pas, puisque ce sont tous des exemples du même paradigme.

L'assembleur étant à la racine (enfin, proche de la racine) de tous les langages, j'estime pour ma part qu'il vaut la peine d'apprendre l'assembleur.

Par ailleurs, il vaut la peine d'apprendre un langage de programmation fonctionnel, la programmation logique, les langages de script, les langages basés sur les mathématiques. Le temps est compté, il faut donc choisir.

4voto

ain Points 12953

Connaître ASM est également utile lors du débogage, car parfois tout ce que vous avez, c'est un "dump ASM de l'erreur".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X