Est-ce que ça vaut encore la peine d’apprendre l’ ASM ?
J’en connais un peu, mais je ne l’ai pas vraiment utilisé ou appris correctement car tout ce que j’apprends à faire en assembleur, je peux le faire au 1 / 10ème avec un langage comme le C ou le C ++. Alors, devrais-je vraiment apprendre et utiliser ASM? Est-ce que ça me rendra professionnel? Cela va-t-il augmenter mon ingéniosité? En bref, cela ferait-il de moi un meilleur programmeur?
Note: Je parle d’un assemblage de bas niveau comme FASM ou NASM et non pas d’un outil comme HLA (High-Level Assembler).
J’ai appris du livre de Kip Irvine . Si vous ignorez les critiques (équitables) de ses bibliothèques (non pertinentes), je peux le recommander comme une bonne introduction à la langue elle-même – bien que pour les choses vraiment intéressantes, vous devez rechercher les obsédés 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 en apprendrez davantage sur le pipeline de processeurs, la prédiction de twig, l’alignement de cache, le SIMD, le réordonnancement des instructions, etc. La connaissance de ceux-ci 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 préoccuper. Lorsque vous verrez des exemples de choses tordues générées par les compilateurs, vous comprendrez mieux pourquoi la sagesse conventionnelle est valable.
Exemple: les LFSR s’exécutent rapidement avec l’instruction rotate-with-carry, pour des cas spécifiques comme celui-ci, il est tout aussi facile d’écrire la version de l’assembleur que de découvrir si le compilateur est suffisamment intelligent pour le comprendre. Parfois, vous savez juste quelque chose que le compilateur n’a pas.
Cela augmente également votre compréhension des problèmes de sécurité – écriture-exécution, dépassements de stack, etc.
Certains problèmes de concurrence ne deviennent apparents que lorsque vous êtes au courant de ce qui se passe au niveau des instructions.
Cela peut parfois être utile lors du débogage si vous ne disposez pas du code source complet.
Il y a la valeur de la curiosité. Comment les fonctions virtuelles sont-elles implémentées de toute façon? 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 leur offre-t-elle un espace ou inversement?
Ensuite, il existe des langages d’assemblage spéciaux pour le matériel graphique, bien que les langages shader aient atteint un niveau élevé il y a quelques années, tout ce qui permet de penser à un problème d’une autre manière est une bonne chose.
Je trouve intéressant que tant de gens sautent pour dire que oui, vous avez besoin / devrait apprendre le assembly. Pour moi, la question est de savoir combien d’assemblage avez-vous besoin de savoir? Je ne pense pas que vous ayez à connaître l’assemblage comme un langage de programmation, c’est-à-dire que tout le monde ne devrait pas être capable d’écrire un programme en assembleur, mais de le lire et de comprendre ce qu’il en est réellement. des moyens (qui pourraient nécessiter plus de connaissance de l’architecture que l’assembleur) suffisent.
Je ne peux certainement pas écrire l’ assemblage (c’est-à-dire écrire un morceau de code non sortingvial dans l’assemblage), mais je peux le lire et connaître la structure matérielle réelle et les conventions d’appel utilisées pour parsingr les performances. identifiez quel morceau de code C ++ était la source de cet assemblage.
Oui, la principale raison d’apprendre l’assemblage pour les développeurs C et C ++ est qu’il aide à comprendre ce qui se passe sous le capot du code C et C ++. Ce n’est pas que vous allez réellement écrire du code dans l’assemblage, mais vous pourrez examiner le déassembly du code pour évaluer son efficacité et vous comprendrez comment les différentes fonctionnalités de C et C ++ fonctionnent bien mieux.
Cela vaut la peine d’apprendre beaucoup de langues différentes, à partir de nombreux paradigmes différents. Apprendre Java, C ++, C # et Python ne compte pas, car ils sont tous des instances du même paradigme.
Comme l’assemblage est à la racine (enfin, proche de la racine) de toutes les langues, je dis pour ma part qu’il vaut la peine d’apprendre l’assemblage.
Là encore, il est intéressant d’apprendre un langage de programmation fonctionnel, la programmation logique, les langages de script, les langages basés sur les mathématiques. Vous n’avez que peu de temps, vous devez donc choisir.
Connaissant ASM est également utile lors du débogage, comme parfois tout ce que vous avez est “vidage ASM de l’erreur”.
En avez-vous besoin dans ce que vous comptez faire? Cela vous aidera-t-il d’une manière ou d’une autre dans ce que vous faites ou comptez faire? Ce sont les deux questions que vous devriez vous poser, la réponse à cette question est la réponse à votre question.
Dans un sens plus général, oui, à mon avis, je pense que ça vaut la peine d’apprendre asm (quelque chose comme x86 ou arm), cela dépend de votre programmation et de la façon dont vous la déboguez.
Dépend de quel niveau de programmation que vous souhaitez atteindre. Si vous avez besoin de travailler avec les débogueurs, alors OUI. Si vous avez besoin de savoir comment fonctionnent les compilateurs, alors OUI. Tout assembleur / débogueur est dépendant de la CPU, il y a donc beaucoup de travail, vérifiez simplement la taille de la famille x86.