webentwicklung-frage-antwort-db.com.de

Ist der Typ Python sicher?

Laut Wikipedia

Informatiker betrachten eine Sprache als "typsicher", wenn sie keine Operationen oder Konvertierungen zulässt, die gegen die Regeln des Typsystems verstoßen.

Da Python Laufzeitprüfungen sicherstellen, dass Typsystemregeln erfüllt sind, sollten wir Python eine typsichere Sprache in Betracht ziehen.

Dieselbe Aussage machen Jason Orendorff und Jim Blandy in Programming Rust :

Beachten Sie, dass die Sicherheit des Typs unabhängig davon ist, ob eine Sprache die Typen zur Kompilierungszeit oder zur Laufzeit überprüft: C überprüft die Typen zur Kompilierungszeit und ist nicht typensicher. Python prüft zur Laufzeit und ist typsicher.

Sowohl die statische Typprüfung als auch die Typensicherheit sind voneinander getrennt.

Ist das korrekt?

25
user8664060

Viele Programmierer werden statische Typprüfung mit Typensicherheit gleichsetzen:

  • "Sprache A hat statisch Typprüfung und ist somit ist typsicher"
  • "Sprache B hat dynamisch Typprüfung und ist somit nicht typsicher"

Leider ist es nicht so einfach.

In der echten Welt

Zum Beispiel sind C und C++ nicht typsicher, weil Sie das Typsystem mit Typ-Punning untergraben können. Außerdem erlauben die C/C++ - Sprachspezifikationen weitgehend ndefined behaviour (UB) , anstatt Fehler explizit zu behandeln, und dies wurde zur Quelle von Sicherheits-Exploits wie Stack Smashing Exploit und das Format String Attack . Solche Exploits sollten in typsicheren Sprachen nicht möglich sein. Frühe Versionen von Java hatten einen Typfehler mit dem Generics , der bewies, dass es nicht vollständig typsicher war.

Noch heute ist es für Programmiersprachen wie Python, Java, C++, ... schwierig zu zeigen, dass diese Sprachen vollständig typsicher sind, da ein mathematischer Beweis erforderlich ist. Diese Sprachen sind massiv und Compiler/Interpreter haben Fehler, die ständig gemeldet behoben werden.

[ Wikipedia ] Andererseits sind viele Sprachen zu groß für vom Menschen erstellte Sicherheitsnachweise, da sie häufig die Prüfung von Tausenden von Fällen erfordern. .... bestimmte Fehler können zur Laufzeit aufgrund von Fehlern in der Implementierung oder in verknüpften Bibliotheken auftreten, die in anderen Sprachen geschrieben wurden; Solche Fehler können einen bestimmten Implementierungstyp unter bestimmten Umständen unsicher machen.

In der Wissenschaft

Typensicherheit und Typensysteme sind zwar auf die Programmierung in der Praxis anwendbar, haben jedoch ihre Wurzeln und Definitionen aus academia - und somit eine formale Definition dessen, was genau ist "Typensicherheit" ist schwierig - besonders wenn es um echte Programmiersprachen geht, die in der realen Welt verwendet werden. Akademiker definieren mathematisch (formal) gerne winzige Programmiersprachen, die Spielzeugsprachen genannt werden. Nur für diese Sprachen ist es möglich, formal zu zeigen, dass sie typsicher sind (und zu beweisen, dass die Operationen logisch sind korrekt ).

[ Wikipedia ] Typensicherheit ist normalerweise eine Voraussetzung für jede Spielzeugsprache , die in der akademischen Programmiersprachenforschung vorgeschlagen wird

Zum Beispiel hatten Akademiker Mühe, Java ist typsicher, also erstellten sie eine kleinere Version mit dem Namen Featherweight Java und bewiesen in einer Arbeit dass es ist typsicher ist. Ebenso hat dieses Doktorarbeit von Christopher Lyon Anderson eine Teilmenge von Javascript genommen, JS0 genannt und bewiesen, dass es das ist typsicher.

Es wird davon ausgegangen, dass geeignete Sprachen wie Python, Java und C++ nicht vollständig typsicher sind, da sie so umfangreich sind. Es ist so leicht für einen kleinen Käfer, durch die Risse zu schlüpfen, die das Typsystem untergraben würden.

Zusammenfassung

  • Nein python ist wahrscheinlich nicht vollkommen typsicher - niemand hat es bewiesen Es ist zu schwer zu beweisen. Es ist wahrscheinlicher, dass Sie in der Sprache einen winzigen Fehler finden, der zeigt, dass sie nicht typsicher ist.
  • Tatsächlich sind die meisten Programmiersprachen wahrscheinlich nicht vollständig typsicher - alle aus den gleichen Gründen (nur Spielzeugwissenschaftler) diejenigen haben sich als erwiesen)
  • Sie sollten wirklich nicht glauben, dass statisch typisierte Sprachen unbedingt eingeben sicher sind . Sie sind normalerweise sicherer als dynamisch getippte Sprachen, aber zu sagen, dass sie vollständig typsicher sind, ist falsch, da es keinen Beweis dafür gibt.

Referenzen: http://www.pl-enthusiast.net/2014/08/05/type-safety/ und https://en.wikipedia.org/wiki/Type_system

38
James Lawson

Der Wikipedia-Artikel assoziiert typsicher mit speichersicher, was bedeutet, dass nicht auf denselben Speicherbereich zugegriffen werden kann, wie z. Ganzzahl und Zeichenfolge. Auf diese Weise ist Python typsicher. Sie können den Typ eines Objekts nicht implizit ändern.

9
Daniel

Da es noch niemand gesagt hat, ist es auch erwähnenswert, dass Python eine stark typisierte Sprache ist, mit der nicht zu verwechseln ist dynamisch getippt. Python verschiebt die Typprüfung bis zum letzten möglichen Moment und führt normalerweise dazu, dass eine Ausnahme ausgelöst wird. Dies erklärt das Verhalten, das Mureinik erwähnt. Abgesehen davon führt Python auch häufig eine automatische Konvertierung durch. Das heißt, es wird beispielsweise versucht, ein int in ein float für eine arithmetische Operation umzuwandeln.

Sie können die Typensicherheit in Ihren Programmen manuell erzwingen, indem Sie die Eingabetypen überprüfen. Da alles ein Objekt ist, können Sie jederzeit Klassen erstellen, die von Basisklassen abgeleitet sind, und den Typ mit der Funktion isinstance überprüfen (natürlich zur Laufzeit). Python 3 hat Typhinweise hinzugefügt, dies wird jedoch nicht erzwungen. Und mypy hat der Sprache eine statische Typprüfung hinzugefügt, wenn Sie sie verwenden möchten, dies garantiert jedoch nicht die Typensicherheit.

7
VoNWooDSoN

In Python wird ein Laufzeitfehler angezeigt, wenn Sie eine Variable vom falschen Typ im falschen Kontext verwenden. Z.B.:

>>> 'a' + 1

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

Da diese Prüfung nur in Runtime und nicht vor dem Ausführen des Programms erfolgt, ist Python keine typsichere Sprache ( PEP-484 = ungeachtet).

3
Mureinik