Est-il sage pour un développeur de haut niveau de passer du temps à étudier l'assemblage? [fermé]


33

Il est clair que la connaissance des éléments de bas niveau est très importante dans notre travail.

Mais dans une situation où vous développez déjà un logiciel commercial à un niveau élevé, et lorsque vous avez déjà une direction choisie mais que vous n’avez aucune compétence en assemblage, n’est-il pas plus raisonnable de se concentrer sur l’étude de choses liées à votre direction? Ou y a-t-il une raison pour que vous passiez du temps à apprendre les bases de bas niveau de toute façon?

Quand est-il trop tard et quand ce n'est pas le cas? Et s’il n’est pas trop tard, comment l’apprendre de manière optimale (en ne dépensant pas trop de temps pour approfondir et comprendre)?


Beaucoup de questions dans un post :)
Shamim Hafiz

J'ai apprécié Assembly Language, étape par étape. Beaucoup de programmes noobie-ish sont programmés au début, mais l'auteur est très amusant. J'ai trouvé utile d'avoir une idée générale et j'écris principalement en JavaScript.
Erik Reppen

Ma première langue (enseignée) était un dialecte de l'Assemblée. Je peux voir à quel point cela serait utile (dans la multitude de façons que d'autres ont signalées), et cela vous aide à apporter une contribution différente au reste de l'équipe.
Jamie Taylor

Réponses:


43

Je ne peux pas croire que personne n'a mentionné le débogage ...

Je n'ai pas écrit de code d'assemblage depuis plusieurs années. Mais je le lis assez souvent. Le débogage de haut niveau est intéressant lorsque vous avez les informations de source et de symbole, mais lorsque votre bibliothèque sophistiquée lève une exception non gérée sur les ordinateurs clients, il est trop tard pour exiger son inclusion dans la licence ...

Mais je peux toujours ouvrir le désassembleur et voir ce que votre logique de haut niveau a fini par faire , retracer l'origine des données erronées, trouver qui a modifié le registre de contrôle FPU ...

Cela a sauvé mon bacon plus souvent que je ne pense à y penser. Et il n’est jamais trop tard pour apprendre. Il existe de nombreuses références et didacticiels de qualité sur le Net, et pratiquement tous les programmes exécutés sur votre ordinateur peuvent fournir un environnement pratique.


10
+1, et je voterais plus si je le pouvais. Tout développeur sérieux doit être capable de lire ASM pour cela si aucune autre raison.
Mason Wheeler

3
Le corollaire à cela est l'optimisation. Savoir comment le compliant traduit votre code en assemblage peut vous aider à le rendre beaucoup plus rapide!
lambacck

3
+1 Assembly est l'une des seules langues qui vous oblige à comprendre le fonctionnement réel d'un processeur. Il vous aide dans votre développement avec un langage de haut niveau. Doit lire: blogs.msdn.com/b/ericlippert/archive/2010/09/30/…

Connaître l'ordinateur sous-jacent est extrêmement utile, que ce soit pour le débogage, l'optimisation ou la pure curiosité. Sérieusement, apprendre à lire au moins une ou deux familles de langage d'assemblage. Même si vous ne le lisez jamais ou ne l'écrivez pas après l'avoir appris, cela affectera votre façon de comprendre les choses à l'avenir. Maintenant, si vous préférez écrire dans aucune autre langue, cela pourrait être un peu trop ...
Michael Trausch

1
@Mason: Je ne sais pas si "chaque développeur sérieux" doit pouvoir lire ASM. Si vous écrivez du JavaScript ou utilisez un langage de programmation construit sur un framework épais (comme .NET ou Java), je ne considérerais pas que pouvoir lire ASM soit essentiel pour être un développeur sérieux. Cela étant dit, il peut être très utile de comprendre comment l’ordinateur exécute des instructions à un niveau très bas, même dans des langages et des environnements de programmation de niveau supérieur.
Scott Mitchell

15

Vous n'avez pas besoin d'apprendre le langage d'assemblage, il vous suffit de comprendre comment cela fonctionne. Vous devez savoir ce qu'est XOR et compter en binaire dans votre sommeil, etc. Mais je n'ai jamais eu besoin de code d'assemblage dans mon travail, jamais.

Ainsi, comme vous le dites, la connaissance des éléments de bas niveau est importante, mais les connaissances pratiques en matière d'assemblage ne le sont pas.


