Si vous ne décidez d'apprendre un peu d'assembleur, vous devriez probablement apprendre quelque chose comme 6502 assembleur sur un Commodore 64 (émulé, bien sûr), ou 68000 sur un Amiga.
Vous pouvez vous faire une idée du Commodore 64 ici ...
http://thepiratebay.org/torrent/4609238/Tag3-Saal2-Slot16_00--ID2874-the_ultimate_commodore_64_talk-Main
Le livre classique sur tout ce que vous devez savoir est celui décrit ici ...
http://reprog.wordpress.com/2010/03/12/programming-books-part-3-programming-the-commodore-64/
Vous pouvez probablement trouver une analyse PDF si vous regardez autour de vous.
IMO, 6502 est plus facile que Z80, et 68000 est plus facile que 8086 - jeux d'instructions plus réguliers, etc.
Mais le CPU n'est qu'un aspect du matériel. En outre, un processeur moderne est une bête très différente, et il fait des choses qui sont transparentes même du point de vue des compilateurs - comme présenter un espace d'adressage virtuel.
Un avantage particulier du 6502 sur le C64 est que non seulement le processeur est simple, mais il y a aussi du matériel très simple à pirater. J'ai eu beaucoup de plaisir à jouer avec la puce de musique SID.
Donc - c'est probablement un exercice intéressant si vous n'y passez pas trop de temps. J'ai appris l'assembleur 6502 comme deuxième langue quand j'avais environ 14 ans, juste après Commodore Basic. Mais surtout, il s'agit d'obtenir ce modèle de travail très simple afin que vous puissiez y ajouter des idées plus sophistiquées avec un minimum de malentendus.
Quelques choses utiles que vous pouvez apprendre en travaillant dans l'assembleur ...
- Fonctionnement des registres du processeur.
- Fonctionnement de l'adressage mémoire, y compris l'indirection.
- Comment fonctionne la pile CPU.
- Fonctionnement de la logique au niveau du bit.
- Comment le CPU contrôle les périphériques d'E / S.
- Comment fonctionnent les interruptions.
Une raison particulière que je recommanderais est d'avoir une meilleure intuition de la façon dont les étapes simples fonctionnent de manière entièrement déterministe et mécanique et totalement sans intelligence ni bon sens. S'habituer fondamentalement au modèle d'exécution impérative sous sa forme la plus pure et la plus obstinément ignorante.
Précisément comment il est utile de connaître la plupart de ces choses maintenant, cependant, est une question difficile.
Une chose que vous n'apprendrez pas est de bien jouer avec une hiérarchie de mémoire. Ces vieilles machines avaient pour la plupart un modèle de mémoire simple sans couches de cache et sans mémoire virtuelle. Vous n'aurez pas non plus beaucoup d'informations sur la concurrence - ils étaient certainement des moyens de gérer cela, mais cela signifiait principalement des interruptions. Vous n'avez pas besoin de vous soucier des mutex, etc.
Parfois, un modèle mental de la façon dont ces choses fonctionnaient autrefois ou du fonctionnement de l'assembleur peut même induire en erreur. Par exemple, penser à un pointeur C comme une adresse peut conduire à des problèmes de comportement indéfinis. Le pointeur AC est normalement implémenté comme un entier contenant une adresse, mais il n'y a aucune garantie que cela soit strictement vrai. Par exemple, sur certaines plateformes bizarres, différents pointeurs peuvent pointer vers différents espaces d'adressage. Cela devient important lorsque vous voulez faire de l'arithmétique ou de la logique au niveau du bit avec deux pointeurs.
À moins que vous n'ayez une de ces plates-formes bizarres, vous ne pensez peut-être pas que cela vous intéresse - mais les compilateurs de nos jours sont de plus en plus susceptibles d'exploiter un comportement non défini pour l'optimisation.
Un modèle mental de l'architecture du système peut donc être utile, mais il est toujours important de coder en fonction de la spécification de la langue, pas d'un modèle hypothétique que votre langue et votre plate-forme peuvent ne pas respecter.
Enfin, beaucoup de choses utiles sur les modèles mentaux proviennent de la façon dont les compilateurs génèrent du code - et la génération de code pour les langages modernes est très différente des compilateurs assez triviaux disponibles à l'époque.
C'est un de mes livres préférés pour ça ...
http://dickgrune.com/Books/MCD_1st_Edition/
Outre les informations sur l'analyse syntaxique et les AST, etc., il couvre la génération de code pour une gamme de paradigmes de langage - impératif, POO, fonctionnel, logique, parallèle et distribué - et également pour la gestion de la mémoire. Si vous voulez savoir comment fonctionnent les appels de méthodes polymorphes sans vous enliser dans les détails du jeu d'instructions CPU, un livre comme celui-ci est votre ami - et une nouvelle édition devrait bientôt sortir.