Il est dit, par Mike P. Wittie, dans le curriculum du cours de l'architecture informatique que,
Les étudiants doivent comprendre l'architecture informatique pour structurer un programme afin qu'il s'exécute plus efficacement sur une vraie machine
Je demande aux programmeurs ou professionnels plus expérimentés qui ont une formation dans ce sujet:
Comment l'apprentissage de l'architecture informatique vous aide-t-il? Quel aspect vous profite le plus? Comment l'apprentissage de l'architecture informatique a-t-il changé votre structure de programmation?
Comment la compréhension de la physique aide-t-elle les gens à conduire une voiture?
Etc. Vous pouvez conduire une voiture sans en savoir beaucoup sur la physique, mais la compréhension de la physique fait de vous un meilleur conducteur.
Deux exemples de la façon dont la compréhension de l'architecture informatique peut affecter la façon dont vous codez:
C'est essentiellement la même raison que pour comprendre le C et les pointeurs ou peut-être même les algorithmes; la seule différence est que si vous connaissez l'architecture informatique, vous comprenez vraiment les pointeurs (en fait, les pointeurs semblent très triviaux après avoir connu l'architecture informatique).
Je ne peux pas dire de moi que je suis un programmeur expérimenté mais un (en fait le) livre sur l'architecture informatique que j'ai lu était pour moi le livre le plus intéressant que j'ai lu, concernant les ordinateurs et la programmation. En comprenant l'architecture informatique, vous comprenez essentiellement comment tout est lié entre eux, comment un ordinateur fonctionne et comment un programme fonctionne vraiment; vous voyez la grande image. Sans architecture informatique, vous ne pouvez pas vraiment comprendre:
De mon point de vue vraiment subjectif, c'est de loin plus intéressant et peut-être même plus utile que de connaître des algorithmes.
Dans le monde d'aujourd'hui, ce raisonnement est négligeable s'il est présent dans la plupart des situations de programmation.
Les endroits où cela s'applique sont quand on écrit Assembly pour un processeur particulier, travaillant sur une situation qui nécessite de tirer parti d'une architecture particulière, ou limitée de manière significative par l'architecture (systèmes embarqués) afin que les deux points précédents deviennent tous le plus important.
Pour les programmeurs de langages interprétés (Perl, python, Ruby) ou de langages qui s'exécutent dans leur propre machine virtuelle (Java, C #), la machine sous-jacente est complètement abstraite. Un programme Java ne serait pas codé différemment pour s'exécuter sur un cluster massif ou sur son bureau.
Les cas où l'architecture fait une différence, comme mentionné, sont des systèmes embarqués où il est nécessaire de prendre en compte les préoccupations de très bas niveau qui concernent cet environnement. L'autre extrême existe également - où l'on écrit du code haute performance dans Assembly ou quelque chose qui est compilé en code natif (ne s'exécutant pas dans une machine virtuelle). Dans ces extrêmes, on se préoccupe de ce qui tient dans le cache du processeur et de la rapidité avec laquelle il accède aux différentes parties de la mémoire, de la manière dont la prédiction de branche sur le processeur se déroule (si le processeur utilise la prédiction de branche ou des intervalles de retard).
La question de la prédiction de branche et des créneaux de retard ou du cache du processeur n'entre pas dans la grande majorité des problèmes de programmation et ne peut pas entrer dans des langages de machine interprétés ou virtuels.
Cela dit, il est utile de comprendre un niveau de ce qui se passe plus profondément que le code existant n'est en train d'être écrit. Le plus loin que cela atteint rapidement des rendements décroissants. Un programmeur Java doit comprendre un langage de programmation avec gestion manuelle de la mémoire et calcul du pointeur pour comprendre ce qui se passe sous les couvertures. Le programmeur AC doit comprendre l'assemblage pour que l'on puisse comprendre quels pointeurs vraiment sont et où la mémoire vraiment vient. Les codeurs d'assemblage doivent être familiers avec l'architecture pour comprendre ce que les compromis de prédiction de branche et les intervalles de retard signifient ... et pour aller encore plus loin, ceux la conception de processeurs doit être familière avec la mécanique quantique pour savoir comment les semi-conducteurs et les grilles fonctionnent à un niveau très basique.
J'irais jusqu'à dire que quiconque ne comprend pas l'organisation informatique est condamné à être un mauvais programmeur. Tu sauras:
Fondamentalement, vous apprendrez comment fonctionne réellement un ordinateur et vous pourrez ainsi mapper votre code plus efficacement.
Mise à jour 2018: Combien de développeurs de logiciels faut-il pour changer une ampoule ??? On s'en fout!? C'est un problème matériel!
Généralement NON, Vous n'avez pas besoin de connaître l'architecture informatique pour être un bon programmeur, c'est plus dans le domaine EE IMO .. à moins bien sûr que vous ' dans le développement de systèmes embarqués, mais dans ce cas, vous êtes marié à la puce et à la programmation, vous aurez donc besoin de connaître l'architecture de cet "ordinateur" (et même alors cela peut ne pas avoir d'importance), mais avoir un une compréhension architecturale générale du fonctionnement des ordinateurs ne sera pas bonne pour bien autre chose que les discussions sur les points d'eau.
Je dirais que c'est encore moins important de nos jours au rythme où le matériel baisse dans les prix et les performances s'améliorent/augmentent et à quelle vitesse les technologies changent et les langues évoluent. Les structures de données et les modèles de conception n'ont pas vraiment beaucoup à voir avec l'architecture matérielle physique pour autant que je sache.
Généralement, les programmeurs ont une formation en informatique, auquel cas ils ont plus que probablement suivi des cours d'architecture informatique, mais de nos jours, les systèmes d'exploitation deviennent virtuels, l'espace disque est partagé, la mémoire est évolutive, etc. etc. ..
J'ai pu faire une belle carrière dans la programmation (10 ans et plus) et j'ai très peu de connaissances pédagogiques en architecture informatique, principalement parce que ... j'étais un Art majeur !!!
Mise à jour: Juste pour être honnête, MES "petites connaissances pédagogiques" provenaient de mon CPU Sci. Mineur. et pourtant, je n'ai jamais eu besoin d'utiliser quoi que ce soit que j'ai appris de mes cours d'assemblage ou mes cours d'architecture informatique dans ma carrière de "Programmation".
Même maintenant, alors que je joue avec certaines idées de réseautage maillé mettant en œuvre la spécification ZigBee , j'ai constaté qu'en utilisant les produits et les outils disponibles ( XBee ), je suis en mesure de programme en Python et plop le code directement sur puce (SoC) et faire des trucs vraiment soignés avec lui .. TOUT sans avoir à se soucier de quoi que ce soit à voir avec réel architecture des puces, etc .. il y a certainement des limitations matérielles à connaître en raison de la taille de la puce et de l'objectif de prix bas prévu .. mais même cela va devenir moins dans les années à venir. Je maintiens donc ma réponse "généralement NON"
Comprendre les principes de l'architecture informatique nécessite d'apprendre de nombreux principes importants de programmation. Par conséquent, une connaissance de l'architecture informatique est pertinente pour la programmation dans n'importe quel langage, quel que soit son niveau.
Ces principes importants comprennent:
Cela peut vraiment aider un peu. Comprendre des concepts tels que la mémoire partagée et la communication entre processeurs et les retards potentiels impliqués dans ces derniers peut aider un programmeur à organiser ses données et ses méthodes de communication pour éviter de s'appuyer fortement sur ces mécanismes, si nécessaire. Cela est vrai pour d'autres domaines de la programmation tels que la mise à l'échelle horizontale, où la distribution et la communication entre un programme ou un système de programmes est un point focal principal.
Comprendre les pièges ou les fosses tar d'un système physique peut vous aider à organiser un tel programme pour aider à négocier les systèmes physiques aussi rapidement et efficacement que possible. Le simple fait de jeter des données dans une file d'attente de communication et de s'attendre à ce qu'elles évoluent est un aperçu de ce qui peut vraiment être mis en place, surtout si vous devez faire évoluer votre logiciel sur des systèmes plus grands pour une meilleure prise en charge.
De même, la compréhension des avantages de quelque chose comme la programmation fonctionnelle peut vraiment être illustrée à la lumière de la compréhension de ce qui se passe au niveau physique, des systèmes et rend donc encore plus de traction pour des concepts comme ceux-ci, à mon avis.
Un dernier exemple rapide pourrait être de comprendre le concept de traitement de flux et comment envoyer des données à une unité de traitement comme une carte vidéo peut être mieux fait d'une manière très spécifique, comme: envoyer tous les calculs requis, recevoir le cadre de les données d'un seul coup. Dans quelque chose comme des graphiques vidéo ou peut-être même des calculs physiques, vous ne voudriez pas avoir une communication ouverte avec un tel appareil en permanence; sachant cela, vous voudriez organiser cette partie de votre programme en tant que telle.
Après tout, si les programmeurs ne comprenaient pas ces problèmes et ces obstacles, ces solutions n'existeraient jamais dans le format qu'ils utilisent.
Connaître votre architecture vous permet de savoir quand quelque chose qui est demandé est impossible.
On m'a demandé une fois d'écrire un programme pour communiquer avec un PIC sur un port série PC. Le protocole aurait le PIC envoyant des octets de neuf bits, sans contrôle de flux. Je voudrais afficher dans l'interface utilisateur de mon programme les valeurs des champs dans les paquets que le PIC a envoyés. Question évidente: comment lire le neuvième bit de chaque octet? L'ingénieur du protocole et moi avons décidé d'essayer de définir la parité sur MARK, puis de traiter le neuvième bit comme un bit de parité. Je lirais la valeur du neuvième bit en fonction du succès ou de l'échec du contrôle de parité. Eh bien, j'ai implémenté cela, et cela n'a pas fonctionné. Les valeurs affichées étaient manifestement erronées. Et après trois jours continus de recherches sur l'architecture PC UART, j'ai découvert pourquoi.
Voici pourquoi. Le PC UART met en mémoire tampon son entrée. Au moment où il interrompt le CPU pour dire "READY TO READ", un nombre quelconque d'octets aurait pu s'accumuler dans son tampon. Il n'y a cependant qu'une seule ligne Registre d'état pour contenir la valeur du contrôle de parité. Il est donc impossible de dire quel octet du tampon a échoué au contrôle de parité. Donc: assurez-vous que le tampon ne fait qu'un octet de long, dites-vous? C'est un paramètre de contrôle de flux, et J'ai déjà mentionné que ce protocole n'avait pas de contrôle de flux. Si je ne connaissais pas l'architecture du matériel que je programmais, je n'aurais jamais pu dire: "La lecture du neuvième bit est impossible et doit être coupée. "