1
Je seconde. Vous pouvez bien gagner votre vie en programmant sans jamais avoir à lire / écrire en ASM. Certains postes l’exigent. La lecture d'un dump après une condition de concurrence critique dans votre code a mis le processus en place. Ou si vous écrivez des programmes très intensifs (comme la parallélisation GPU / OpenCL). Le pourcentage de travaux de développement pour lesquels vous devrez exécuter ces tâches est très faible.
Yzorg

11

Si vous n’avez vraiment aucune compétence en programmation de bas niveau, je vous recommande fortement d’en apprendre quelques-unes pendant votre temps libre. Vous n'avez pas besoin de devenir un expert en la matière. juste atteindre un certain niveau de compétence. Vous devez faire beaucoup de travail mathématique vous-même, plutôt que de dépendre du compilateur ou des bibliothèques pour le faire à votre place. Cela vous aidera à comprendre la lisibilité en programmation, car la plupart des instructions d'assemblage correspondent à une instruction de processeur. Vous devez gérer vous-même la complexité de programmes légèrement plus grands, sans bénéficier d'avantages tels que if...else. Cela vous aidera à écrire des programmes de haut niveau plus simples, car l’expérience de l’assemblage vous aurait appris à quel point il est facile de lire.

De plus, rappelez-vous que le montage n'est pas une langue! Il s’agit d’un terme générique, qui désigne le jeu d’instructions d’un processeur qui a été résumé à un langage symbolique. Différents processeurs ont différents jeux d'instructions, et donc différents langages d'assemblage. Lorsque vous apprenez «assemblage», vous apprenez un processus et non une langue.


8

Vous aurez toujours intérêt à être sous la couverture et à comprendre un peu mieux ce qui se cache sous l'abstraction sur laquelle vous vous trouvez. Comme un de mes professeurs de collège l’a dit une fois "tous les bons programmeurs comprennent le matériel" - vous ne devez pas être capable de créer et de manipuler des circuits, mais vous devez avoir une idée de ce qui se passe là-bas - cela ne fera que rendre tu ferais mieux.

Essayez l'organisation et la conception de l'ordinateur


1

Oui - L'apprentissage continu tout au long de la vie est une composante essentielle d'une carrière dans le développement de logiciels. Si vous souhaitez continuer à apprendre la programmation et à améliorer votre travail, vous devez apprendre l'assemblage, car il vous exposera à un nouveau langage et à une nouvelle façon d'écrire du code. Pour la même raison, je recommande d'expérimenter avec de nombreux langages / styles de programmation, notamment Ruby / Python (langage dynamique), Haskell / F # (langage fonctionnel pur), Lisp / Scheme (langage fonctionnel), etc.

Je dirais qu'il est trop tard si vous ne souhaitez plus en savoir plus sur le métier de programmeur. Par exemple, si vous avez atteint le point de votre carrière où vous passerez peut-être bientôt de la programmation à un autre domaine, tel que la gestion, l’ingénierie des systèmes, les ventes / marketing, etc. Au cours des prochaines années, je me concentrerais davantage sur les compétences nécessaires pour développer dans ce domaine, plutôt que sur la programmation.


1

Vous devriez savoir ce que c'est et ce que fait l'ordinateur. Apprendre quelque chose comme Knuth MIX vous aidera. Surtout pouvoir juger de l'efficacité de votre code. Allez chercher l’art de la programmation informatique et lisez-le. Cela fera de vous un programmeur plus intelligent.


1

N'est-il pas plus raisonnable de se concentrer sur des sujets liés à votre direction? Ou y a-t-il une raison pour que vous passiez du temps à apprendre les bases du bas niveau de toute façon?

Répondre:

  1. Si vous n’envisagez pas de changer d’orientation pour programmer un système intégré, il n’ya aucune raison de vous en tenir à tout. Même si l’assemblage dépend du processeur, vous en apprendrez peut-être quelques bases, mais votre connaissance reposera sur l’architecture du processeur et le jeu d’instructions correspondant.
  2. Disons que vous codez pour Windows. Si vous souhaitez apprendre un niveau inférieur à un langage de haut niveau pouvant vous être utile, je vous recommande d’apprendre Windows I deep, l’API Windows, la gestion de la mémoire Windows, etc. Il vous suffit d’apprendre le système d’exploitation que vous codez.
  3. Améliorez vos compétences sur votre langage de haut niveau actuel, tel que la gestion de la mémoire, le ramassage des ordures, etc. Si vous souhaitez passer au niveau bas.

