JavaCompilerCore/notizen/bajo1/Theoretische_Erkenntnisse.txt
2014-02-04 17:44:03 +01:00

46 lines
2.1 KiB
Plaintext
Executable File

TRProg:
=======
In TRProg werden zunächst die unterschiedlichen Mengen von Typannahmen zusammengebaut.
V_fields_methods:
Die Typannahmen aller Membervariablen und aller Methoden (Parametertypen und Rückgabetyp)
V_1 bis V_n:
Die Typannahmen aller Parameter einer Methode V_i als Typannahmen für lokale Variablen.
Danach wird TRStart gerufen, dessen Rückgabewert eine Menge von 2-Tupeln aus Unifiern und
Mengen von Typannahmen ist. Diese Tupel müssen eventuell noch über einen Intersection-Typ
strukturiert werden, bilden aber prinzipiell das Ergebnis des Typrekonstruktionsalgorithmus:
Alle möglichen Typkombinationen für diese Klasse in Form von unterschiedlichen Typannahmemengen.
TRStart:
========
TRStart bekommt als Argumente n TypeAssumptionSets V_n für jede der n Methoden eine.
Für jede der n Methoden wird TRNext aufgerufen, der m Triples (sigma_j, ty_j, V_j) zurück gibt.
D.h. m mögliche Typkombinationen für diese eine Methode.
Für jede der m Möglichkeiten wird daraufhin eine Menge von möglichen Unifier für den ReturnType berechnet.
Dann wird auf jedes V_j der m Möglichkeiten alle zugehörigen Unifier unify element unify_j angewendet
und eine Menge von Tupeln (sigma_z, V_z) gebildet. Diese Mengen von Tupeln aller V_j werden zu einer
Ergebnismenge vereinigt.
Dieser ganze Ablauf passiert für jede der m Methode n Mal, wobei die Erkenntnisse der vorher gehenden
Durchläufe immer als Eingabewert für den nächste Durchlauf dienen.
Nach dem letzten Durchlauf wird die Ergebnismenge von Tupeln (sigma, V) von TRStart zurückgegeben.
TRNext:
=======
TRNext hat im Prinzip die Aufgabe, die bisherigen Teilergebnisse in Form von Typannahmen um weitere
Informationen aus der aktuellen Methode zu erweitern.
Dabei werden für alle n V_i der übergebenen Tupel (sigma, V) TRStatement des Blocks der aktuellen Methode
aufgerufen. Zuvor werden aus dem jeweiligen V_i noch die Typannahmen für die Parameter der letzten Methode
(als lokale Variable) entfernt und um die Typannahmen der neuen Parameter (als lokale Variablen) erweitert.
Dabei werden die bisher ermittelten Unifier berücksichtigt, d.h. entsprechende Substitutionen gleich durchgeführt.