私は言語設計に興味があり、一般的に、広く知られている機能(たとえば、継承、ポリモーフィズム、デリゲート、ラムダ、キャプチャ、ガベージコレクション、例外、ジェネリック、分散、リフレクションなど)、特定の言語、実装方法、制限など。
過去数ヶ月で、Rustについて読み始めました。Rustには、オブジェクトの有効期間を静的に検証可能にすることにより、メモリの安全性と決定論的なリソース管理を保証する所有権システムがあります。言語の単純なユーザーの観点から、私はほとんどすぐにシステムを拾うことができました。
しかし、言語デザイナーの観点からは、Rustの物事がまさにその通りである理由を理解するのに少し時間がかかりました。所有権システムのいくつかの制限の背後にある理由をすぐに理解できませんでした。そのような側面がなければ、システムの整合性を侵害するケースを考え出す必要がありました。
私の主な質問は、Rustとその所有権とは特に関係ありませんが、必要に応じてコメント/回答の例として自由に使用してください。
言語設計者が新しい機能を設計するとき、機能が適切に機能することを決定するためにどのような方法論またはプロセスを使用しますか?
「新規」とは、既存の言語で既にテストされたものではないことを意味します(したがって、作業の大部分は他のデザイナーによって行われています)。「適切に動作する」とは、この機能が意図した問題を正しく解決し、合理的に防弾であることを意味します。「合理的な防弾」とは、機能の整合性に違反する言語または言語の特定のサブセット(「安全でない」コードのないサブセットなど)でコードを記述できないことを意味します。
シンプルな形の機能を考え出し、それを破る方法を見つけ、それをうまく破ったらパッチを当てて、繰り返すという意味で、試行錯誤のプロセスですか?そして、他の可能な違反を考えることができないとき、あなたは何も残っていないことを望み、それを1日と呼びますか?
または、機能が機能することを実際に(単語の数学的意味で)証明し、その証明を使用して最初から自信を持って機能を(またはほぼ正しく)取得する正式な方法はありますか?
(私はコンピューターサイエンスではなく、エンジニアリングのバックグラウンドを持っていることに言及する必要があります。したがって、CSの人々に明らかな何かが足りない場合は、お気軽にご指摘ください。)