Compilation M1 MPRI

Compilation d'un sous-ensemble de caml vers l'assembleur MIPS de MARS

Build

le projet utilise menhir et ocamlbuild
Il y a 3 scripts pour compiler:

Execution

Le jar de Mars est directement dans le projet, il faut que java soit installé.

Example:

./run_impc.sh circle
./run_impc.sh fun2
./run_mmlc.sh equality

Les scripts run_impc_tests.sh, run_func_tests.sh et run_mmlc_tests.sh compile et exécute tous les tests présents dans src/impc/tests, src/func/tests et src/mmlc/tests respectivement

Extensions

Tous les sujets sont complets, seules les extensions du sujet 1.2 et des sujets 2 n'ont pas été réalisées.

Concernant malloc() et free(), l'implémentation est une liste chaînée unidirectionnelle first-fit

free() fusionne tous les blocs à droite si ils sont à la suite et non alloués

malloc et free ne sont pas builtins, et il y a donc des implémentations minimales afin de rendre des exemples fonctionnels L'implémentation complète réside dans malloc.imp

Module 1

Sujet 1.1:

  • Instructions Combinées
  • Expressions constantes pré-calculées
  • Utilisation non-systématique de la pile
  • Précalculation des adresses (global)
  • Opérateurs paresseux
  • Interruptions de boucles
  • Boucle for
  • en plus: Opérateurs binaires (shift, and, or)

Sujet 1.2:

  • A: Procédures
  • C: Fonction main
  • C: Convention affinée
  • C: Tail call optimization
  • B: Convention d'appel avec registres
  • C: Tail Call + B
  • D: TAC IR
  • D: Variables locales -> $t* autant que possible

Sujet 1.3:

  • Tableau: Séquences de valeurs
  • Tableau: Répétition d'une valeur
  • Tableau: Compréhension

Module 2

Sujet 2.1:

  • Affichage simplifié
  • Garbage collector
  • Optimisation des appels terminaux

Sujet 2.2:

  • n-uplets généraux
  • Structures de données & match/with
  • Inférence de types
  • Polymorphisme paramètrique