\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.
