Frage

Kurz gesagt: Wie werden Typsysteme in akademischen Kontexten kategorisiert? Insbesondere wo kann ich seriöse Quellen finden, die die Unterscheidung zwischen verschiedenen Arten von Typsystemen klar machen?

In gewissem Sinne ist die Schwierigkeit mit dieser Frage nicht, dass ich keine Antwort finden kann, sondern dass ich zu viele finden kann und keiner als korrekt auffällt. Der Hintergrund ist, dass ich versuche, einen Artikel über das Haskell -Wiki zu verbessern Typisierung, was derzeit die folgenden Unterscheidungen beansprucht:

  • KEIN TIPPER: Die Sprache hat keinen Vorstellung von Typen oder aus typisierter Perspektive: Es gibt genau einen Typ in der Sprache. Die Assembly-Sprache hat nur den Typ 'Bit Muster', Rexx und TK haben nur den Typ 'Text', Core MATLAB hat nur den Typ 'komplexer Matrix'.
  • Schwaches Tippen: Es gibt nur wenige angesehene Typen und möglicherweise Synonyme für verschiedene Typen. EG C verwendet ganzzahlige Zahlen für Booleane, Zahlen, Zeichen, Bit -Sets und Aufzählungen.
  • Starke Typisierung: feinkörnige Reihe von Typen wie in ADA, Wirthische Sprachen (Pascal, Modula-2), Eiffel

Dies widerspricht meiner persönlichen Wahrnehmung, was mehr im Sinne von:

  • Schwache Typisierung: Objekte haben Typen, werden jedoch implizit in andere Typen konvertiert, wenn der Kontext dies verlangt. Zum Beispiel sind Perl, PHP und JavaScript alle Sprachen, in denen "1" kann in mehr oder weniger in jedem Kontext verwendet werden, der 1 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 die Indizierung eines Arrays mit einer Zeichenfolge oder einem Float eine Typeerror -Ausnahme aus. In Haskell wird es zur Kompilierungszeit scheitern.

Ich fragte um Meinungen zu anderen Menschen, die auf dem Gebiet mehr erfahrene als ich bin, und eine gab diese Charakterisierung:

  • Schwache Typisierung: Durch die Durchführung von Ungültigen Operationen für Daten wird nicht kontrolliert oder abgelehnt, liefert jedoch lediglich ungültige/beliebige Ergebnisse.
  • Starke Typisierung: Operationen auf Daten sind nur zulässig, wenn die Daten mit dem Betrieb kompatibel sind.

So wie ich es verstehe, würde die erste und letzte Charakterisierung C schwach typisch nennen, die zweite würde es stark typisch nennen. Der erste und zweite würde Perl und PHP schwach typisch nennen, der dritte würde sie stark bezeichnen. Alle drei würden Python als stark typisch beschreiben.

Ich denke, die meisten Leute würden mir sagen: "Nun, es gibt keinen Konsens, es gibt keine akzeptierte Bedeutung der Begriffe." Wenn diese Leute falsch liegen, würde ich mich freuen, davon zu hören, aber wenn sie Recht haben, wie dann wie dann wie dann wie tun CS -Forscher beschreiben und vergleichen Typsysteme? Welche Terminologie kann ich verwenden, die weniger problematisch ist?

Als verwandte Frage bin ich der Meinung, dass die dynamische/statische Unterscheidung häufig in Bezug auf "Kompilierungszeit" und "Laufzeit" gegeben wird, die ich nicht zufriedenstellend finde, da eine Sprache nicht so sehr eine Eigenschaft dieser Sprache ist oder nicht als Implementierungen. Ich denke, es sollte eine rein semantische Beschreibung der dynamischen und statischen Typisierung geben. Etwas nach "einer statischen Sprache" ist eine, in der jede Unterexpression tippt werden kann ". Ich würde mich über Gedanken freuen, insbesondere Referenzen, die diese Vorstellung Klarheit bringen.

War es hilfreich?

Lösung