0

Je pense que vous atteignez un point de rendement décroissant à mesure que votre carrière avance. C'est-à-dire que vous devriez apprendre le langage d'assemblage tôt, car il permet une meilleure compréhension fondamentale de tout ce qui vient après. Toutefois, si vous êtes déjà sur le marché du travail et que vous avez quelques années d'expérience, vous aurez déjà une idée de la façon dont les choses fonctionnent. Par conséquent, apprendre les détails pratiques ne vous donnera peut-être pas autant d'indications. .


0

Je ne sais pas combien il serait utile d'étudier l'assemblage. Mais au moins, faire de la programmation dans une langue comme C serait bénéfique. J'ai récemment eu à faire de la programmation en C et je l'ai trouvée plutôt éclairante. C supprime une grande partie de l'abstraction présente dans les langages de niveau supérieur. Ces abstractions ne sont pas sans coût. Vous devez gérer davantage de détails de niveau inférieur en C, où ces détails sont gérés pour vous dans un langage de niveau supérieur. En faisant de la programmation en C, vous devrez prendre conscience de ces détails. Ainsi, lorsque vous serez de retour dans votre langue de tous les jours, vous aurez toujours cette conscience et pourrez mieux apprécier ce qui se passe réellement. Cela devrait vous aider à devenir un meilleur programmeur.


0

Dans la profession d’enseignant, du moins ici au Royaume-Uni, les enseignants doivent être beaucoup plus qualifiés que ce qu’ils enseignent. Un enseignant du secondaire devrait avoir un diplôme dans la matière qu’il enseignait, et les enseignants du primaire ont aussi un diplôme et doivent maîtriser toutes les matières principales jusqu’à un bon niveau du GCSE (secondaire). examens de fin d’études? Pas de véritable équivalent à l’échelle américaine).

Pourquoi? Parce que pour bien enseigner ou bien utiliser quelque chose, il faut le comprendre. Cela nécessite de comprendre la structure sous-jacente, la chaîne de décisions avant celle avec laquelle vous travaillez qui l'a menée. Pour bien comprendre le code de haut niveau, vous devez comprendre la couche sur laquelle il est construit, son fonctionnement, ses forces et ses faiblesses. Ceci est récursif, pour comprendre la couche inférieure, vous devez également comprendre la couche inférieure.

En fin de compte, c’est la raison pour laquelle les cours décent en informatique des universités et des collèges exigent avant tout une bonne aptitude en calcul, car c’est là l’essentiel.

Maths -> Physics                ->
      -> Chemistry -> Materials -> Hardware Design -> Microcode      -> Assembler
                                                   -> Bus Interfaces -> Peripherals

... Assembler    -> Low Level      -> High Level   ->
... OS / Drivers -> API Level      -> Applications -> User

Si vous manquez de connaissances dans ces domaines, votre compréhension est alors compromise. Plus le niveau que vous exploitez est proche, plus il est important de le mettre à la terre.

So: Avez-vous besoin de connaître l'assembleur en tant que codeur de haut niveau?  Ça aidera.


0

Cela avait été très important dans ma vie antérieure en tant que gourou des super-ordinateurs. À l’époque, j’avais l’impression que vous ne compreniez pas une machine avant d’avoir écrit au moins plusieurs centaines de lignes d’assembleur, et d’avoir bricolé avec elle pour essayer d’exprimer ses performances. Comme très peu de programmeurs voulaient aller aussi loin, cela me rendait vraiment indispensable. Et je parle toujours un langage commun lorsque je parle avec des types de concepteurs matériels.

Mais, vraiment, le besoin / bénéfice pour ceci est principalement vieux de deux décennies. Entre les avancées du compilateur et l'exécution avancée dans le désordre HW, il est très difficile de pouvoir jouer le héros en écrivant assembleur. Bien que je pense utile de comprendre comment les choses fonctionnent. Je prévois d’enseigner à mes enfants (étudiants de première année de classe majeure) à programmer dans un assembleur très simplifié sur une simple machine virtuelle, afin qu’ils aient une idée de ce qui se passe. Espérons que nous pourrons jouer avec des tâches telles que le déroulement, le traitement en pipeline de logiciels, les caches, la pré-extraction, le chargement par le bas, etc. Ainsi, au moins, ils sauront qu’à un certain niveau, ces tâches sont en cours.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.