Statik analiz için türlere alternatifler var mı?


18

Bir programlama dilinde statik yazım, derleme zamanında belirli garantileri uygulamak için yardımcı olabilir - ancak türler bu iş için tek araç mıdır? Değişmezleri belirtmenin başka yolları var mı?

Örneğin, bir dil veya ortam, dizi uzunluğu veya bir işleve girişler arasındaki ilişkilerle ilgili bir garantinin uygulanmasına yardımcı olabilir. Bir tür sistemin dışında böyle bir şey duymadım.

Ben merak ediyordum İlgili bir şey statik analiz yapmak olmayan herhangi bildirime yolu vardır (tipleri, bildirime ise ise çoğunlukla ).

Yanıtlar:


24

Statik tip sistemler bir tür statik analizdir, ancak tip sistemlerde genellikle kodlanmayan birçok statik analiz vardır. Örneğin:

  • Model kontrolü , eşzamanlı sistemler için programınızın olası tüm iplik aralıkları altında iyi davrandığını kanıtlamanızı sağlayan bir analiz ve doğrulama tekniğidir.

  • Veri akışı analizi , bazı hesaplamaların gereksiz olup olmadığını veya bir hatanın hesaba katılmadığını belirleyebilen değişkenlerin olası değerleri hakkında bilgi toplar.

  • Soyut yorumlama , bir programın etkilerini, genellikle analizin sona erdirileceği garanti edilecek şekilde konservatif olarak modeller - tip denetleyiciler soyut yorumlayıcılara benzer şekilde uygulanabilir.

  • Ayırma mantığı , program durumları hakkında akıl yürütmek ve boş işaretçi dereferences, geçersiz durumlar ve kaynak sızıntıları gibi sorunları tanımlamak için kullanılabilen bir program mantığıdır (örneğin Infer analizöründe kullanılır).

  • Sözleşmeye dayalı programlama , önkoşulları, sonkoşulları, yan etkileri ve değişmezleri belirtmenin bir yoludur. Ada , sözleşmeler için yerel desteğe sahiptir ve bazılarını statik olarak doğrulayabilir.

Optimizasyon derleyicileri, SSA, satır içi maliyet tahminleri, talimat eşleştirme bilgileri vb. Gibi optimizasyon sırasında kullanılmak üzere ara veri yapıları oluşturmak için birçok küçük analiz yapar.

Deklaratif olmayan statik analizin başka bir örneği, normal kontrol akışı yapılarının bir değişkenin türünü geliştirebileceği Hack daktiloda bulunur:

$x = get_value();
if ($x !== null) {
    $x->method();    // Typechecks because $x is known to be non-null.
} else {
    $x->method();    // Does not typecheck.
}

Ve “arıtma” dan bahsetmek gerekirse , tip sistemlerin topraklarında, arıtma türleri ( LiquidHaskell'de kullanıldığı gibi ), “rafine” tip örnekleri için tutulacağı garanti edilen çift tipler. Bağımlı türler bunu daha ileri götürür ve türlerin değerlere bağımlı olmasını sağlar. Bağımlı yazmanın “merhaba dünyası” genellikle dizi birleştirme işlevidir:

(++) : (a : Type) -> (m n : Nat) -> Vec a m -> Vec a n -> Vec a (m + n)

Burada, ++iki tür işlenen alır Vec a mve Vec a neleman türü ave uzunlukları olan mve nsırasıyla doğal sayılar ( Nat) olan vektörler . Uzunluğu aynı eleman türünde bir vektör döndürür m + n. Ve bu fonksiyon, ve özel değerlerini bilmeden bu kısıtlamayı soyut olarak kanıtlar mve nböylece vektörlerin uzunlukları dinamik olabilir.


Tip sistemi nedir? Aslında bilmediğimin farkındayım. Wikipedia'daki tanım daireseldir: en.wikipedia.org/wiki/Type_system
Max Heiber

1
@mheiber: Statik tipi sistem statik analiz basitçe olduğunu atfettiği türleri (örn int, int -> int, forall a. a -> a) terimlere (örneğin 0, (+ 1), \x -> x). Diğer analizler veri türüyle ilgili olmayan farklı özellikler, örneğin yan etkiler ( pure, io), görünürlük ( public, private) veya durum ( open, closed) atayabilir . Uygulamada, bu özelliklerin birçoğu tip kontrolü / çıkarımı ile aynı uygulamada kontrol edilebilir, bu nedenle ayrım tamamen net değildir.
Jon Purdy

4

@ JonPurdy'nin cevabı daha iyi, ancak birkaç örnek daha eklemek istiyorum:

Açık:

  • sözdizimi denetimi

  • linting

Kesin değil:

  • Rust, programcının "bağların" değiştirilebilir olup olmadığını belirlemesini sağlar ve bu kısıtlamaları uygular.

  • Bu bir tür ilişkilidir: bazı diller derleme zamanında bazı kodların çalışmasını sağlar, bu da çalışma zamanı hataları olabilecek birçok şeyin derleme zamanında yakalanabileceği anlamına gelir. Bazı örnekler , pragma ile işaretlenmiş makrolar ve Nim dil prosedürleridir .compileTime

  • Mantıksal programlama temel olarak iddialar sağlayarak bir program oluşturur.

Yarı statik tiplendirme:

  • Facebook'un Akışı , dinamik ve statik yazım arasında bir melez sağlar. Fikir, dinamik kodun bile örtülü olarak yazılmasıdır. Flow, işlevlerinize açıklama eklemeseniz bile, olası tür hatalarını algılamak için kodunuzu izleyen bir sunucu çalıştırmanıza olanak tanır.

1

Tip analizi çok fazla bir şey ifade etmiyor.

Agda ML dilleri (mesela çok farklı (ve çok daha zor bilgi işlem için) bir Turing tamamlama tip sistemi, sahip olduğu bilinmektedir Ocaml ).


Agda, "Turing-complete tipi sisteme" ve "Turing-complete terim sistemine" sahip olmamak için büyük çaba sarf ediyor.
user833970
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.