In der Vergangenheit wurde der Begriff "stark typisierte Programmiersprache" in den 70ern als Reaktion auf die vorhandenen weit verbreiteten Programmiersprachen verwendet, von denen die meisten Typlöcher hatten. Einige Beispiele:

  • In Forran gab es Dinge, die als "gemeinsame" Speicherbereiche bezeichnet wurden, die über Module hinweg geteilt werden konnten. Es gab jedoch keine Überprüfungen, um festzustellen, ob jedes Modul den Inhalt der gemeinsamen Speicherung mit denselben Typen erklärt. Ein Modul könnte also erklären, dass ein bestimmter gemeinsamer Speicherblock eine Ganzzahl und eine andere eine schwimmende Punktzahl hatte und die Daten dadurch beschädigt werden würden. Fortran hatte auch "Äquivalenz" -Anweisungen, wobei der gleiche Speicher für zwei verschiedene Objekte verschiedener Typen deklariert werden konnte.

  • In Algol 60 wurde die Art der Prozedurparameter als "Verfahren" deklariert, ohne die Arten der Parameter des Verfahrens anzugeben. Man könnte also annehmen, dass ein Verfahrensparameter ein ganzzahliger Verfahren war, aber als Argument in ein realakzeptantes Verfahren bestanden hat. Dies würde zu der gleichen Art von Korruption wie die gemeinsamen und gleichwertigen Aussagen führen. (Algol 60 hat jedoch die älteren Probleme beseitigt.)

  • In Pascal wurden "Variantenrekorde" hinzugefügt, die fast genau wie bei den alten Äquivalenzerklärungen waren.

  • In C wurden "Typ -Gips" hinzugefügt, wobei jede Art von Daten als Daten eines anderen Typs neu interpretiert werden konnte. Dies war ein ziemlich absichtliches Typloch für Programmierer, die angeblich wissen, was sie tun.

Die in den 70er Jahren entworfenen stark typisierten Sprachen sollten alle diese Typlöcher beseitigen. Wenn Sie in das einbohren, was dies bedeutet, bedeutet dies im Wesentlichen, dass Datenpräsentationen geschützt sind. Es ist nicht möglich, das Datenobjekt eines Typs als Objekt eines anderen Typs anzuzeigen, das zufällig das gleiche Bitmuster wie seine interne Darstellung aufweist. Theoretiker begannen, den Begriff "Darstellung der Unabhängigkeit" zu verwenden, um diese Eigenschaft anstelle der vagen Idee der "starken Typisierung" zu charakterisieren.

Beachten Sie, dass dynamisch getippte Sprachen wie LISP, die eine vollständige Überprüfung des Laufzeittyps durchführen, im Sinne des Schutzes von Darstellungen "stark eingegeben" werden. Gleichzeitig würden statisch typisierte Sprachen die Unabhängigkeit der Darstellung verlieren, es sei denn, sie würden Array -Grenzen überprüfen. Sie werden also im strengen Sinne des Begriffs nicht "stark tippt". Aufgrund dieser anomalen Konsequenzen fiel der Begriff "stark tippt" nach den 70ern in nicht genutzt. Als das US -Verteidigungsministerium strenge Anforderungen für das Design von ADA entwickelte, enthielt sie die Anforderung, dass die Sprache "stark tippt" werden sollte. (Es scheint zu dieser Zeit zu glauben, dass die Idee von "stark typisiert" selbstverständlich war. Es wurde keine Definition angeboten.) Alle als Antwort eingereichten Sprachvorschläge, die als "stark tippt" gaben. Als Dijkstra alle Sprachvorschläge analysierte, stellte er fest, dass keiner von ihnen stark tippt wurde und tatsächlich nicht einmal klar war, was der Begriff bedeutete. Siehe den Bericht EWD663. Ich sehe jedoch, dass der Begriff jetzt durch eine jüngere Generation von Forschern, die die karierte Geschichte des Begriffs nicht kennen.

