2017-01-29 3 views
0

glaube, ich habe eine Algol-ähnliche Sprache, mit statischen Typen und den folgenden Code:statischen Typen und Umbauten

a := b + c * d; 

wo a ist ein Schwimmer, b eine ganze Zahl, c ein Doppel- und d eine lange . Dann wandelt die Sprache d in lang, um mit c zu arbeiten, und b verdoppelt, um mit c*d Ergebnis zu arbeiten. Danach wird das doppelte Ergebnis von b+c*d in Float konvertiert, um das Ergebnis a zuzuordnen. Aber, wenn es passiert? Ich meine, erfolgen alle Konvertierungen zur Laufzeit oder zur Kompilierzeit?

Und wenn ich:

int x; //READ FROM USER KEYBOARD. 
if (x > 5) { 
    a:= b + c * d; 
} 
else { 
    a := b + c; 
} 

Der obige Code conditionals hat. Wenn der Compiler dies zur Kompilierzeit konvertiert, kann ein Teil möglicherweise nie ausgeführt werden. Ist das richtig?

Antwort

1

Sie können keine Konvertierung zur Kompilierzeit durchführen, genauso wenig wie eine Addition zur Kompilierzeit (es sei denn, der Compiler kann den Wert der Variablen ermitteln, vielleicht weil er tatsächlich konstant ist).

Der Compiler kann (und tut) ein Programm mit Anweisungen ausgeben, die den Wert von Variablen addieren und multiplizieren. Es gibt auch Anweisungen aus, die den Typ eines gespeicherten Werts vor der Berechnung in einen anderen Typ umwandeln, falls dies erforderlich ist.

Sprachen, die zur Kompilierungszeit keine Variablentypen haben, müssen zur Laufzeit Tests durchführen und Werte in verschiedene Typen konditionieren. Aber ich glaube nicht, dass dies bei einer der in der allgemeinen Kategorie "Algol-like" enthaltenen Sprachen der Fall ist.

+0

Aber der Compiler kennt die Variablentypen, ist es wichtig, den Wert in der Variablen? –

+1

@ TomiSebastiánJuárez: Der Compiler kann * einen Code ausgeben, der die Umwandlung durchführt, weil er weiß, was der Variablentyp ist. Aber es kann * die Umwandlung * nicht ausführen, außer es kennt auch den Wert in der Variable. Es unterscheidet sich nicht von "a + a". Wenn der Compiler wüsste, dass der Wert in "a" "2" ist, könnte er die Addition durchführen und den Ausdruck durch "4" ersetzen. Ansonsten kann es nur Code ausgeben, um die Addition durchzuführen. – rici

+0

Sehr klar. Vielen Dank –