Bei statisch typisierten Sprachen müssen Sie im Allgemeinen die Variablentypen deklarieren, die dann beim Kompilieren überprüft werden, um Fehler zu reduzieren. Das Wort "statisch" in "statisch typisiert" bezieht sich auf "statische Code-Analyse", bei der der Code vor seiner Ausführung untersucht wird. Obwohl es für eine statisch typisierte Sprache möglich ist, den Typ der Variablen von der rechten Seite eines Ausdrucks oder von tatsächlichen Parametern abzuleiten, erfordern die meisten statisch typisierten Sprachen in der Praxis die explizite Deklaration von Variablentypen.
Dynamisch typisierte Sprachen erfordern im Allgemeinen keine Variablendeklarationen, um Typen zu haben, und sie leiten Variablentypen basierend auf dem Typ ab, der als Ergebnis der Auswertung der rechten Seite jeder Zuweisungsanweisung oder der tatsächlichen Parameter für einen Funktionsaufruf berechnet wurde. Da der Variablen im Laufe ihrer Lebensdauer mehrere Zuweisungen zugewiesen werden können, kann sich ihr Typ im Laufe der Zeit ändern. Aus diesem Grund wird sie als "dynamisch typisiert" bezeichnet. Außerdem muss die Laufzeitumgebung den aktuellen Typ für jede Variable verfolgen, sodass der Typ eher an den Wert als an die Variablendeklaration gebunden ist. Dies kann als RTTI-System (Runtime Type Information) betrachtet werden.
Elemente statisch und dynamisch typisierter Sprachen können kombiniert werden. Beispielsweise unterstützt C # sowohl statisch als auch dynamisch typisierte Variablen, und objektorientierte Sprachen unterstützen im Allgemeinen das Herabsetzen der Typhierarchie. Statisch typisierte Sprachen bieten normalerweise verschiedene Möglichkeiten, um die Typprüfung zu umgehen, z. B. durch Casting, Reflektion und dynamischen Aufruf.
Starke vs. schwache Typisierung bezieht sich auf ein Kontinuum dessen, wie sehr die Sprache versucht, Fehler zu verhindern, weil eine Variable verwendet wird, als wäre es ein Typ, obwohl es sich tatsächlich um einen anderen Typ handelt. Zum Beispiel sind sowohl C als auch Java statisch typisierte Sprachen, Java verwendet jedoch eine viel stärkere Typprüfung als C. Der folgende C-Code kompiliert und führt gerne aus und fügt zur Laufzeit einen zufälligen Wert in die Variable b ein, was höchstwahrscheinlich a verursacht Fehler:
char *a = "123";
int b = (int)a;
Der entsprechende Java-Code erzeugt einen Kompilierungsfehler, der im Allgemeinen vorzuziehen ist:
String a = "123"
int b = (int)a;