112 lines
3.4 KiB
TeX
112 lines
3.4 KiB
TeX
\chapter{Représentation intermédiaire}
|
|
|
|
void : () : sxp const 0
|
|
|
|
\section{Gestion de la mémoire}
|
|
|
|
On distingue cinq types de mémoire~:
|
|
\begin{itemize}
|
|
\item \textbf{Les registres~:} dans les 32 registres sur les processeurs
|
|
MIPS.\\
|
|
C'est une mémoire très rapide mais très chère.
|
|
\item \textbf{Cache de niveau 1~:} dans les 8ko
|
|
\item \textbf{Cache niveau 2~:} de l'ordre d'une 10aine de cycles
|
|
\item \textbf{Mémoire principale~:} 100 fois plus lent
|
|
\item \textbf{Disque de stockage~:} 1M fois plus lent
|
|
\end{itemize}
|
|
|
|
Le but est d'avoir le plus d'informations dans le haut pour perdre le moins de
|
|
vitesse possible (d'où échappement des variables, \ldots).
|
|
|
|
\subsection{Pas assez de registres~?}
|
|
|
|
On le verra dans un prochain cours.
|
|
|
|
Lorsque l'on a pas de récursion, cela signifie qu'il y a au plus autant de
|
|
fonctions présentes en mémoire que de fonctions écrite~; donc on peut avoir une
|
|
mémoire parfaitement statique où chaque fonction peut être bornée statiquement.
|
|
|
|
À partir du moment où l'on a besoin de récursion, on a besoin d'une pile
|
|
d'appel de fonction qui est une forme d'allocation dynamique.
|
|
|
|
|
|
\subsection{Allocation dynamique de la mémoire}
|
|
|
|
\verb+libgc+ : implémentation d'un grabage collector en C.
|
|
|
|
Utilisé par GCJ.
|
|
|
|
\subsection{Modèle mémoire de \texttt{spim}}
|
|
|
|
Entre 0x0 et 0x400000, l'espace est réservé, pour être sûr que 0x0 soit ni
|
|
lisible ni modifiable.
|
|
|
|
Ensuite, il y a le code, puis les datas (variables statiques, tout ce qui est
|
|
global).
|
|
|
|
Tout en haut, il y a la pile qui descend (et sous Linux, une emplacement
|
|
mémoire réservé au noyau.)
|
|
|
|
\subsection{Blocs d'activation (Activation blocks/Stack Frame)}
|
|
|
|
Une activation désigne une simple instance d'une fonction.
|
|
|
|
Toutes les variables locales sont libérés automatiquement, c'est plus
|
|
efficasse que de faire appel à \verb+malloc+.
|
|
|
|
\subsubsection{Contenu}
|
|
|
|
Dans la stack, on trouve~:
|
|
\begin{itemize}
|
|
\item Les arguments,
|
|
\item les variables locales,
|
|
\item l'adresse de retour~: pour que la fonction sache où revenir,
|
|
\item une sauvegarde des registres~: selon l'architecture.
|
|
\end{itemize}
|
|
|
|
L'ordre dans lequel ces éléments sont mis dans la pile sont imposés (en vrai
|
|
pas vraiment, mais si on fait notre tambouille, on est plus compatible avec la
|
|
libc du coup ça sert un peu à rien).
|
|
|
|
La pile esr délimité par \verb+sp+ (Stack Pointer), toujours l'adresse la plus
|
|
basse (le plus haut élément de la pile) et par le \verb+fp+ (Frame Pointer),
|
|
qui correspond au début de la fonction courante.
|
|
|
|
Lorsque l'on quitte une fonction, on replace \verb+sp+ et \verb+fp+ dans l'état
|
|
précédent.
|
|
|
|
\subsubsection{\texttt{std::auto\_ptr}}
|
|
|
|
Lié aux exceptions en C++.
|
|
|
|
Quand on lève des exceptions, on balance des pointeurs, du coup, on risque
|
|
perdre cette mémoire.\\
|
|
|
|
Dans le nouveau standard, il est plutôt conseillé d'utiliser
|
|
\verb+std::unique_ptr+ ou \verb+std::shared_ptr+.
|
|
|
|
\section{Traduction vers HIR}
|
|
|
|
\subsection{\texttt{temp}~: gestion des étiquettes}
|
|
|
|
Génération de temporaires anonymes ou nommées.
|
|
|
|
\verb+endo_map+~: un peu comme \verb+std::map+, pour l'allocation de registre,
|
|
plus tard.
|
|
|
|
\subsection{Actors}
|
|
|
|
Pour A. Apple, il utilise \verb+Exp+, chez nous c'est \verb+Sxp+ pour plus de
|
|
clareté.
|
|
|
|
\verb+Seq+ c'est une liste d'instruction (Pair chez A. Apple).
|
|
|
|
\subsection{\texttt{frame}}
|
|
|
|
Gestion de la mémoire associé à une fonction (des variables, ...)
|
|
|
|
\verb+local_alloc+~: réservation de la mémoire.
|
|
|
|
|
|
Le langage Tree n'est pas au courant du static link.
|