Variablen-Initialisierung in Triangle

d_glenz
Neuling
Neuling
Beiträge: 6
Registriert: 15. Jul 2011 16:36

Variablen-Initialisierung in Triangle

Beitrag von d_glenz » 18. Feb 2013 12:17

Hallo,

mir ist bei den kleineren Examples im Triangle-Bundle folgender Code aufgefallen (bar.tri):

Code: Alles auswählen

let
  var x : Integer;
  const n ~ 42;
  const m ~ n + 1
in
  x := x + n * m;
Interessanterweise wird in diesem vorgegebenen Progrämmchen keine Variablen-Initialisierung von x vorgenommen. Dem Triangle-Compiler fällt das auch nicht weiter auf.

Was ich mich jetzt frage, ist, wo man die Überprüfung auf fehlende Initialisierung in Triangle durchführt. Wie man nämlich im AST (s. unten) sieht, steht bei ganz normaler Traversierung die Zuweisung (SimpleVname) vor der Auswertung des Ausdrucks. Beim Ausführen wird aber ja x auf der rechten Seite uninitialisiert verwendet.

Kann die kontextuelle Analyse also wissen, ob hier ein Fehler auftritt?
bar.tri.png
bar.tri.png (14.14 KiB) 373 mal betrachtet
Viele Dank für eure Hilfe

tanne
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 162
Registriert: 30. Sep 2008 16:05

Re: Variablen-Initialisierung in Triangle

Beitrag von tanne » 18. Feb 2013 13:09

wenn ich es richtig in erinnerung habe, initialisiert die TAM automatisch mit dem wert 0

d_glenz
Neuling
Neuling
Beiträge: 6
Registriert: 15. Jul 2011 16:36

Re: Variablen-Initialisierung in Triangle

Beitrag von d_glenz » 18. Feb 2013 13:30

Also der disassemblierte Code sieht ja so aus:

Code: Alles auswählen

 0:  PUSH        1
 1:  LOADL       42
 2:  LOADL       1
 3:  CALL        add     
 4:  LOAD  (1)   0[SB]
 5:  LOADL       42
 6:  CALL        add     
 7:  LOAD  (1)   1[SB]
 8:  CALL        mult    
 9:  STORE (1)   0[SB]
10:  POP   (0)   2
11:  HALT  
Und in der Spezifikation von PUSH steht ja: "Push d words (uninitialised) onto the stack", der Speicherbereich wird also nicht durch das Programm auf null gesetzt, sondern höchstens von der TAM.
Mir ist das Ganze nämlich auch nur aufgefallen, als ich die TAM nach Programmabschluss mal habe weiterlaufen lassen. Da ist dann beim zweiten Ausführen dieses Programms ein viel zu hoher Wert herausgekommen.

Soll es den Compiler also gar nicht interessieren, ob die Initialisierung gemacht oder verpennt wird? Führt das nicht zu unvorhersehbarem Verhalten?

Benutzeravatar
mmi1991
Computerversteher
Computerversteher
Beiträge: 349
Registriert: 20. Okt 2011 18:46
Wohnort: Hattersheim

Re: Variablen-Initialisierung in Triangle

Beitrag von mmi1991 » 18. Feb 2013 13:46

Das ist in C doch nicht anders :)
Ophasentutor SoSe 2014, WiSe 2015/16
Alle Angaben wie immer ohne Gewähr

Antworten

Zurück zu „Archiv“