:: Enseignements :: Master :: M1 :: 2007-2008 :: Génie Logiciel ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Java Enhanced Research Compiler (jerc) |
Le but de ce projet est de comprendre la structure du compilateur Java,
OpenJDK javac, après tout le compilateur est aussi un programme.
Donc le but de ce projet est de faire du rétro-ingénierie sur le code
de javac en créant les diagramme UML correspondant au code
puis de modifier le code pour ajouter une nouvelle fonctionalité.
Attention le sujet est en cours de rédaction.
Nouvelle fonctionalité
Voici une liste non exhausive des nouvelles fonctionalités qui peuvent être
implantées.. Chaque binome doit choisir une seule fonctionnalité parmi celle décrite ci-dessous
où en proposer une nouvelle qui devra dans ce cas être valider
par les deux chargés de TD.
-
Emoticode
Comme indiqué dans le blog de Chet Haase
http://weblogs.java.net/blog/chet/archive/2006/12/closures_making.html,
le but est de permettre d'utiliser les smileys en tant qu'identificateur en Java.
Attention, le code normal devra continuer à compiler donc soit
certain emoticons seront interdit ou mieux désactivés suivant le context.
Par exemple:
for(;;) { // il n'y a pas d'emoticon ici
...
}
Cette modification est facile.
-
Thread local field
Le but est de permettre la déclaration de champs locaux à une thread
en ajoutant un nouveau mot-clé "threadlocal".
Le compilateur transforme ce champs en utilisant la classe
java.lang.ThreadLocal.
Il serait bien que thread local ne soit un mot-clé que lors de
la déclaration des champs et donc utilisatable comme identificateur
autre part pour éviter les problèmes de compatibilité.
Cette modification n'est ni facile ni difficile.
-
SelfType aka type of this
Le but est de permettre d'exprimer le type de this
comme d'écrit dans le blog de peter ahé,
http://blogs.sun.com/ahe/entry/selftypes
Pour éviter des problèmes de mot-clé, on utilisera "this"
pour indiquer le type de "this" (le même mot-clé).
De plus, pour éviter de faire des choses trop compliqué,
on ne permettra "this" (en tant que type)
uniquement en tant que type de retour.
Cette modification est difficile.
-
Type safe array of generics
Actuellement, il est impossible de créer un tableau de type paramétré.
L'idée est de lever cette contrainte, techniquement,
créer un tableau de type paramétré n'est pas unsafe
si l'on respecte la règle suivante :
if U is an array of parametrized type, the compiler should only emit a warning, if :
T is Object, Cloneable, Serializable or
T is an array of V which is not parametrized or
T is an array of raw type.
T is an unbound wildcard.
Donc la modification consiste à permettre l'allocation des types paramétrés
et à ajouter des warnings "unsafe cast" suivant cette règle.
Cette modification n'est ni facile ni difficile.
-
Auto-null
Il est des fois assez pratique de mettre les références à null une fois
que l'objet n'est plus utilisé pour qu'il puisse être garbage
collecté avant la fin de la méthode. Le but de cette extension consiste
à repérer pour les variables locales stockant des références sur des objets
la dernière fois où celles-ci sont utilisée
(cette information est déjà calculée par le compilateur)
et à insérer une instruction mettant la référence à null.
Par exemple:
VeryBigObject vbo=new VeryBigObject();
fbo.doSomething(); // insérer un fbo=null, ici
system.out.println("toto");
En fait, il est même possible d'insérer le fbo=null, (astore de null)
avant l'appel à doSometing() si fbo est déjà sur la pile.
Cette modification n'est ni facile ni difficile.
-
@CatchReturn
Il n'est pas possible actuellement d'obliger un utilisateur d'une
méthode à récupérer la valeur de retour pourtant dans la cas d'une
méthode sans effet de bord comme String.toUpperCase
cela n'a pas de sens de ne pas récupérer cette valeur.
Le but est donc d'ajouter une annotation @CatchReturn
(que l'on déclarera sur les méthodes) dans java.lang
et de modifier le compilateur pour que celui-ci
vérifie que si une méthode possède cette annotation alors
sa valeur est bien utilisée.
Cette modification est facile.
-
@CheckedException
Le but est d'indiquer au compilateur que certaine
exception qui hérite de runtime exception doivent être
quand même gérer comme si elle héritait uniquement
d'exception i.e en forçant à avoir soit un try/catch
au site d'appel ou un throws.
On se propose d'ajouter une annotation @CheckedException dans
java.lang pour indiquer ce genre d'exception.
Le compilateur au lieu de signaler une erreur signalera
juste un warning "checkedexception"
qui pourra être supprimer par @SuppressWarnings.
Attention, il y a quelque règles à respecter :
-
Il n'est pas possible de mettre @CheckedException
sur autre chose que des RuntimeException.
-
Si une méthode lève une exception marqué avec
@CheckedException, une méthode qui redéfinira cette méthode
devra aussi lever une @CheckedException. Basiquement cela veux dire que si
une exception est une @CheckedException toutes ses sous-classes
le sont aussi.
-
Si une méthode ne lève pas d'exception, une méthode redéfinie ne
pourra pas lever d'exception marqué @CheckedException.
Cette modification n'est ni facile ni difficile.
-
Array to List boxing
Il n'est pas possible facilement de convertir
un tableau d'objet, Object[], en son équivalent, utilisant
les collections de Java, java.util.List.
Le but est d'implanter un mécanisme équivalent au mécanisme
de boxing/unboxing permettant de convertir n'importe quel
tableau d'objet en son équivalent en List.
La partie un peu compliqué est l'unboxing de n'importe quelles
listes.
Cette modification n'est ni facile ni difficile.
Les contraintes
Quelque soit la modification que vous avez choisit d'implanter, il y a un certain nombre
de contraintes à respecter.
-
Par défaut, votre javac patché fonctionne normalement. Pour activer la nouvelle fonctionnalité,
il faut utiliser -XDblahblah sur la ligne de commande. Je vous laisse choisir le
nom de l'option.
-
Chaque modification est "backward compatible", cela veux dire que le code déjà existant
en Java doit continuer à fonctionner comme avant même si la nouvelle fonctionalité est activé.
Obtenir les sources et compiler
Les sources du compilateur et de javadoc, javap etc. sont
disponibles sur le site suivant:
https://kijaro.dev.java.net/.
Il faut d'abord créer un compte sur java.net puis
sur le projet kijaro vous trouverez les sources dans la branche SVN:
kijaro/sun
Donc en ligne de commande, cela doit donner quelque chose comme cela:
svn checkout https://kijaro.dev.java.net/svn/kijaro/sun kijaro/sun/langtools --username votrelogin
Noter qu'il existe un plugin eclipse pour SVN à l'adresse suivante:
http://subclipse.tigris.org/.
Une fois les sources obtenues, dans le répertoire langtools,
il y a un fichier Ant, build.xml que l'on
utilisera pour compiler.
Details du rendu
Voici le détail de ce qui devra être foruni le 25 février 2008
par mail au deux chargés de TD sous forme d'une archive ZIP
dont le nom contiendra le nom des deux binomes (pas les logins SVP).
-
Un fichier README conteant vos noms et prénoms ainsi que l'ensemble
des instructions permettant d'utiliser votre compilateur patché.
-
un repertoire diff contenant un fichier kijaro.diff
contenant la différence (la patch) entre votre code source et la branche SVN
de kijaro au format diff unifié (diff -u).
Noter que c'est aussi le format du diff d'eclipse.
-
un répertoire src contenant des fichiers Java additionnels,
par exemple si vous devez ajouter des choses dans java.lang.
-
un répertoire lib contenant votre compilateur Java modifié
sous forme d'un jar: javac.jar ainsi que si vous avez besoin
un autre jar contenant les fichiers compilés de src.
-
un répertoire test contenant l'ensemble de vos tests
avec un script ant permettant d'exécuter l'ensemble des tests.
Les tests devront être au format JUnit 4.x.
-
-
Un document de développement dev.pdf d'au moins 50 pages au format PDF.
Ce document devra possèder une page de grade, un sommaire, un index,
un template documentaire, avoir des pages numérotés, être rédiger de préférence
en Latex (c'est plus beau et donc cela met le lecteur dans de bonne condition).
-
Une introduction indiquant quelle fonctionnalité vous avez choisi
d'implanter ainsi que comment on fait pour tester celle-ci.
-
Première partie:
Une description générale de l'ensemble des paquetages utilisé par le compilateur.
Puis en prenant l'exemple d'une compilation de fichier
juqu'à la génération du .class
une présentation, dans un l'ordre, de chaque paquetage utilisé
avec pour chacun des paquetage une description des classes
utilisées.
Pour aider à la compréhension de chaque paquetage vous indiquerez
les design-pattern implantées en citant les classes impliquées
dans ceux-ci.
Pour appuyer vos explications, vous fournirez par paquetage un diagramme
de classe avec les relations de hiérarchies et les associations.
Pour chaque classe, vous détaillerez l'ensemble des champs et méthodes
importantes avec pour les méthodes leurs signatures complètes.
Les dépendances et relations d'import ne devront pas figurées
sur ce diagramme.
Ici on cherche à comprendre le fonctionnement général, donc
il ne doit pas y avoir un détail de toutes le classes mais seulement
les principales avec leur rôle/reponsabilité. De plus, les design-patterns
ne doivent pas tomber du ciel mais servir à expliquer comment
l'ensemble fonctionne.
De plus
les
-
Seconde partie:
Par rapport à la fonctionnalité que vous avez choisie, vous allez
indiquer les différentes options permettant de réaliser cette
fonctionnalité avec leur avantages et inconvénient.
Puis vous détaillerez précisément l'implantation de vous avez choisie
en indiquant l'ensemble des classes impactées et les défis que vous avez
du relevé.
Enfin, vous indiquerez les limites de votre approches ainsi que les
bugs éventuelles.
-
Troisième partie:
Les tests. Vous indiquerez ici l'ensemble des tests que
vous avez effectué (au moins une vingtaine minimum) avec
pour chaque test ce que vous avez voulu tester,
le résultat attendu et si nécessaire, le résultat effectif si
celui-ci différe.
-
Enfin, comme tout rapport vous finirez par une conclusion
apportant un peu de recul par rapport au travail que vous avez
effectué.
References
http://blogs.sun.com/darcy/entry/so_you_want_to_change
© Université de Marne-la-Vallée