Starke und schwache Typisierung

Im Computerprogrammierung, eine der vielen Möglichkeiten, die Programmiersprachen werden umgangssprachlich klassifiziert, ob die Sprache der Sprache Typ System macht es stark tippt oder schwach tippt (lose tippt). Es gibt jedoch keine genaue technische Definition dessen, was die Begriffe bedeuten, und verschiedene Autoren sind sich nicht über die implizite Bedeutung der Begriffe und die relativen Ranglisten der "Stärke" der Typsysteme der Mainstream -Programmiersprachen einig.

Im Allgemeinen hat eine stark typisierte Sprache strengere Schreibregeln bei Zeit kompilieren, was impliziert, dass Fehler und Ausnahmen bei der Zusammenstellung eher auftreten. Die meisten dieser Regeln wirken sich auf die variable Zuordnung, Funktionsrückgabewerte, Verfahrensargumente und Funktionen auf. Dynamisch getippt Sprachen (wo Geben Sie die Überprüfung ein passiert bei Laufzeit) kann auch stark tippt werden. Beachten Sie, dass Werte in dynamisch getippten Sprachen Typen und keine Variablen haben.

Eine schwach typisierte Sprache hat lockerere Typisierungsregeln und kann unvorhersehbare oder sogar fehlerhafte Ergebnisse erzielen oder kann zur Laufzeit implizite Typkonvertierung durchführen.[1] Befürworter von dynamisch typisierten (im Allgemeinen "schwach typisierten) Sprachen finden solche Bedenken übertrieben und glauben, dass die statische Typisierung tatsächlich eine exponentiell größere Reihe von Problemen und Ineffizienzen einführt.[2] Ein anderes, aber verwandtes Konzept ist latente Typisierung.

Geschichte

1974,, Liskov und S. zilles definierte eine stark typische Sprache als eine als eine, in der "wenn ein Objekt von einer Aufruffunktion zu einer genannten Funktion übergeben wird, muss sein Typ mit dem in der genannten Funktion deklarierten Typ kompatibel sein."[3] 1977 schrieb K. Jackson: "In einer stark typisierten Sprache hat jeder Datenbereich einen bestimmten Typ und jeder Prozess wird seine Kommunikationsanforderungen in Bezug auf diese Typen angegeben."[4]

Definitionen von "stark" oder "schwach"

Eine Reihe verschiedener Sprachentwurfsentscheidungen wurde als Beweis für eine "starke" oder "schwache" Typisierung bezeichnet. Viele davon werden genauer als das Vorhandensein oder Abwesenheit von verstanden Geben Sie Sicherheit ein, Speichersicherheit, Statische Typ-Überprüfung, oder Dynamische Typ-Überprüfung.

"Starkes Typing" bezieht sich im Allgemeinen auf die Verwendung von Programmiersprachentypen, um beide Invarianten des Codes zu erfassen und seine Richtigkeit zu gewährleisten und bestimmte Klassen von Programmierfehlern definitiv auszuschließen. Daher gibt es viele "starke" typisierende "Disziplinen, mit denen diese Ziele erreicht sind.

Implizite Typkonvertierungen und "Typ Punning"

Einige Programmiersprachen machen es einfach, einen Wert eines Typs zu verwenden, als wäre es ein Wert eines anderen Typs. Dies wird manchmal als "schwaches Typisieren" beschrieben.

Zum Beispiel beobachtet Aahz Maruch das "Zwang tritt auf, wenn Sie eine haben statisch typisiert Sprache und Sie verwenden die syntaktischen Merkmale der Sprache, um die Verwendung eines Typs so zu erzwingen, als wäre es ein anderer Typ (betrachten Sie die gemeinsame Verwendung von Hohlraum* in C). Zwang ist normalerweise ein Symptom für eine schwache Typisierung. Die Konvertierung dagegen schafft ein brandneues Objekt des entsprechenden Typs. "[5]

Als ein weiteres Beispiel, GCC beschreibt dies als Typ-Punning und warnt, dass es streng brechen wird Aliasing. Thiago Macieira diskutiert verschiedene Probleme Compiler unangemessen machen Optimierungen.[6]

Es gibt viele Beispiele für Sprachen, die es zulassen implizite Typkonvertierungen, aber auf Typ-Sicherheit. Zum Beispiel ermöglichen sowohl C ++ als auch C# Programmen, die Operatoren zu definieren, um einen Wert von einem Typ in einen anderen mit gut definierter Semantik zu konvertieren. Wenn ein C ++ - Compiler auf eine solche Konvertierung trifft, behandelt er den Vorgang wie ein Funktionsaufruf. Im Gegensatz dazu konvertieren Sie einen Wert in den C -Typ Leere* ist eine unsichere Operation, die für den Compiler unsichtbar ist.

Zeiger

Einige Programmiersprachen enthüllen Zeiger Als wären sie numerische Werte und ermöglichen es den Benutzern, eine Arithmetik auszuführen. Diese Sprachen werden manchmal als "schwach typisiert" bezeichnet, da Zeigerarithmetik verwendet werden kann, um das Typ der Sprache zu umgehen.

Untagte Gewerkschaften

Einige Programmiersprachen unterstützen Untagte Gewerkschaften, die es ermöglichen, einen Wert eines Typs zu betrachten, als wäre es ein Wert eines anderen Typs.

Statische Typ-Überprüfung

Im Luca Cardelli's Artikel Typful -Programmierung,[7] Ein "starkes Typensystem" wird als eine beschrieben, bei der keine Möglichkeit eines ungeprüften Fehlers des Laufzeittyps besteht. In anderen Schreiben wird das Fehlen ungeprüfter Laufzeitfehler als als bezeichnet als Sicherheit oder Geben Sie Sicherheit ein; Tony HoareFrühe Papiere nennen diese Eigenschaft Sicherheit.[8]

Dynamische Typ-Überprüfung

Einige Programmiersprachen haben keine statische Typ-Überprüfung. In vielen solchen Sprachen ist es einfach, Programme zu schreiben, die von den meisten statischen Typ-Prüfern abgelehnt werden. Beispielsweise kann eine Variable entweder eine Zahl oder den Booleschen Wert "Falsch" speichern.

Variation zwischen den Programmiersprachen

Beachten Sie, dass einige dieser Definitionen widersprüchlich sind, andere lediglich konzeptionell unabhängig sind und andere Sonderfälle (mit zusätzlichen Einschränkungen) anderer "liberaler" (weniger starker) Definitionen sind. Aufgrund der großen Abweichung zwischen diesen Definitionen ist es möglich, Behauptungen über die meisten Programmiersprachen zu verteidigen, dass sie entweder stark oder schwach typisiert sind. Zum Beispiel:

  • Java, Pascal, Ada und C alle benötigen Variablen einen deklarierten Typ zu haben und die Verwendung explizite Abgüsse von arithmetischen Werten für andere arithmetische Typen zu unterstützen. Java, C#, ADA und Pascal sollen manchmal stärker tippt als C, eine Behauptung, die wahrscheinlich auf der Tatsache beruht, dass C mehr Arten von impliziten Conversions unterstützt, und C erlaubt auch C. Zeiger Werte werden explizit gegossen, während Java und Pascal dies nicht tun. Java selbst kann als stärker als pascal angesehen werden, da die Methoden zur Ausweitung des statischen Typens in Java von der gesteuert werden Java virtuelle MaschineTypsystem. C# und VB.NET ähneln Java in dieser Hinsicht, obwohl sie die Deaktivierung der dynamischen Typprüfung ermöglichen, indem sie explizit Codesegmente in einen "unsicheren Kontext" einfügen. Das Typ -System von Pascal wurde als "zu stark" beschrieben, da die Größe eines Arrays oder einer Zeichenfolge Teil seines Typs ist und einige Programmieraufgaben sehr schwierig machen.[9][10]
  • Smalltalk, Perl, Rubin, Python, und Selbst sind alle "stark tippt" in dem Sinne, dass Tippfehler zur Laufzeit verhindert werden und sie wenig implizit tun Typumwandlung TypAber diese Sprachen nutzen die statische Typprüfung nicht: Der Compiler überprüft oder setzt die Regeln der Typenbeschränkungen nicht durch. Der Begriff Ententypisierung wird jetzt verwendet, um die zu beschreiben Dynamisches Typing Paradigma, das von den Sprachen in dieser Gruppe verwendet wird.
  • Das Lispeln Sprachenfamilie werden alle in dem Sinne "stark tippt", dass Tippfehler zur Laufzeit verhindert werden. Einige Lisp -Dialekte mögen Common Lisp oder Clojure Unterstützen Sie verschiedene Formen von Typdeklarationen[11] und einige Compiler (Cmucl[12] und verwandte) diese Erklärungen zusammen mit verwenden Geben Sie Inferenz ein Um verschiedene Optimierungen und auch begrenzte Formen von Kompilierungszeittypprüfungen zu ermöglichen.
  • Standard ml, F#, Ocaml, Haskell, gehen und Rost werden statisch überprüft, aber der Compiler färbt automatisch einen genauen Typ für die meisten Werte.
  • Montagesprache und Weiter kann charakterisiert werden als ungetarn. Es gibt keine Typüberprüfung; Es liegt an dem Programmierer, sicherzustellen, dass Daten, die an Funktionen gegeben wurden, vom entsprechenden Typ sind. Alle erforderlichen Konvertierungen sind explizit.

Aus diesem Grund meiden Schriftsteller, die eindeutig über Typsysteme schreiben möchten, häufig den Begriff "starke Typisierung" zugunsten spezifischer Ausdrücke wie "wie" wie "wie" wie "z."Geben Sie Sicherheit ein".

Siehe auch

Verweise

  1. ^ "CS1130. Übergang zur OO-Programmierung.-Frühjahr 2012-Selbsterversion". Cornell University, Abteilung für Informatik. 2005. archiviert von das Original auf 2005. Abgerufen 2015-11-23.
  2. ^ "Die unangemessene Wirksamkeit der dynamischen Typisierung für praktische Programme". Vimeo. 12. September 2013. Abgerufen 21. März, 2021.{{}}: CS1 Wartung: URL-Status (Link)
  3. ^ Liskov, b; Zilles, S (1974). "Programmierung mit abstrakten Datentypen". ACM Sigplan nennt. 9 (4): 50–59. Citeseerx 10.1.1.136.3043. doi:10.1145/942572.807045.
  4. ^ Jackson, K. (1977). Parallele Verarbeitung und modulare Softwarekonstruktion. Design und Implementierung von Programmiersprachen. Vorlesungsnotizen in Informatik. Vol. 54. S. 436–443. doi:10.1007/bfb0021435. ISBN 3-540-08360-x.
  5. ^ Aahz. "Typing: stark gegen schwach, statisch und dynamisch". Abgerufen 16. August 2015.
  6. ^ "Typ-Punning und Strict-Aliasing-QT-Blog". QT Blog. Abgerufen 18. Februar 2020.
  7. ^ Luca Cardelli, "Typful Programming"
  8. ^ Hoare, C. A. R. 1974. Hinweise zum Programmiersprache Design. Im Computersysteme Zuverlässigkeit, ed. C. Bunyan. Vol. 20 S. 505–534.
  9. ^ InfoWorld. 1983-04-25. Abgerufen 16. August 2015.
  10. ^ Kernighan, Brian (1981). "Warum Pascal nicht meine Lieblingsprogrammiersprache ist". Archiviert von das Original Am 2012-04-06. Abgerufen 2011-10-22.
  11. ^ "CLHS: Kapitel 4". Abgerufen 16. August 2015.
  12. ^ "CMUCL -Benutzerhandbuch: Der Compiler". Archiviert von das Original am 8. März 2016. Abgerufen 16. August 2015.