Der Begriff "statisch typisiert" bedeutet, dass alle Typen überprüft werden und zur Laufzeit keine Typfehler auftreten. Wenn die Sprache auch stark tippt wird, bedeutet dies, dass es wirklich gibt Keine Typfehler während der Ausführung. Wenn andererseits Typlöcher im Typsystem enthält, bedeutet das Fehlen von Fehlern von Laufzeit Typ nichts. Die Ergebnisse könnten vollständig korrupt sein.

In der neuen Debatte über "starke vs schwache Typisierung" scheint es, ob bestimmte Typumbauten zulässig sein sollten. Eine Schnur zuzulassen, in der eine Ganzzahl benötigt wird, ist laut diesen Leuten eine "schwache Eingabe". Das ist ein Sinn, weil der Versuch, eine Zeichenfolge in eine Ganzzahl umzuwandeln, möglicherweise fehlschlägt, wenn die Zeichenfolge keine Ganzzahl darstellt. Das Umwandeln einer Ganzzahl in eine Zeichenfolge hat dieses Problem nicht. Wäre das ein Beispiel für "schwaches Tippen" nach Angaben dieser Leute? Ich habe keine Ahnung. Ich stelle fest, dass die Wikipedia -Diskussionen über "schwaches Typing" keine schiedsrichenen Veröffentlichungen zitieren. Ich glaube nicht, dass es eine kohärente Idee ist.

Hinweis hinzugefügt: Der Grundpunkt ist, dass der Begriff "starke Typisierung" nicht als technischer Begriff mit einer strengen Definition verwendet wurde. Es war eher wie einige Sprachdesigner: "Unser Typsystem ist stark; es fängt alle Typfehler auf; es hat keine Typlöcher" und als sie ihr Sprachdesign veröffentlichten, behaupteten sie, es sei "stark tippt", dass es "stark getippt" wurde. . Es war ein Summenwort, das gut klang und die Leute begannen es zu benutzen. Das Cardelli-Wegner-Papier war das erste, das ich gesehen habe, wo einige Analysen zu dem bereitgestellt wurden, was es bedeutet. Mein Beitrag hier sollte als Ausarbeitung ihrer Position betrachtet werden.

Andere Tipps

Das Papier Uday Reddy fand in seiner Antwort, Zum Verständnis von Typen, Datenabstraktion und Polymorphismus (1985) gibt die folgenden Antworten:

Programmiersprachen, in denen der Typ jedes Ausdrucks durch statische Programmanalyse bestimmt werden kann, wird als statisch typisiert. Die statische Typisierung ist eine nützliche Eigenschaft, aber die Anforderung, dass alle Variablen und Ausdrücke zur Kompilierungszeit an einen Typ gebunden sind, ist manchmal zu restriktiv. Es kann durch die schwächere Anforderung ersetzt werden, dass alle Ausdrücke garantiert konsistent sind, obwohl der Typ selbst statisch unbekannt ist. Dies kann im Allgemeinen durchgeführt werden, indem einige Überprüfungen zum Laufzeittyp eingeführt werden. Sprachen, in denen alle Ausdrücke konsistent sind, werden als stark typisierte Sprachen bezeichnet. Wenn eine Sprache stark eingegeben wird, kann ihr Compiler garantieren, dass die von ihr akzeptierten Programme ohne Typfehler ausgeführt werden. Im Allgemeinen sollten wir uns nach einer starken Typisierung bemühen und nach Möglichkeit eine statische Typisierung anwenden. Beachten Sie, dass jede statisch typisierte Sprache stark typisiert ist, das Gegenteil jedoch nicht unbedingt wahr ist.

Autoritative Antworten finden Sie in Cardelli und Wegners Umfrageartikel: Zum Verständnis von Typen, Datenabstraktion und Polymorphismus.

Wohlgemerkt, obwohl "starkes Tippen" eine akzeptierte Bedeutung hat, ist das "schwache Tippen" nicht. Ein Versagen der starken Typisierung kann als schwach angesehen werden, und die Menschen können unterschiedlich sein, welche Art von Misserfolg akzeptabel ist und was nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit cs.stackexchange
scroll top