Ce lab fait suite au lab2a et réutilise le code écrit lors du précédent lab,
la façon de fonctionner de l'interpreteur reste donc identique,
et le but de ce lab est d'implanter la creéation et gestion des objets.
Il est a noter que l'exercice 4 ne dépend que de ce qui a été fait
lors des exercices 1 et 2.
La préparation du lab (votre travail personnel) est à uploader sur la plateforme de elearning:
Lab 2b.
Le code
Talk ci-dessous permet de créer une classe
Point
puis de créer une instance de celle-ci qui sera stockée dans
p.
Point = { x, y }
p = Point(1, 2)
p
On peut remarquer que la création d'une instance se fait en utilisant l'application
de fonction (
APPLY) de la même façon que lorsque l'on appel une fonction.
En effet, pour Talk, une classe est une sorte de fonction qui si on l'appel
joue le rôle de constructeur et d'initialiseur de l'instance créer.
De façon interne, on représentera donc une classe par une classe
Klass
qui hérite de
Function.
Klass.java
La première ligne reviendra donc à créer dans le
Rewriter un objet de
la classe
Klass et à utiliser
LDC pour mettre la classe
sur la pile.
Comme la classe est une fonction, celle-ci doit avoir un code associée
qui permet de créer et d'initialiser une instance.
Par exemple, le code
Talk suivant:
Empty = {}
Empty()
doit appeler une fonction qui crée une instance donc la classe est
Empty.
Le code de cette fonction de construction sera:
LDC $Empty$
NEW_INSTANCE
RET
Donc pour résumer, la syntaxe '{' et '}' permet de créer un objet de type
Klass
et de le mettre sur la pile. La classe
Klass hérite de
Function
ce qui pemet d'effectuer un
APPLY sur un objet de la classe
Klass,
le code de la fonction exécuter lors du
APPLY est un code qui permet
créer une instance de la classe (avec l'instruction
NEW_INSTANCE).
Il est possible dans le langage
Talk assigner une méthode à une classe
en utilisant pour cela une fonction déjà existante, cette dernière devant obligatoirement
avoir au moins 1 paramètre representant l'instance sur laquelle la méthode sera appelée.
Par exemple,
Foo = { v }
foo1 = Foo(3)
fun = |this| [ @v ]
foo1.bar = fun // la function fun est lié à la classe Foo sous le nom bar
foo1.bar() // 3
foo2 = Foo(4)
foo2.bar() // 4
On souhaite exécuter un algorithme de Mark and Compact sur le tas.
Pour faire simple, algorithme se déclenchera lorsque lors d'un
NEW_INSTANCE si le tas n'a pas assez de place pour stocker
le nouvelle objet.
Comme l'algorithme va parcourir le tas et la pile deux fois,
il est intéressant lors de l'écriture de votre programme de
séparer les parcours de ce qui est fait pendant le parcours,
pour ré-utiliser le code d'un parcours à plusieurs endroits.