知識マップ: Ada と Rust の安全性の考え方の違い ── 型・オーバーフロー・所有権・データ競合・形式検証を実際に動かして比べる

記事「Ada と Rust の安全性の考え方の違い ── 型・オーバーフロー・所有権・データ競合・形式検証を実際に動かして比べる」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

Adaは範囲制約やモジュラー型で値の範囲を型に書き、アクセシビリティ規則でダングリング参照を防ぎ、保護オブジェクトでデータ競合を防ぐ。ただしUnchecked_Deallocationの後の使用や保護しない共有変数はコンパイラが止めない。SPARKはRustにならった所有権ポリシーを持ち、GNATproveがオーバーフロー・メモリリーク・データ競合を検査する。Rustは所有権と借用チェッカー、SendとSyncでダングリング参照とデータ競合をコンパイル時に止め、整数オーバーフローの扱いはoverflow-checksで決まる。Rustの形式検証にはKani・Verus・Creusot・Prustiがある。

AdaとRustの安全性の知識マップAdaの範囲制約・アクセシビリティ規則・保護オブジェクト、SPARKの所有権ポリシーとGNATprove、Rustの所有権・借用チェッカー・Send/Sync・unsafeが、整数オーバーフロー・ダングリング参照・データ競合・メモリリークとどう関係するかを示します。実装を担う実装を担う実装を担う利用するで構成できるで確認できる実装を担う実装を担う防止する防止する実装を担う実装を担う防止する前提とする原因になり得る実装を担う防止するで確認できる実装を担う利用する実装を担う実装を担う防止する防止する防止するで確認できる前提とする利用する実装を担う原因になり得るで確認できるで確認できるで確認できるで確認できるで確認できる利用する利用するAda(プログラミング言語)Rust(プログラミング言語)SPARKAdaの強い型付け範囲制約(range constraint)モジュラー型newtypeパターン整数オーバーフローoverflow-checks(Cargo)GNATprove所有権(Rust)借用チェッカーダングリング参照データ競合(data race)アクセス型アクセシビリティ規則Ada.Unchecked_Deallocation所有権ポリシー(SPARK)メモリリーク形式検証Send(Rust)Sync(Rust)保護オブジェクト(protected object)RavenscarプロファイルJorvikプロファイルunsafe RustKaniVerusCreusotPrustiSMTソルバ(自動証明器)Why3

概念間の関係(全37件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

Ada(プログラミング言語)
1970年代後半にアメリカ国防総省の主導で標準化された、強い型付けと高信頼性を重視する汎用プログラミング言語。最新標準はAda 2022。
Rust(プログラミング言語)
所有権と借用の規則をコンパイラが検査することで、ガベージコレクションを使わずにメモリを管理するシステムプログラミング言語。
SPARK
プログラムの性質を数学的に証明できるように設計された、Adaのサブセット(部分言語)とそのツール群。
整数オーバーフロー
整数の演算結果が、その型で表せる範囲を超えること。言語と設定によって、例外・パニック・折り返しのいずれかになる。Adaでは、値が型の基本範囲に収まるかを確かめるOverflow_Checkに失敗すると、実行時にConstraint_Errorが送出される。
借用チェッカー
スコープを比べて借用(参照)が有効かを判断し、規則に反する借用をコンパイルエラーにするRustコンパイラの検査。
アクセシビリティ規則
アクセス型と指す先のオブジェクトの寿命(アクセシビリティレベル)を比べ、指す先より長く残るアクセス値を作らせないAdaの規則。静的に違反が分かればコンパイルエラーになり、実行時の検査(accessibility check)に失敗するとProgram_Errorが発生する。
Ada.Unchecked_Deallocation
newで確保したオブジェクトを明示的に解放するために、オブジェクトの型とアクセス型を渡してインスタンス化するAdaの標準のジェネリック手続き。解放に渡した変数はnullになるが、同じオブジェクトを指すほかのアクセス値は検査しない。
所有権ポリシー(SPARK)
アクセス型の代入で所有権を移し、移動元からのアクセスを禁じるSPARKのメモリ所有権の規則。Rustにならったもので、GNATproveが検査する。
メモリリーク
確保したメモリを解放し忘れ、Private BytesやCommitが増え続ける現象。
Send(Rust)
その型の値の所有権をスレッド間で移せることを示すRustのマーカートレイト。
Sync(Rust)
その型を複数のスレッドから参照しても安全であることを示すRustのマーカートレイト。
保護オブジェクト(protected object)
procedure・function・entryの3種の操作を通じてのみ内部データへアクセスさせ、排他制御を言語が保証するAda 95で導入された機構。
データ競合(data race)
複数のタスクが同じメモリ位置に同時アクセスし、少なくとも一方が書き込みであるために結果が未定義になる状態である。
unsafe Rust
生ポインタの参照外しなど5つの操作を許すRustの仕組み。unsafeの中でも借用チェッカーなどの検査は働く。
Verus
Rustの構文で書いた仕様を、実行時の検査を加えずに定理証明でRustのコードに対して検証するツール。
Creusot
RustのコードをWhy3の中間言語Comaに変換して検証する、Rustの演繹的な検証器。

機械可読データ

このデータセットについて

作成
合同会社小村ソフト
ライセンス
CC BY 4.0 ── 出典(合同会社小村ソフト)とライセンスへのリンクを明示し、改変した場合はその旨を示すことを条件に、再配布・改変を含めて再利用できます
最終確認日
2026-11-01 ── 収録する関係のうち、最後に出典と照合した日

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。