|
Postscript, PDF | Didier Rémy | Polytechnique, INRIA |
Cours (super, self) | Exercises |
|
à | L'assemblage. |
à | L'édition de liens. |
à | L'ordonnancement des instructions |
|
|
|
mul $t1, $t1, $t3
est plus lente
que l'addition, suivi de l'instruction add $t1, $t1, $t4
. La
valeur de
$t1
prise par l'addition sera alors sa valeur avant sa multiplication
par $t3
.
à | réduire les temps d'attentent, en lançant certains calculs plus tôt. |
à | éviter des incohérences liés au pipelining. (Parfois, il est nécessaire des instruction de délai (qui ne calculent pas). |
|
|
à | On maintient en têtre de chaque bloc dans un compteur le nombre total de fois que ce bloc est référencé (par un autre bloc ou par une racine du GC). Lorsque que le bloc n'est plus référencé il n'est définitivement plus accessible et peut être recyclé. |
à | Il faut instrumenter le compilateur pour insérer des instructions de comptage durant l'exécution (la copie d'une adresse d'un registre dans un autre, la mise en pile, etc. modifie le nombre de références). |
à | Ces instructions peuvent devenir coûteuses (gestion proportionnelle au parcourt de la taille de la mémoire). |
à | De plus, le GC à compteur de référence n'est pas capable de récupérer les cycles (qui se référencent réciproquement sans être référencé de l'extérieur). |
à | Lorsqu'il n'y a plus de mémoire disponible, on parcourt la mémoire à partir des racines et on marque la partie parcourue, puis on balaye toute la mémoire et on récupère les parties non marqueés. |
à | Le temps d'un GC est proportionnel à l'espace alloué. Les données vivantes ne sont pas déplacés (fragmentation possible). |
à | On sépare la zône mémoure entre une zône de travail et une zône vierge. Lorsqu'il n'y a plus de mémoire, on parcourt la mémoire à partir des racine et on la recopie dans la zône vierge (il faut préserver sa structure de graphe). La zône vierge devient la zône de travail et inversement. |
à | Le coût est proportionnel à l'espace vivant. C'est donc très efficicace pour des allocations de durée de vie très courte. Les données vivantes sont recopiées (pas de compaction). |
à | Après un GC majeure, on sépare considère la zône vierge libre comme une mémoire de génération mineure que l'on coupe en deux et sur laquelle on peut implanté un GC mineure (qui ne parcourt que la zône mineure, donc que les données fraîches). Quand la zône mineure devient trop dense, on fait un GC majeure et on recommence. |
à | En première approximation, les données majeures sont plus persistantes (peu récupérables) alors que les données mineures sont éphémères. Le GC mineure est donc très rapide (en supposant qu'il récupère presque tout). |
|
à | L'appel aux petites fonctions auxilliaires est remplacé par leur corps. |
à | Élimine un appel à une fonction, augmente la vitesse d'exécution, mais aussi pour de très petites fonctions, la taille du code produit. |
à | L'utilisation de petites fonctions est très fréquente dans les langages
fonctionnels. De façon général, il est bon d'encourager la définition de fonctions auxilliaires, qui rendent le code plus lisible, sans diminuer l'efficacité. |
à | La mise en oeuvre est facile (Renommer les variables) |
à | Le gain est significatif. |
à | Rend les optimisations inter-procédurale moins nécessaires. |
à | Dans une fonction f, un appel à une fonction g est terminal si au retour de g la fonction f retourne immédiatement. |
à | On peut alors exécuter le postlude de f (ajustement de la pile) avant l'appel à g. Au retour de g, il n'y a plus besoin de repasser par f. La fonction f peut donc faire un appel à g sans retour, laissant g retourner directement là ou f devait retourner. |
à | Le gain est un retour plus rapide mais la libération anticipée de l'espace
en pile utilisé par f avant l'appel à g. Cela permet des appels récursifs à une profondeur très grande sans risque de débordement de pile. |
à | Les constantes sont utilisées pour régler certaines valeurs par défaut. Une constante est une variable qui a la même valeur dans tout les programme. D'autres variables peuvent se retrouver dans la même situation. |
à | On peut alors effectuer certains calculs, voir certains branchements à la
compilation. Un exemple typique est une variable debug . Lors que
le programme est compilé sans l'option debug, on veut éliminer les branches
mortes (réserver à la mise au point).
|
à | Un invariant de boucle est un calcul à l'intérieur d'une boucle qui est inchangé à chaque itération. |
à | Un tel calcul peut être effectuer une seule fois avant d'entrer dans la bouche. |
This document was translated from LATEX by HEVEA and HACHA.