Dinamik olarak yazılmış bir sistemde, değerlerin çalışma zamanında türleri vardır, ancak değişkenler ve işlevler yoktur. Statik olarak yazılmış bir sistemde, değişkenler ve fonksiyonlar derleme zamanında bilinen ve kontrol edilen tiplere sahiptir. Örneğin Python'da x
her şey olabilir ; çalışma zamanında, eğer 1
bir sayıysa ve öyleyse "foo"
, bir dizgedir. Çalışma x
zamanında yalnızca hangi türün çalıştığını biliyordunuz ve programı her çalıştırdığınızda farklı olabilirdi. Java gibi bir dilde, int x
eğer x
bir sayı olsaydı yazacaktınız ve x
her zaman olması gereken derleme zamanında bilecekti int
.
"Açık" ve "kapalı" türlerin her ikisi de statik tür sistemlere işaret eder . Statik bir sistemin tanımlayıcı özelliği, türlerin derleme zamanında bilinmesi , ancak bunların mutlaka yazılması gerekmemesidir. Java'da, türler açıktır - bunları yazmanız gerekir. Bu yüzden Java'da bir yöntem şöyle görünebilir:
public int foo(String bar, Object baz) { ... }
Türleri hem derleme zamanında (statik) de bilinmektedir ve (açık) dışarı yazılı. Ancak, aynı zamanda do dil vardır değil türünü yazmaya zorlar. Onlar yapabilirsiniz çıkarımda vücudundan bir fonksiyonun türünü ve nasıl kullanılır. Bir örnek OCaml olabilir, ki şöyle bir şey yazabilirsiniz:
let foo x = x + 1
Siz kullandığınızdan beri +
OCaml , bunun tamamen kendi başına x
olması gerektiğini anlayabilir int
. Yani tipi foo
( foo : int -> int
) olan sadece bir Java örnekte olduğu gibi, derleme zamanında da bilinir. Tamamen statik. Ancak, derleyici türlerin kendi başına ne olması gerektiğine karar verebildiğinden, bunları kendiniz yazmak zorunda değilsiniz: dolaylı.
Kısacası: bir tür sistemin açık mı yoksa kapalı mı olduğu statik sistemlerin bir özelliğidir . Bir tip sistemin dinamik mi statik mi olduğu ile tamamen farklı bir sorudur.
Genellikle, zaman zaman açık ve zaman zaman örtülü olan tür sistemleriniz vardır.
Örneğin, C # var
anahtar sözcüğü kullanarak türler çıkarmanıza izin verir . Böylece int x = 10
yazmak yerine yazabilir var x = 10
ve derleyici x
olması gerektiğini anlar int
. C ++ ile benzer bir şey yapar auto
. Bu sistemler genellikle açıktır, ancak bazı çıkarımlara sahiptir.
Diğer tarafta, genellikle kapalı olan, ancak bazen bir tür imza atmaya zorlayan sistemler vardır. Haskell harika bir örnek. Çoğu zaman, Haskell sizin için türler çıkartabilir. Ancak, bazen show . read
Haskell'in türlerini kendi başına çözemediği yerlerde belirsiz olan bir kod yazabilirsiniz . Bu durumda, açıkça ya show
da türünü belirtmek zorunda kalırsınız read
. Ek olarak, tip sisteminin bazı daha gelişmiş özellikleri (rank-n polimorfizmi gibi) çıkarımı kabul edilemez kılar - yani, durması garanti edilmez. Bu, bu özelliği kullanan kodun genellikle açık tür imzalara ihtiyaç duyduğu anlamına gelir.