Tip sistemi, doğruluğun bazı yönlerinin otomatik olarak doğrulanabilir kanıtıdır. Örneğin, Rust'un tür sistemi, bir başvurunun başvurulan nesneyi geçmediğini veya başvurulan bir nesnenin başka bir iş parçacığı tarafından değiştirilmediğini kanıtlayabilir.
Ancak tip sistemleri oldukça kısıtlıdır:
Hızla karar verilebilirlik sorunlarıyla karşılaşırlar. Özellikle, tip sisteminin kendisi karar verilebilir olmalıdır, ancak birçok pratik tip sistemi yanlışlıkla Turing Complete (şablonlar nedeniyle C ++ ve özellikler nedeniyle Rust dahil) içerir. Ayrıca, doğruladıkları programın bazı özellikleri genel durumda, en ünlüsü bazı programın durup durmadığı (veya ayrıştığı) kararsız olabilir.
Ayrıca, tip sistemleri hızlı bir şekilde, ideal olarak doğrusal zamanda çalışmalıdır. Mümkün olan tüm ispatlar tip sisteminde yer almamalıdır. Örneğin, tüm program analizinden genellikle kaçınılır ve kanıtlar tekli modüllere veya fonksiyonlara dahil edilir.
Bu sınırlamalar nedeniyle, yazı sistemleri yalnızca kanıtlanması kolay olan oldukça zayıf özellikleri doğrulama eğilimindedir, örneğin bir işlevin doğru türde değerlerle çağrıldığı. Yine de bu, anlamlılığı önemli ölçüde sınırlandırdığından, geçici çözümlere ( interface{}
Go, dynamic
C #, Object
Java, void*
C'deki gibi) veya statik yazımı tamamen kapatan dilleri kullanmak yaygındır .
Doğruladığımız özellikler ne kadar güçlü olursa, dil genellikle o kadar az anlamlı olur. Rust yazdıysanız, derleyicinin görünüşte doğru kodu reddettiği bu “derleyici ile kavga” anlarını bileceksiniz, çünkü doğruluğunu kanıtlayamadı. Bazı durumlarda, doğruluğunu kanıtlayabileceğimize inansak bile Rust'daki belirli bir programı ifade etmek mümkün değildir . unsafe
Rust veya C # mekanizması Tür sisteminin sınırları kaçmak için izin verir. Bazı durumlarda, denetimlerin çalışma zamanına ertelenmesi başka bir seçenek olabilir - ancak bu, bazı geçersiz programları reddedemeyeceğimiz anlamına gelir. Bu bir tanım meselesi. Panik yapan bir Rust programı, tip sistemi söz konusu olduğunda güvenlidir, ancak bir programcı veya kullanıcı açısından zorunlu değildir.
Diller yazı sistemleri ile birlikte tasarlanmıştır. Varolan bir dile yeni bir tür sisteminin uygulanması nadirdir (ancak bkz. Örneğin MyPy, Flow veya TypeScript). Dil, tür sistemine uygun kod yazmayı kolaylaştırmaya çalışacaktır, örneğin tip ek açıklamaları sunarak veya kanıtlanması kolay kontrol akış yapıları ekleyerek. Farklı diller farklı çözümlerle sonuçlanabilir. Örneğin Java, final
Rust'un mut
değişken olmayanlarına benzer şekilde tam olarak bir kez atanan değişkenler kavramına sahiptir :
final int x;
if (...) { ... }
else { ... }
doSomethingWith(x);
Java, tüm yolların değişkeni atayacağını veya değişkene erişilmeden önce işlevi sonlandırıp sonlandırmayacağını belirlemek için tür sistem kurallarına sahiptir. Buna karşılık, Rust bildirilen ancak tasarlanmamış değişkenlere sahip olmadan bu ispatı basitleştirir, ancak kontrol akışı ifadelerinden değerleri döndürmenizi sağlar:
let x = if ... { ... } else { ... };
do_something_with(x)
Bu, ödevi anlamaya çalışırken gerçekten küçük bir noktaya benziyor, ancak net kapsam belirleme, ömür boyu ilgili kanıtlar için son derece önemlidir.
Java'ya Rust tarzı bir sistem uygulasaydık, bundan çok daha büyük problemlerimiz olurdu: Java nesnelerine yaşam süreleri ile açıklama eklenmez, bu yüzden onlara &'static SomeClass
veya gibi davranmamız gerekirdi Arc<dyn SomeClass>
. Bu, sonuçta ortaya çıkan kanıtları zayıflatır. Java'nın tür düzeyinde değişmezlik kavramı da yoktur, bu nedenle türleri &
ve &mut
türleri ayırt edemeyiz . Herhangi bir nesneyi Hücre veya Muteks olarak ele almalıyız, ancak bu, Java'nın gerçekten sunduğundan daha güçlü garantiler alabilir (senkronize ve geçici olmadığı sürece bir Java alanını değiştirmek güvenli değildir). Son olarak, Rust'un Java tarzı uygulama devralma kavramı yoktur.
TL; DR: tip sistemler teoremdir. Ancak, kararlılık sorunları ve performans endişeleriyle sınırlıdırlar. Hedefin dil sözdizimi gerekli bilgileri sağlayamayabileceğinden ve semantikler uyumsuz olabileceğinden, yalnızca bir tür sistemi alıp farklı bir dile uygulayamazsınız.