Warum kann der Compiler nicht selbst den passenden Datentyp (“int”, “float”, …) wählen?

Grundsätzlich unterscheidet man statisch und dynamisch typisierte Sprachen. Bei dynamisch typisierten Sprachen – wie z. B. PHP oder JavaScript – ergibt sich der Datentyp einer Variable zur Laufzeit aus dem Kontext. Der Typ einer Variable kann sich während der Laufzeit des Programms ändern. Im Beispiel bekommt die Variable name initial durch die Zuweisung eines Strings den Typ str. Durch die Zuweisung eines Integers in Zeile 3 bekommt name den Typ int. Der Aufruf einer String-Methode in Zeile 5 führt zu einem Laufzeitfehler.

name = 'Klaus'
print(type(name))   # -> str
name = 123
print(type(name))   # -> int
name = name.upper() # AttributeError: 'int' object has no attribute 'upper'

Bei statisch typisierten Sprachen – wie z. B. Java oder C – wird der Datentyp einer Variable bei der Deklaration durch den Programmierer festgelegt.

Bei statisch typisierten Sprachen kann der Compiler die Typkompatibilität beim Übersetzen prüfen. Dadurch kann man Fehler, die bei dynamisch typisierten Sprachen erst zu Laufzeit auftreten, schon zur Compilezeit erkennen (Zeile 2). Sicherheitskritische Anwendungen sollten daher in einer typisierten Sprache geschrieben werden.

Java:

String name = "Klaus";
name = 123; // Type mismatch: cannot convert from int to String
name.toUpperCase();

Da die Typangabe Teil der Dokumentation ist, erhöht die statische Typisierung die Lesbarkeit des Codes.

Der Vorteil dynamisch typisierter Sprachen ist, dass der Code oft kürzer und kompakter wird.