Frage

Ich sehe oft Behauptungen, dass moderne funktionale Sprachen ausschließlich „sicherer“ sind als andere. Diese Aussage stellte sich hauptsächlich mit Typsystemen und ihrer Fähigkeit aus, die folgenden Fallstrickquellen explizit auszudrücken:

  • Alternativen in der Funktionsergebnis. Vielleicht und entweder DataTypes im Vergleich zu Ausnahmen und Nullbekehlern in C ++-wie Sprachen.
  • Zugang zu veränderlichem Zustand (möglicherweise inkonsistentes Verhalten im Laufe der Zeit). Status DataType in Haskell vs. Variablen in C ++-wie Sprachen.
  • IO durchführen. IO-Datenatyp in Haskell vs. einfach Dinge in C ++-wie Sprachen.

Haskell Compiler ist in der Lage, den Programmierer zu warnen, wenn er mit diesen Arten riskante Operationen nicht ordnungsgemäß behandelt.

Obwohl die obigen Fallstricke oben definitiv die häufigsten sind, kann ich zum Beispiel viel mehr sehen:

  • Unerwarteter Ressourcenverbrauch. Gedächtnis oder CPU, erstere ist für Haskell Afaik üblich.
  • Ausfall auf Systemebene. Wie Absturzprozess oder gezogener Stecker.
  • Unerwartete Ausführungszeit für IO, Zeitverletzung.

Gibt es Sprachen, Bibliotheken oder zumindest Modelle, die es ermöglichen, Risiken aus dem zweiten Satz auszudrücken und eine Warnung zu ergeben, wenn sie nicht behandelt werden?

War es hilfreich?

Lösung

Unterstrukturarten ( http://en.wikipedia.org/wiki/substructural_type_system ) kann verwendet werden, um eine Version von jedem von diesen bereitzustellen. Als Zusammenfassung steuern die normalen Typen, obwohl etwas verwendet werden kann, die substrukturellen Typen weiter steuern, wenn oder wie oft es verwendet werden kann.

  • Affine-Typen können verwendet werden, um Sprachen zu konstruieren, die alle und nur Polynom-Zeit-Funktionen ausdrücken können. http://www.cs.cmu.edu/~fp/courses/15816-s12/misc/aehlig02tocl.pdf

  • Lineare Typen können diesen Speicher durchsetzen, wenn Variablen aus dem Zielfernrohr ausgehen und eine Art "statische Müllsammlung" ermöglicht. In ähnlicher Weise können geordnete Typen verwendet werden, um zu erfordern, dass Variablen in einer LIFO-Reihenfolge verwendet werden, sodass sie stapelgestützt werden können. Regionen ( http://en.wikipedia.org/wiki/region-basiert_Memory_Management ) sind auch hier nützlich. Das erste Kapitel mit fortgeschrittenen Themen in Typen und Programmiersprachen bietet eine gute Einführung in die Verwendung linearer und geordneter Typen für diesen Zweck.

  • Affine-Typen ermöglichen auch eine milestatorientierte Programmierung ( http://www.cs.cmu.edu/~aldrich/papers/onward2009-state.pdf ). Das SPOTESTATE wird verwendet, um bestimmte Bestellung in APIs durchzusetzen (z. B. nicht aus einer geschlossenen Datei), kann aber auch zur Durchsetzung von Sicherheitseigenschaften verwendet werden. Wenn Sie einen Block erfordern, der einen Fehler behandelt, kann dies so codiert werden, dass eine Funktion erforderlich ist, die ein Objekt von einem Fehlerzustand in einen Wiederherstellungszustand übergeht.

Andere Tipps

Als etwas extremeres Ende gibt es $ lambda _ { text {zap}} $, ein typisierter Lambda -Kalkül, der für die Verarbeitung von transienten Hardwarefehlern ausgelegt ist, z. B. kosmische Strahlen. Es ist in beschrieben in Statische Typisierung für einen fehlerhaften Lambda -Kalkül von Walker et al.

Was Dinge wie "den Stecker herausziehen", wird dies normalerweise durch Transaktionen behandelt. Da Datenstrukturen und Berechnungen der Programmiersprache normalerweise nicht dauerhaft gedacht sind, wird dies selten in eine Sprache integriert und stattdessen von Datenbanksystemen behandelt. Es gibt Arbeiten zur statischen Analyse zur Erkennung, wenn Koordination erforderlich ist, wie z. B. die Arbeit von Dedalus/Bloom, und wenn Transaktionen geschwächt oder beseitigt werden können, z. B. die Koordinationsvermeidung von Peter Bailis. Verwandte Techniken, die Rost verwenden, um Probleme mit der Verwendung des substrukturellen Systems zu vermeiden.

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