Ich interessiere mich für Sprachdesign und kann im Allgemeinen leicht über weithin bekannte Merkmale (z. B. Vererbung, Polymorphismus, Delegierte, Lambdas, Erfassungen, Speicherbereinigung, Ausnahmen, Generika, Varianz, Reflexion usw.) und deren Wechselwirkungen in a nachdenken bestimmte Sprache, die Art und Weise, wie sie möglicherweise implementiert werden können, ihre Einschränkungen usw.
In den letzten Monaten habe ich angefangen, über Rust zu lesen, das über ein Besitzersystem verfügt, das Speichersicherheit und deterministisches Ressourcenmanagement gewährleistet, indem er die statische Überprüfung der Objektlebensdauer erzwingt. Aus der Sicht eines einfachen Benutzers der Sprache konnte ich das System fast sofort abholen.
Aus der Sicht eines Sprachdesigners habe ich jedoch eine Weile gebraucht, um zu erkennen, warum die Dinge in Rust genau so sind, wie sie sind. Ich konnte die Gründe für einige Einschränkungen des Besitzersystems nicht sofort verstehen, bis ich mich zwang, Fälle zu finden, die die Integrität eines Systems verletzen würden, wenn es diese Aspekte nicht hätte.
Meine Hauptfrage hat nichts speziell mit Rust und seinem Eigentum zu tun - aber Sie können sie bei Bedarf als Beispiel in Ihren Kommentaren / Antworten verwenden.
Welche Methodik oder welchen Prozess verwenden Sprachdesigner beim Entwerfen eines neuen Features, um zu entscheiden, ob das Feature ordnungsgemäß funktioniert?
Mit "neu" meine ich, dass es nicht bereits in vorhandenen Sprachen getestet wurde (und daher der Großteil der Arbeit von anderen Designern geleistet wurde). Mit "funktioniert richtig" meine ich, dass die Funktion das beabsichtigte Problem korrekt löst und einigermaßen kugelsicher ist. Mit "einigermaßen kugelsicher" meine ich, dass kein Code in der Sprache oder einer bestimmten Teilmenge der Sprache geschrieben werden kann (z. B. eine Teilmenge ohne "unsicheren" Code), der die Integrität der Funktion verletzen würde.
Handelt es sich um einen Versuch und Irrtum in dem Sinne, dass Sie eine einfache Form der Funktion entwickeln, dann versuchen, Wege zu finden, um sie zu verletzen, und sie dann patchen, wenn Sie sie erfolgreich verletzen, und dann wiederholen? Und wenn Ihnen dann keine anderen möglichen Verstöße einfallen, hoffen Sie, dass nichts mehr übrig ist, und nennen es einen Tag?
Oder gibt es eine formale Möglichkeit, tatsächlich (im mathematischen Sinne des Wortes) zu beweisen, dass Ihr Feature funktioniert, und diesen Beweis dann zu verwenden, um das Feature von Anfang an sicher richtig (oder größtenteils richtig) zu machen?
(Ich sollte erwähnen, dass ich einen technischen Hintergrund habe und keine Informatik. Wenn mir also etwas fehlt, das für CS-Leute offensichtlich ist, können Sie es gerne darauf hinweisen.)