Le but de ce projet est de réaliser un compilateur d'un langage proche
du C, permettant de faire 2 opérations parallèles qu'on trouve dans la
plupart des langages fonctionnels: map et reduce. Ce travail est à
réaliser en binôme. Le langage sera compilé en du code intermédiaire
du compilateur LLVM. L'appel au compilateur LLVM permettra ainsi de
finir la compilation en binaire et de générer du code efficace. La
grammaire et l'analyseur syntaxique pour le langage commun sont
fournis pour lex et yacc et pour une programmation C, mais vous pouvez
choisir tout autre langage que le C et d'autres outils que lex et yacc
(en python, java, ...). Voir
sur cette
page pour des alternatives.
Objectifs du projet
L'objectif du projet est d'implémenter un compilateur pour le langage défini par la grammaire donnée. La sémantique sera celle du C, avec les restrictions suivantes:
- Pas de pointeurs (*), de structures, d'unions
- Les tableaux sont à une dimension
Le compilateur devra indiquer s'il trouve des erreurs de syntaxe, sur quelle ligne, et si il y a des erreurs de typage.
Map / Reduce
Les deux fonctions, map et reduce, sont des opérations
parallèles. Pour chaque appel à map ou reduce, le compilateur devra générer un code vectoriel: les instructions manipuleront les données 8 éléments par 8 éléments (entiers ou flottants).
Une fonctionnalité facultative est de pousser le parallélisme en utilisant des threads pour effectuer ces opérations.
Fonctionnalités facultatives
Un ensemble de fonctionnalités facultatives peut être implémenté:
- Un parallélisme de thread peut être ajouté en plus du parallélisme vectoriel pour les opérations map et reduce.
- L'opérateur malloc pour allouer des tableaux dynamiquement pourra être déclaré comme fonction externe (avec un malloc pour les entiers, un pour les flottants).
- Les tableaux pourront être multidimensionnels.
- Les fonctions pourront être récursives.
Tout autre extension pourra être proposée.
À Rendre
La réalisation du compilateur donnera lieu à 2 livrables
- Un rapport et une archive de programmes tests. Le rapport présentera brièvement le langage ainsi que les tests. Une dizaine de tests pour l'extension sont attendus. Le rendu est à faire pour le 13 novembre 2015.
- Une archive avec les sources de votre compilateur. Le compilateur doit pouvoir compiler sur les machines de l'enseignement. Le makefile doit être fonctionnel. Le code source doit être remis au plus tard le
jeudi 17 décembre 2015.
Une soutenance orale sera organisée, ou chaque groupe présentera en
5min ce que fait son compilateur.
Évaluation
L'évaluation sera basée sur ces critères (dans cet
ordre, du plus important au moins important):
- Le compilateur fonctionne pour l'ensemble des fonctionnalités décrites pour le langage C Map/Reduce et genère un code correct.
- La stabilité du compilateur (pas de plantage lors de la compilation)
- La qualité du rapport.
- Les fonctionnalités facultatives implémentées.