J'essaie de vraiment comprendre comment exactement un langage de haut niveau est converti en code machine, puis exécuté par le processeur.
Je comprends que le code est compilé en code machine, qui est le code de bas niveau qu'un processeur peut utiliser. Si j'ai une déclaration de mission, dites:
x = x + 5;
y = x - 3;
Le CPU exécute-t-il chaque ligne une par une? Il exécutera donc d'abord x = x + 5; puis l'instruction suivante que la CPU exécutera est la y = x-3; J'essaie vraiment de comprendre le processus d'exécution et comment le code que j'écris est réellement exécuté par le CPU.
computer-science
cpu
Frankie
la source
la source
Réponses:
Les lignes de code n'ont rien à voir avec la façon dont le CPU l'exécute. Je recommanderais de lire l'assembleur, car cela vous apprendra beaucoup sur la façon dont le matériel fait les choses. Vous pouvez également obtenir la sortie de l'assembleur à partir de nombreux compilateurs.
Ce code peut être compilé en quelque chose comme (dans un langage assembleur composé):
Toutefois, si le compilateur sait qu'une variable n'est pas utilisée à nouveau, l'opération de stockage peut ne pas être émise.
Maintenant, pour que le débogueur sache quel code machine correspond à une ligne de source de programme, des annotations sont ajoutées par le compilateur pour montrer quelle ligne correspond à où dans le code machine.
la source
ADD Rx, Rx, $5
etSUB Ry, Rx, $3
(en supposant que les variables x et y ont été mappées dans des registres). Vous décrivez une approche RISC de chargement / stockage.Ça dépend.
Au début des machines vraiment simples, oui, le code s'exécutait une ligne à la fois. Comme les machines sont devenues plus grandes, plus rapides et plus complexes, vous avez commencé à voir à la fois la possibilité d'exécuter plusieurs instructions simultanément et les lectures et écritures en mémoire prenant beaucoup plus de temps que les opérations sur les registres.
L'optimisation des compilateurs devait en tenir compte, et les lignes que vous donniez pouvaient être exécutées "plus ou moins" en parallèle, avec une partie du processeur travaillant sur le calcul de y, tandis qu'une autre partie stockait la nouvelle valeur précédemment calculée de x (et le calcul de y utilisait cette nouvelle valeur du registre).
Le Control Data 6600 a été la première machine que je connaisse à faire ce genre de choses. L'ajout d'entiers a pris 300 nsec, la référence de mémoire (lecture ou écriture) a pris 1000 nsec, les multiplications et les divisions ont pris beaucoup plus de temps. Jusqu'à une dizaine d'instructions pourraient toutes être exécutées en parallèle, selon les unités fonctionnelles requises. Les compilateurs CDC 6600 FORTRAN étaient TRÈS bons pour planifier tout cela.
la source
x
? De cette façon, il a déjà exécuté le code et l'a stocké dans le cache.Non, il n'y a pas de mappage un à un entre les lignes de code / instructions dans les langues de niveau supérieur et inférieur. En fait, les deux lignes ci-dessus sont traduites en plusieurs instructions de code machine , comme
Les détails réels de ces instructions varient selon les plateformes.
C'est la vision de base des choses. Cependant, pour compliquer davantage les problèmes, les processeurs modernes appliquent des techniques telles que les pipelines d'exécution , l' exécution dans le désordre et plusieurs cœurs , entre autres. Il en résulte que la CPU fait plusieurs choses à la fois, par exemple les pipelines traitent différentes phases des instructions suivantes en parallèle au sein de la même unité de traitement, tandis que plusieurs cœurs peuvent traiter des instructions indépendantes en parallèle.
la source
Vous devriez regarder dans les moindres détails dans un livre pour trouver plus de détails sur son fonctionnement, peut-être aussi une classe de compilation.
Fondamentalement, votre question se concentre sur 2 aspects différents.
1) Comment le code est-il traduit en code machine?
2) Quand / comment le code est-il calculé en utilisant la parallélisation?
La réponse à 1) dépend de la langue que vous utilisez (bien que votre exemple soit trivial, la sortie serait la même). La façon dont le compilateur effectue la traduction en code machine est l'une des forces du langage. En outre, il y a plusieurs problèmes à prendre en compte dans votre exemple, le code devrait charger les données en mémoire, les stocker, etc.
Enfin, la parallélisation est une fonctionnalité que vous pouvez forcer d'un point de vue de la programmation, mais en résumé, certains processeurs peuvent essayer de penser qu'une partie du code peut être exécutée en même temps, car ils sont indépendants. Dans votre cas, ce n'est clairement pas le cas, car vous devez exécuter les instructions séquentiellement, donc non, cela ne s'exécutera pas en même temps.
la source