知識マップ: Ada と Rust の安全性の考え方の違い ── 型・オーバーフロー・所有権・データ競合・形式検証を実際に動かして比べる
記事「Ada と Rust の安全性の考え方の違い ── 型・オーバーフロー・所有権・データ競合・形式検証を実際に動かして比べる」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
Adaは範囲制約やモジュラー型で値の範囲を型に書き、アクセシビリティ規則でダングリング参照を防ぎ、保護オブジェクトでデータ競合を防ぐ。ただしUnchecked_Deallocationの後の使用や保護しない共有変数はコンパイラが止めない。SPARKはRustにならった所有権ポリシーを持ち、GNATproveがオーバーフロー・メモリリーク・データ競合を検査する。Rustは所有権と借用チェッカー、SendとSyncでダングリング参照とデータ競合をコンパイル時に止め、整数オーバーフローの扱いはoverflow-checksで決まる。Rustの形式検証にはKani・Verus・Creusot・Prustiがある。
flowchart LR
accTitle: AdaとRustの安全性の知識マップ
accDescr: Adaの範囲制約・アクセシビリティ規則・保護オブジェクト、SPARKの所有権ポリシーとGNATprove、Rustの所有権・借用チェッカー・Send/Sync・unsafeが、整数オーバーフロー・ダングリング参照・データ競合・メモリリークとどう関係するかを示します。
ada["Ada(プログラミング言語)"]
rust["Rust(プログラミング言語)"]
spark["SPARK"]
ada_strong_typing["Adaの強い型付け"]
ada_range_constraint["範囲制約(range constraint)"]
ada_modular_type["モジュラー型"]
newtype_pattern["newtypeパターン"]
integer_overflow["整数オーバーフロー"]
cargo_overflow_checks["overflow-checks(Cargo)"]
gnatprove["GNATprove"]
rust_ownership["所有権(Rust)"]
rust_borrow_checker["借用チェッカー"]
dangling_pointer["ダングリング参照"]
data_race["データ競合(data race)"]
ada_access_type["アクセス型"]
ada_accessibility_rules["アクセシビリティ規則"]
ada_unchecked_deallocation["Ada.Unchecked_Deallocation"]
spark_ownership_policy["所有権ポリシー(SPARK)"]
memory_leak["メモリリーク"]
formal_verification["形式検証"]
rust_send["Send(Rust)"]
rust_sync["Sync(Rust)"]
protected_object["保護オブジェクト(protected object)"]
ravenscar_profile["Ravenscarプロファイル"]
jorvik_profile["Jorvikプロファイル"]
unsafe_rust["unsafe Rust"]
kani["Kani"]
verus["Verus"]
creusot["Creusot"]
prusti["Prusti"]
smt_solver["SMTソルバ(自動証明器)"]
why3["Why3"]
ada -->|"実装を担う"| ada_strong_typing
ada -->|"実装を担う"| ada_range_constraint
ada -->|"実装を担う"| ada_modular_type
rust -->|"利用する"| newtype_pattern
integer_overflow -->|"で構成できる"| cargo_overflow_checks
integer_overflow -->|"で確認できる"| gnatprove
rust -->|"実装を担う"| rust_ownership
rust -->|"実装を担う"| rust_borrow_checker
rust_borrow_checker -->|"防止する"| dangling_pointer
rust_borrow_checker -->|"防止する"| data_race
ada -->|"実装を担う"| ada_access_type
ada -->|"実装を担う"| ada_accessibility_rules
ada_accessibility_rules -.->|"防止する"| dangling_pointer
ada_unchecked_deallocation -->|"前提とする"| ada_access_type
ada_unchecked_deallocation -->|"原因になり得る"| dangling_pointer
spark -->|"実装を担う"| spark_ownership_policy
spark_ownership_policy -.->|"防止する"| dangling_pointer
memory_leak -->|"で確認できる"| gnatprove
spark -->|"実装を担う"| formal_verification
spark -->|"利用する"| gnatprove
rust -->|"実装を担う"| rust_send
rust -->|"実装を担う"| rust_sync
rust_send -->|"防止する"| data_race
rust_sync -->|"防止する"| data_race
protected_object -->|"防止する"| data_race
data_race -.->|"で確認できる"| gnatprove
spark -.->|"前提とする"| ravenscar_profile
spark -.->|"利用する"| jorvik_profile
rust -->|"実装を担う"| unsafe_rust
unsafe_rust -.->|"原因になり得る"| dangling_pointer
rust -.->|"で確認できる"| kani
rust -.->|"で確認できる"| verus
rust -.->|"で確認できる"| creusot
rust -.->|"で確認できる"| prusti
integer_overflow -->|"で確認できる"| kani
verus -->|"利用する"| smt_solver
creusot -->|"利用する"| why3
概念間の関係(全37件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- Ada(プログラミング言語)はAdaの強い型付けの実装を担います。
- Ada(プログラミング言語)は範囲制約(range constraint)の実装を担います。
- Ada(プログラミング言語)はモジュラー型の実装を担います。
- Rust(プログラミング言語)はnewtypeパターンを利用します。
- 整数オーバーフローはoverflow-checks(Cargo)で構成できます。
- 整数オーバーフローはGNATproveで確認できます。
- Rust(プログラミング言語)は所有権(Rust)の実装を担います。
- Rust(プログラミング言語)は借用チェッカーの実装を担います。
- 借用チェッカーはダングリング参照を防ぎます。
- 借用チェッカーはデータ競合(data race)を防ぎます。
- Ada(プログラミング言語)はアクセス型の実装を担います。
- Ada(プログラミング言語)はアクセシビリティ規則の実装を担います。
- アクセシビリティ規則はダングリング参照を防ぎます。
- Ada.Unchecked_Deallocationはアクセス型を前提とします。
- Ada.Unchecked_Deallocationはダングリング参照の原因になることがあります。
- SPARKは所有権ポリシー(SPARK)の実装を担います。
- 所有権ポリシー(SPARK)はダングリング参照を防ぎます。
- メモリリークはGNATproveで確認できます。
- SPARKは形式検証の実装を担います。
- SPARKはGNATproveを利用します。
- Rust(プログラミング言語)はSend(Rust)の実装を担います。
- Rust(プログラミング言語)はSync(Rust)の実装を担います。
- Send(Rust)はデータ競合(data race)を防ぎます。
- Sync(Rust)はデータ競合(data race)を防ぎます。
- 保護オブジェクト(protected object)はデータ競合(data race)を防ぎます。
- データ競合(data race)はGNATproveで確認できます。
- SPARKはRavenscarプロファイルを前提とします。
- SPARKはJorvikプロファイルを利用します。
- Rust(プログラミング言語)はunsafe Rustの実装を担います。
- unsafe Rustはダングリング参照の原因になることがあります。
- Rust(プログラミング言語)はKaniで確認できます。
- Rust(プログラミング言語)はVerusで確認できます。
- Rust(プログラミング言語)はCreusotで確認できます。
- Rust(プログラミング言語)はPrustiで確認できます。
- 整数オーバーフローはKaniで確認できます。
- VerusはSMTソルバ(自動証明器)を利用します。
- CreusotはWhy3を利用します。
主要概念の定義
機械可読データ
このデータセットについて
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。