Tip sistemleri: nominal vs yapısal, açık vs örtük


24

Nominal ve yapısal tip sistemler arasındaki fark konusunda biraz kafam karıştı. Birisi lütfen nasıl farklı olduklarını açıklayabilir mi?

Anladığım kadarıyla:

  • Nominal: Tip uyumluluğu, tip ismine dayanır.
  • Yapısal: Tip uyumluluğu, tip yapısına dayanır, örneğin 2 değişken farklı isimlere sahip yapısal tipler ise, aynı tip C ise tiplerine uygundur.

Şimdi açık ve örtük hakkında: neden statik ve dinamik yazmadan farklı? Statik yazımda, dinamik yazarken tipler açık olur, tipler örtüktür. Haklı mıyım

Yanıtlar:


29

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 xher şey olabilir ; çalışma zamanında, eğer 1bir sayıysa ve öyleyse "foo", bir dizgedir. Çalışma xzamanı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 xeğer xbir sayı olsaydı yazacaktınız ve xher 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 xolması 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 # varanahtar sözcüğü kullanarak türler çıkarmanıza izin verir . Böylece int x = 10yazmak yerine yazabilir var x = 10ve derleyici xolması 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 . readHaskell'in türlerini kendi başına çözemediği yerlerde belirsiz olan bir kod yazabilirsiniz . Bu durumda, açıkça ya showda 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.


2
Aslına bakarsanız, açıkça dinamik yazma denebilecek bir dil var . Tipik olarak, bu diller türleri içeren açıklama ifadeleri için izin ve sonra bu tür kontrol edilecek zamanında karşı çalışma zamanı tip ifadesinin.
Jörg W Mittag

sadece bir hassasiyet: tip sistemler örtük veya açık değildir. Bu sadece tip çıkarımı ile ilgilidir, bu aslında bir tip sistemde geçerli terimleri farklı (bazen tanımlanmamış) bir sözdiziminden üretmenin bir yoludur.
Eduardo Pareja Tobes,

İyi cevap, ancak bu, yapısal ve yapısal yazımlar için nominal değildir. Bir düzenleme harika olurdu.
öğle yemeği317,

7
  • Statik ve Dinamik, türlerin ne zaman kontrol edildiğini açıklar (derleme zamanında veya uygulama zamanında)

  • nominal vs yapısal iki tip aynı olarak değerlendirildiğinde tanımlamaktadır.

(Ve varyasyonlar vardır, en iyi bilinen yapısal yazım varyantıdır, ancak ördek yazması olarak bilinen bütün tür yerine sadece ne kullanıldığını dikkate alır).

Dört kombinasyon (statik nominal, statik yapısal, dinamik nominal, dinamik yapısal) mümkündür ve diller genellikle yalnızca bir sınıfta değildir, başkalarında olan yönlere sahiptir.

Örneğin, C ++ tip sistemleri statiktir, çoğunlukla nominaldir ancak şablonları göz önüne aldığınızda yapısaldir (ve C ++ 'daki kavramların etrafındaki sorunların bir kısmını ördek yazımından tam bir yapısal yazım biçimine kadar isteyenler arasında bir çatışma olarak düşünebilirsiniz. nominal yazmaya gitmek isteyenler). Ve sınıfların ve kalıtımın kullanılması, bazı durumlarda dinamik ve nominal bir yazım kullanılmasına izin verir.

Dinamik tip sistemlerin sıklıkla kullandığı dil, yapısal tiplendirmeyi kullanmakta ancak CLOS nominal yön olarak kullanılmaktadır.


1

Yapısal: Tip uyumluluğu, tip yapısına dayanır, örneğin 2 değişken farklı isimlere sahip yapısal tipler ise, aynı tip C ise tiplerine uygundur.

Bu genellikle durum böyle değil. Yapısal yazım, bu onun arayüzünü tatmin edebilir eğer Bbir alt türü anlamına gelir . Bu genellikle aynı ada sahip üyelere sahip olmak anlamına gelir; hafızadaki aynı yapı değil.AA

Bu, beyanda belirtilmesi gereken süper tipler gerektiren nominal tiplemeden farklıdır.


1

Dinamik ve statik tip sistemler arasındaki (aslında yetersizliği) ayırt etmenin en iyi açıklaması Bob Harper tarafından yazılan bu blog yazısında:

Başlıca noktası şöyle özetlenebilir:

  • Dinamik diller, yalnızca bir tür olan statik dillerdir.

1
Bağlantılar kötü gidebilir; makalenin en alakalı kısımlarını alıntı yapmalısınız, böylece blog kaput çıksa bile, gelecek için korunmuş olurlar.
Doval

2
Emin. Bu durumda eklediğim cümlenin yeterli olduğunu düşünüyorum :)
Eduardo Pareja Tobes
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.