Typsysteme verhindern Fehler
Typsysteme eliminieren illegale Programme. Betrachten Sie den folgenden Python-Code.
a = 'foo'
b = True
c = a / b
In Python schlägt dieses Programm fehl. es löst eine Ausnahme aus. In einer Sprache wie Java, C # oder Haskell ist dies nicht einmal ein legales Programm. Sie vermeiden diese Fehler vollständig, da sie in den Eingabeprogrammen einfach nicht möglich sind.
Ebenso schließt ein besseres Typsystem mehr Fehler aus. Wenn wir zu hochentwickelten Typsystemen aufsteigen, können wir Folgendes sagen:
Definition divide x (y : {x : integer | x /= 0}) = x / y
Jetzt garantiert das Typensystem, dass es keine Division-durch-0-Fehler gibt.
Welche Art von Fehlern
Im Folgenden finden Sie eine kurze Liste der Fehler, die durch Systeme verhindert werden können
- Fehler außerhalb des Bereichs
- SQL-Injektion
- Verallgemeinert 2, viele Sicherheitsfragen (was Überprüfung taint ist in Perl )
- Fehler außerhalb der Reihenfolge (vergessen, init aufzurufen)
- Erzwingen der Verwendung einer Teilmenge von Werten (z. B. nur Ganzzahlen größer als 0)
Schändliche Kätzchen (Ja, es war ein Witz)
- Präzisionsverlustfehler
- Software Transactional Memory (STM) -Fehler (dies erfordert Reinheit, die auch Typen erfordert)
- Generalisierung 8, Kontrolle der Nebenwirkungen
- Invarianten über Datenstrukturen (ist ein binärer Baum ausgeglichen?)
- Eine Ausnahme vergessen oder die falsche auslösen
Und denken Sie daran, dies ist auch zur Kompilierungszeit . Sie müssen keine Tests mit 100% Codeabdeckung schreiben, um einfach nach Tippfehlern zu suchen. Der Compiler erledigt dies nur für Sie :)
Fallstudie: Typisierte Lambda-Rechnung
Okay, lassen Sie uns das einfachste aller Typsysteme untersuchen, einfach Lambda-Kalkül .
Grundsätzlich gibt es zwei Arten,
Type = Unit | Type -> Type
Und alle Ausdrücke sind entweder Variablen, Lambdas oder Anwendungen. Auf dieser Grundlage können wir beweisen, dass jedes gut typisierte Programm beendet wird. Es gibt nie eine Situation, in der das Programm für immer hängen bleibt oder sich wiederholt. Dies ist im normalen Lambda-Kalkül nicht nachweisbar, da dies nicht der Fall ist.
Denken Sie darüber nach, wir können Typsysteme verwenden, um zu gewährleisten, dass unser Programm nicht für immer wiederholt wird, ziemlich cool, oder?
Abstecher in dynamische Typen
Dynamische Typsysteme können identische Garantien bieten wie statische Typsysteme, jedoch nicht zur Kompilierungszeit, sondern zur Laufzeit. Tatsächlich können Sie seit der Laufzeit mehr Informationen anbieten. Sie verlieren jedoch einige Garantien, insbesondere in Bezug auf statische Eigenschaften wie die Terminierung.
Dynamische Typen schließen also bestimmte Programme nicht aus, sondern leiten fehlerhafte Programme an genau definierte Aktionen weiter, z. B. das Auslösen von Ausnahmen.
TLDR
Das Lange und Kurze ist, dass Typsysteme bestimmte Programme ausschließen. Viele der Programme sind in irgendeiner Weise fehlerhaft, daher vermeiden wir bei Typsystemen diese fehlerhaften Programme.