Rust'un core ve alloc crate'lerinin çevirisi
İlk çalıştırma 🐥
- Rust'un
allocvecorecrate'lericoq-of-rustkullanılarak ilk kez çalıştırıldığında, yüz binlerce satırlık iki Coq kod dosyası üretildi. - Bu, aracın büyük kod tabanlarında da çalıştığını gösteriyor; ancak üretilen Coq kodu derlenmiyor. Hatalar seyrek görülüyor (birkaç bin satırda bir kez).
Girdi Rust kodunun boyutu (cloc komutuna göre)
-
alloc: 26.299 satır Rust kodu -
core: 54.192 satır Rust kodu -
Makrolar genişletilerek çevrilmek zorunda olduğundan, fiilen çevrilmesi gereken boyut daha büyük.
Üretilen kodun bölünmesi 🪓
- Ana değişiklik,
coq-of-rusttarafından üretilen çıktının her bir girdi Rust dosyası için bir dosya olacak şekilde bölünmesi oldu. - Bu, tanım sırasından bağımsız olarak çeviri yapılabildiği için mümkün. Rust dosyaları arasındaki döngüsel bağımlılıklar Coq'da yasak olsa da, yine de bölme yapılabiliyor.
Çıktı boyutu
alloc: 54 Coq dosyası, 171.783 satır Coq koducore: 190 Coq dosyası, 592.065 satır Coq kodu
Kod bölmenin avantajları
- Üretilen kodu okumak ve içinde gezinmek daha kolay
- Paralel derleme yapılabildiği için derlemek daha kolay
- Tek bir dosyaya odaklanarak hata ayıklamak daha kolay
- Derlenmeyen dosyaları yok saymak daha kolay
- Tekil dosyalardaki değişiklikleri izlemek daha kolay olduğundan bakım daha kolay
Bazı hataların düzeltilmesi 🐞
- Modül adları arasındaki çakışmadan kaynaklanan bir hata vardı. Bu,
implblokları için modül adı seçilirken oluşuyordu. - Benzersizliği artırmak için modül adına daha fazla bilgi eklendi. Örneğin,
wherekoşulu eklendi.
Örnek
-
Defaulttrait'i içinMappingtürü implementasyonu:#[derive(Default)] struct Mapping<K, V> { // ... } -
Önceki Coq kodu:
Module Impl_core_default_Default_for_dns_Mapping_K_V. (* ...trait implementation ... *) End Impl_core_default_Default_for_dns_Mapping_K_V. -
Düzeltilmiş Coq kodu:
Module Impl_core_default_Default_where_core_default_Default_K_where_core_default_Default_V_for_dns_Mapping_K_V. (* ... *)
Derlenmeyen dosyaların listesi
-
alloc/boxed.v -
core/any.v -
core/array/mod.v -
core/cmp/bytewise.v -
core/error.v -
core/escape.v -
core/iter/adapters/flatten.v -
core/net/ip_addr.v -
Bu, toplam dosyaların %4'üne karşılık geliyor. Derlenen dosyalarda da işlenmemiş Rust yapıları bulunabilir.
Örnek 🔎
Option türünün unwrap_or_default metodunun kaynak kodu
pub fn unwrap_or_default(self) -> T
where
T: Default,
{
match self {
Some(x) => x,
None => T::default(),
}
}
Çevrilen Coq kodu
Definition unwrap_or_default (T : Ty.t) (τ : list Ty.t) (α : list Value.t) : M :=
let Self : Ty.t := Self T in
match τ, α with
| [], [ self ] =>
ltac:(M.monadic
(let self := M.alloc (| self |) in
M.read (|
M.match_operator (|
self,
[
fun γ =>
ltac:(M.monadic
(let γ0_0 :=
M.get_struct_tuple_field_or_break_match (|
γ,
"core::option::Option::Some",
0
|) in
let x := M.copy (| γ0_0 |) in
x));
fun γ =>
ltac:(M.monadic
(M.alloc (|
M.call_closure (|
M.get_trait_method (| "core::default::Default", T, [], "default", [] |),
[]
|)
|)))
]
|)
|)))
| _, _ => M.impossible
end.
Basitleştirilmiş fonksiyon kodu
Definition unwrap_or_default {T : Set}
{_ : core.simulations.default.Default.Trait T}
(self : Self T) :
T :=
match self with
| None => core.simulations.default.Default.default (Self := T)
| Some x => x
end.
- Bu basitleştirilmiş tanım, kod doğrulamasında kullanılıyor. Eşdeğerlik ispatı
CoqOfRust/core/proofs/option.viçinde yer alıyor.
Sonuç
-
Standart kütüphanenin biçimselleştirilmesi sayesinde Rust programı doğrulama çalışmasına güven duyulabiliyor.
-
Bir sonraki hedef, hâlâ zahmetli olan ispat sürecini basitleştirmek. Özellikle simülasyonun özgün Rust koduyla eşdeğer olduğunu gösterirken ad çözümleme, gelişmiş türlerin tanıtılması ve yan etkilerin kaldırılması gibi adımları ayırmak isteniyor.
-
Rust projelerinin biçimsel doğrulamasıyla ilgileniyorsanız contact@formal.land adresine ulaşabilirsiniz. Biçimsel doğrulama, verilen bir belirtime göre hatasızlığı matematiksel olarak garanti eden en yüksek güvenlik düzeyini sunar.
Etiketler:
- coq-of-rust
- Rust
- Coq
- çeviri
- core
- alloc
GN⁺ görüşü
- Rust ve Coq entegrasyonu: Rust ile Coq'nun entegre edilmesi, Rust programlarının güvenilirliğini artırmada büyük fayda sağlar. Rust'un güvenliği ile Coq'nun biçimsel doğrulamasının birleşimi, özellikle kritik uygulamalarda çok yararlıdır.
- Otomasyonun önemi:
coq-of-rustaracıyla yapılan otomatik çeviri, elle yapılan çalışmalara göre daha güvenilirdir. Ancak doğrulama sürecinde yine de hatalar oluşabileceği için dikkat gerekir. - Karmaşık kod tabanlarının yönetimi: Büyük kod tabanlarıyla çalışırken kodu bölmek, bakım ve hata ayıklama açısından büyük fayda sağlar. Bu, özellikle ekip çalışmalarında önemli bir unsurdur.
- Biçimsel doğrulamanın gerekliliği: Biçimsel doğrulama özellikle finans, sağlık ve havacılık gibi kritik alanlarda zorunludur. Rust ile Coq'nun birleşimi bu alanlarda büyük değer sağlayabilir.
- Teknoloji benimserken dikkat edilmesi gerekenler: Yeni bir teknolojiyi benimserken öğrenme eğrisi ve mevcut sistemlerle uyumluluk dikkate alınmalıdır. Coq gibi biçimsel doğrulama araçları yüksek bir öğrenme eğrisine sahip olabileceğinden yeterli eğitim ve hazırlık gerekir.
1 yorum
Hacker News görüşü
Hacker News yorumlarından derlenmiş özet
Otomatik çeviri araçlarının güvenilirliği
Program boyutu ve doğrulama
Çeviri sürecindeki hata olasılığı
Kripto para ile ilgili gönderiler
Biçimsel doğrulamanın sınırları
Rust'un biçimsel doğrulaması
unsafekod kullanılmadığı sürece bellek işlemleri için de biçimsel doğrulama düzeyinde güvence sağlanıp sağlanamayacağı merak ediliyor.Biçimsel doğrulama spesifikasyonları yazma
Diğer yaklaşımlarla karşılaştırma
Rust'un çekirdekte benimsenmesi
F için Rust backend eklenmesi*