2013-01-11 6 views
2

Lors de l'écriture dans un langage tel que C, le compilateur prend théoriquement votre code lisible par un humain et le traduit en code machine - instructions atomiques relativement dépendantes du matériel. Chaque architecture de CPU semble avoir un jeu d'instructions qui est implémenté pour le CPU d'une manière câblée, mais il semble que des processeurs différents peuvent implémenter le même ISA de différentes manières, par exemple x86. Est-ce que cela signifie qu'un ISA agit essentiellement comme une couche d'abstraction pour le matériel? x86 dit: Ce sont les instructions standard que je propose - vous n'avez pas besoin de savoir comment le matériel le fait, sachez juste que c'est le cas et vous pouvez les utiliser en m'envoyant le code machine suivant? Donc, si je construisais une nouvelle CPU et que j'installais mon CPU de façon à ce qu'elle suive le standard x86, je n'aurais pas besoin d'écrire un compilateur spécifique à mon matériel, mais tout compilateur compilé à partir de C à l'ISA x86 serait suffisant pour mon nouveau CPU?Modifications du compilateur pour le nouveau matériel

+1

Les réponses sont oui et oui. –

Répondre

1

Oui, l'architecture x86 est bien documentée et forme une couche d'abstraction. Toutefois, un compilateur d'optimisation peut faire mieux s'il comprend les retards d'utilisation de la charge, le nombre d'unités de stockage de charge, le nombre et les types d'unités de calcul, les tailles de cache et les lignes de cache; le nombre de registres internes, certains processeurs font plus de réordonnancement du flux d'instructions, etc .; ces choses étant spécifiques à la mise en œuvre. Par exemple, un processeur plus ancien peut avoir une seule unité de multiplication entière, une plus récente peut en avoir deux (une plus ancienne peut n'en avoir aucune, j'ai travaillé sur une telle, mais pas sur x86). Leurs types peuvent également différer. Ces différences modifient l'équilibre entre les compromis vitesse-espace dans l'optimisation/la génération de code, donc une stratégie qui sait qui peut utiliser différentes séquences d'instructions. Par exemple, une multiplication par une grande constante est probablement la plus courte en utilisant l'instruction de multiplication, mais pourrait être plus lente ou plus rapide que plusieurs opérations de décalage et d'addition, en fonction de l'implémentation sous-jacente. Ainsi, le compilateur a quelques choix à faire, et comme il peut garder une trace de beaucoup d'état à propos du code qu'il écrit, il peut utiliser des stratégies de décision plutôt complexes.

Une autre stratégie d'optimisation courante consiste à entrelacer deux ou plusieurs calculs différents; ceci afin de garder le processeur plus occupé. Pour ce faire, augmente souvent le nombre de registres nécessaires, et peut même nécessiter plus d'instructions, et pourrait être plus rapide mais plus long ou ne pas dépendre à nouveau de l'implémentation sous-jacente.

1

le compilateur prend théoriquement votre code lisible et traduit en code machine

Je dirais que c'est ce que le compilateur fait. Ce n'est pas théorique.

Si vous répondez aux spécifications du jeu d'instructions, vous êtes libre de choisir votre implémentation matérielle.

Le jeu d'instructions peut avoir quelques instructions simples comme ADD, SUBTRACT, tant que la CPU exécute l'instruction bit-précise, vous ne devriez pas vous soucier de l'implémentation. En fait, c'est là que l'on peut améliorer les performances en augmentant la complexité de l'implémentation de l'additionneur pour permettre des vitesses d'horloge plus rapides.

+0

Votre dernière phrase contredit votre deuxième dernière phrase. Les compilateurs s'en soucient certainement. – EJP

+0

Quelle est la contradiction? Vous recevez une instruction fixe (modèle binaire), par exemple un ADD. Le matériel décode l'ADD et effectue un ADD il ne dit rien sur l'architecture additionnelle implémentée par le matériel. – Morgan

Questions connexes