Kurz: Wie werden Typensysteme im akademischen Kontext kategorisiert? insbesondere, wo kann ich seriöse Quellen finden, die die Unterscheidung zwischen verschiedenen Arten von Typsystemen deutlich machen?
In gewisser Weise liegt die Schwierigkeit bei dieser Frage nicht darin, dass ich keine Antwort finden kann, sondern dass ich zu viele finden kann und keine als richtig hervorsticht. Der Hintergrund ist, dass ich versuche, einen Artikel im Haskell-Wiki zum Thema Tippen zu verbessern , in dem derzeit die folgenden Unterscheidungen gemacht werden:
- Keine Typisierung: Die Sprache hat keine Typisierung oder aus typisierter Sicht: Es gibt genau einen Typ in der Sprache. Assemblersprache hat nur den Typ 'Bitmuster', Rexx und Tk haben nur den Typ 'Text', Kern-MatLab hat nur den Typ 'Matrix mit komplexen Werten'.
- Schwache Typisierung: Es gibt nur wenige unterschiedliche Typen und möglicherweise Synonyme für mehrere Typen. Beispielsweise verwendet C Ganzzahlen für Boolesche Werte, Ganzzahlen, Zeichen, Bitmengen und Aufzählungen.
- Starke Typisierung: Feinkörniger Satz von Typen wie in Ada, Wirthian (Pascal, Modula-2), Eiffel
Dies steht im völligen Widerspruch zu meiner persönlichen Wahrnehmung, die eher so aussah:
- Schwache Typisierung: Objekte haben Typen, werden jedoch implizit in andere Typen konvertiert, wenn der Kontext dies erfordert. Zum Beispiel sind Perl, PHP und JavaScript alle Sprachen, in denen
"1"
mehr oder weniger jeder Kontext verwendet werden1
kann. - Starke Typisierung: Objekte haben Typen und es gibt keine impliziten Konvertierungen (obwohl Überladung verwendet werden kann, um sie zu simulieren). Die Verwendung eines Objekts im falschen Kontext ist daher ein Fehler. In Python löst das Indizieren eines Arrays mit einem String oder Float eine TypeError-Ausnahme aus. In Haskell schlägt die Kompilierung fehl.
Ich habe andere Personen, die mehr Erfahrung auf diesem Gebiet haben als ich, um Meinungen dazu gebeten, und eine hat diese Beschreibung gegeben:
- Schwache Eingabe: Die Ausführung ungültiger Operationen an Daten wird nicht kontrolliert oder abgelehnt, sondern führt lediglich zu ungültigen / willkürlichen Ergebnissen.
- Starke Typisierung: Operationen an Daten sind nur zulässig, wenn die Daten mit der Operation kompatibel sind.
Soweit ich weiß, würde die erste und letzte Charakterisierung C als schwach typisiert bezeichnen, die zweite als stark typisiert. Der erste und der zweite würden Perl und PHP als schwach typisiert bezeichnen, der dritte als stark typisiert. Alle drei würden Python als stark typisiert beschreiben.
Ich denke, die meisten Leute würden mir sagen "Nun, es gibt keinen Konsens, es gibt keine akzeptierte Bedeutung der Begriffe". Wenn die Leute falsch sind, würde ich gerne davon hören, aber wenn sie richtig sind, dann , wie Sie CS Forscher beschreiben und Typsysteme vergleichen? Welche Terminologie kann ich verwenden, die weniger problematisch ist?
Als verwandte Frage habe ich das Gefühl, dass die dynamische / statische Unterscheidung häufig in Bezug auf "Kompilierungszeit" und "Laufzeit" erfolgt, was ich angesichts der Tatsache, dass eine Sprache kompiliert wird oder nicht, nicht so sehr eine Eigenschaft dieser Sprache ist, als unbefriedigend empfinde als ihre Implementierungen. Ich denke, es sollte eine rein semantische Beschreibung von dynamischer versus statischer Typisierung geben. Etwas im Sinne von "Eine statische Sprache ist eine, in die jeder Unterausdruck eingegeben werden kann". Ich würde mich über alle Gedanken, insbesondere Referenzen, freuen, die Klarheit in diesen Begriff bringen.