Tip sistemlerinin sınıflandırılması (güçlü / zayıf, dinamik / statik)


23

Kısacası: tip sistemleri akademik bağlamda nasıl kategorize edilir; özellikle, farklı türdeki sistemler arasındaki farkları netleştiren saygın kaynakları nereden bulabilirim?

Bir anlamda, bu sorunun zorluğu bir cevap bulamıyorum, aksine çok fazla şey bulabiliyorum ve hiçbiri doğru olarak öne çıkmıyor. Arka plan şu anda aşağıdaki farklılıkları iddia eden Haskell wiki ile ilgili yazmaya ilişkin bir yazıyı geliştirmeye çalışıyorum :

  • Yazma yok: Dilin hiçbir tür kavramı yok ya da yazılan bir bakış açısıyla: Dilde tam olarak bir tür var. Assembly dili sadece 'bit kalıbı' tipinde, Rexx ve Tk sadece 'text' tipinde, çekirdek MatLab ise sadece 'karmaşık-değerli matris' tipinde.
  • Zayıf Yazma: Yalnızca birkaç ayırt edici tür vardır ve birkaç tür için eşanlamlı olabilir. C, booleans, tamsayılar, karakterler, bit kümeleri ve numaralandırmalar için tamsayı sayıları kullanır.
  • Güçlü yazma: Ada, Wirthian dilleri (Pascal, Modula-2), Eiffel gibi ince taneli türler seti

Bu tamamen kişisel düşünceme aykırıdır, ki bunlar daha doğrusu:

  • Zayıf Yazma: Nesnelerin türleri vardır, ancak içerik gerektirdiğinde örtük olarak diğer türlere dönüştürülür. Örneğin, Perl, PHP ve JavaScript, içinde "1"olabilecek herhangi bir bağlamda az ya da çok kullanılabilecek dillerdir 1.
  • Güçlü yazma: Nesnelerin türleri vardır ve örtük dönüşümler yoktur (aşırı yükleme bunları simüle etmek için kullanılabilirse de), bu nedenle bir nesneyi yanlış bağlamda kullanmak bir hatadır. Python'da bir diziyi bir dizge veya kayan nokta ile dizine almak bir TypeError istisnası atar; Haskell'de derleme zamanında başarısız olacaktır.

Bu konuda, benden daha deneyimli diğer insanlardan görüşlerini istedim ve bunlardan biri bu özelliği verdi:

  • Zayıf yazma: Verilerde geçersiz işlemler yapılması kontrol edilmez veya reddedilmez, ancak yalnızca geçersiz / rastgele sonuçlar üretir.
  • Güçlü yazma: Verilerdeki işlemlere yalnızca verinin işlemle uyumlu olması durumunda izin verilir.

Anladığım kadarıyla, ilk ve son karakterizasyonlar zayıf yazılmış, ikinci ise güçlü yazılmış. Birincisi ve ikincisi Perl ve PHP'yi zayıf yazılmış, üçüncüsü de onları güçlü yazılmış. Üçü de Python'u kesinlikle yazılmış olarak tanımlayacak.

Bence çoğu insan bana "iyi, fikir birliği yok, terimlerin kabul edilmiş bir anlamı yok" diyeceğini düşünüyorum. Bu insanlar yanlış ise, bunu duymak mutlu olurum, ama haklılar, o zaman nasıl do CS araştırmacılar tanımlamak ve tip sistemleri karşılaştırmak? Daha az problemli olan hangi terminolojiyi kullanabilirim?

İlgili bir soru olarak, bir dilin derlenmiş olup olmadığının o dilin bir özelliği olmadığı göz önüne alındığında tatmin edici bulduğum, “derleme zamanı” ve “çalışma zamanı” açısından dinamik / statik ayrımın sıklıkla verildiğini hissediyorum. uygulamaları olarak. Dinamik ve statik yazmanın tamamen anlamsal bir açıklaması olması gerektiğini düşünüyorum; "statik bir dil, her alt ifadenin yazıldığı dildir" satırları boyunca bir şey. Bu düşünceye açıklık getiren herhangi bir düşünceyi, özellikle referansları takdir ediyorum.


6
Bence zaten cevabını aldın: Zayıf ve güçlü yazmanın kabul edilmiş bir tanımı yok.
svick

İnanması zor olmazdı, ama soruyu sordum, henüz duymadığım bir tane var mı diye soruyorum :) ya da en azından bir wiki'yi düzenleyen bir adamın durumdan daha iyi bir tanımı var mı? .
Ben Millwood

3
Bununla ilgili daha fazla tartışma için , SO ile ilgili bu soruya bakın .
svick

1
Svick'in amacını pekiştirmek için kabul edilmeyen bir şey için otorite referansı bulmak mümkün değildir. Yetkili olduğunu iddia eden herhangi bir şey basitçe yanlıştır (çünkü çok sayıda karşı örnek verilebilir).
edA-qa mort-ora-y

Şey, bildiğim kadarıyla bildiğim halde, "işte herkesin kabul edeceği tek gerçek tanım" diyen bir yazı yazan biriyle "işte bu bildiri için kullanacağım tanımları" yazan bir yazı yazıyor. diğerleri". İkincisi bile şu ana kadar bildiğimden daha iyi olurdu. Ben bu durumda ne doğru olsa olabileceğini düşündüğünüz do insanlar tipi sisteminin farklı türden konuda ne? Dinamik / statik ayrım, en azından somut mu?
Ben Millwood

Yanıtlar:


18

Tarihsel olarak, "kuvvetle yazılan programlama dili" terimi, 70'lerde, çoğu yaygın olarak kullanılan deliklere sahip olan yaygın olarak kullanılan programlama dillerine tepki olarak kullanıldı. Bazı örnekler:

  • Fortran'da, modüller arasında paylaşılabilecek "COMMON" depolama alanları adı verilen şeyler vardı, ancak her bir modülün COMMON depolama içeriğini aynı türlerle ilan edip etmediğini görmek için hiçbir kontrol yoktu. Bu nedenle, bir modül, belirli bir COMMON saklama bloğunun bir tamsayı ve bir tane kayan nokta sayısına sahip olduğunu ve bunun sonucunda verilerin bozulacağını ilan edebilir. Fortran'da ayrıca "EQUIVALENCE" ifadesi vardı, bu sayede aynı depolamanın farklı türlerde iki farklı nesne içerdiği bildirildi.

  • Algol 60'da, prosedür parametrelerinin türü, prosedürün parametrelerinin türlerini belirtmeden sadece "prosedür" olarak ilan edildi. Dolayısıyla, bir prosedür parametresinin bir tamsayı kabul eden bir prosedür olduğu varsayılabilir, ancak argüman olarak gerçek bir kabul prosedürü uygulandı. Bu, ORTAK ve EŞİDİRLİK ifadeleriyle aynı tür yolsuzlukla sonuçlanacaktır. (Ancak, Algol 60 eski sorunları ortadan kaldırdı.)

  • Pascal'da neredeyse eski EQUIVALENCE ifadeleriyle aynı olan "değişken kayıtları" eklendi.

  • C'ye, herhangi bir veri tipinin farklı tipteki bir veri olarak yorumlanabileceği "tip dökümler" eklenmiştir. Bu, ne yaptıklarını bilen programcılar için kasıtlı bir tür delikti.

70'lerde tasarlanan kesinlikle yazılan dillerin, bu tür tüm delikleri ortadan kaldırması gerekiyordu. Bunun ne anlama geldiğini tespit ederseniz, temel olarak veri temsillerinin korunduğu anlamına gelir. Bir türdeki veri nesnesini, iç gösterimle aynı bit desenine sahip olan başka bir türdeki nesne olarak görüntülemek mümkün değildir. Teorisyenler belirsiz "güçlü yazma" fikri yerine bu özelliği karakterize etmek için "temsil bağımsızlığı" terimini kullanmaya başladılar.

Tam çalışma zamanı türü kontrolü gerçekleştiren Lisp gibi dinamik olarak yazılmış dillerin, temsilleri korumak anlamında "güçlü şekilde yazıldığını" unutmayın. Aynı zamanda, statik olarak yazılmış diller dizi sınırları denetimi yapmadıkça temsil bağımsızlığını kaybeder. Dolayısıyla, terimin tam anlamıyla "kesinlikle yazılmamış" değillerdir. Bu anormal sonuçlardan dolayı, "şiddetle yazılmış" tabiri 70'lerden sonra kullanılmıyordu. ABD Savunma Bakanlığı, Ada'nın tasarımı için katı şartlar geliştirdiğinde, dilin "kuvvetle yazılmış olması" şartını da içeriyordu. (O zamanlar "şiddetle yazılmış" fikrinin kendiliğinden açık olduğuna inanılıyor gibi görünüyordu. ) Cevap olarak gönderilen tüm dil tekliflerinin "şiddetle yazıldığını" iddia etti. Dijkstra, tüm dil önerilerini analiz ettiğinde, hiçbirinin kesin olarak yazılmadığını ve aslında terimin ne anlama geldiğini net olarak anlamadığını buldu. Rapora bakınızEWD663 . Bununla birlikte, terimin şu an tekrar kullanıldığını görüyorum, terimin damalı tarihini bilmeyen genç nesil araştırmacılar tarafından.

"Statik olarak yazılmış" terimi, tüm tip kontrolünün statik olarak yapıldığı ve çalışma zamanında herhangi bir tip hatası oluşmayacağı anlamına gelir. Dil de kuvvetli bir şekilde yazılırsa, bu yürütme sırasında gerçekten hiçbir tür hata olmadığı anlamına gelir . Öte yandan, tip sisteminde tip delikleri varsa, çalışma zamanı tipi hatalarının olmaması hiçbir şey ifade etmez. Sonuçlar tamamen bozulabilir.

"Güçlü ve zayıf yazma" konusundaki yeni tartışma, belirli tip dönüşümlere izin verilip verilmeyeceği ile ilgili gibi görünüyor. Bir tamsayı gereken bir dize izin vermek, bu millet göre "zayıf yazma" dir. Bunun bir anlamı vardır, çünkü bir dizgiyi bir tamsayıya dönüştürmeye çalışmak, dize bir tamsayıyı temsil etmezse başarısız olabilir. Ancak, bir tamsayı bir dizeye dönüştürmek bu sorunu yaşamaz. Bu insanlara göre "zayıf yazma" örneği olur mu? Hiç bir fikrim yok. "Zayıf yazma" konusundaki Wikipedia tartışmalarının hakemli yayınlardan alıntı yapmadığını fark ettim. Tutarlı bir fikir olduğuna inanmıyorum.

Not eklendi : Temel nokta, "güçlü yazma" teriminin, kesin bir tanımı olan teknik bir terim olarak kullanılmadığıdır. Bazı dil tasarımcılarının daha çok hissettikleri gibiydi: "yazım sistemimiz güçlü; tüm yazım hatalarını yakalar; yazım delikleri olmaz" ve bu nedenle, dil tasarımlarını yayınladıklarında, "şiddetle yazıldığını" iddia ettiler . Kulağa hoş gelen bir ses geldi ve insanlar kullanmaya başladı. Cardelli-Wegner makalesi, ne anlama geldiğiyle ilgili bir analizin nerede yapıldığını gördüğüm ilk makaleydi. Buradaki görevim, konumlarının detaylandırılması olarak düşünülmeli.


Tarihsel gelişim için bazı referanslar verebilir misiniz? "çalışma zamanı türü hatalarının olmaması hiçbir şey ifade etmez" - burada derleme zamanı mı demek istiyorsunuz?
Raphael

İşte Google Akademik'te ortaya çıkan Öklid ile ilgili bir makale . Dillerin kuvvetle yazıldığını iddia ettiği 70'lerde birkaç yazı gördüğümü hatırlıyorum. Genellikle bir satış perdesi olarak düşünüldü.
Uday Reddy

1
@Raphael. "Çalışma zamanı tipi hataları" demek istedim. Çalışma zamanı elde etmek için, programın ilk önce statik tip denetleyiciyi geçmesi gerekir. Mesele şu ki, kuvvetle yazılmış bir dil, örneğin Java, derleme zamanında kontrol edemediğinde çalışma zamanında yazım hataları verecektir. C tipi bir delik dili, çalışma zamanının hata vermek yerine çöp üretmesine izin verir.
Uday Reddy

1
@benmachine. Alıntı yaptığım Euclid gazetesinde "tür kontrolü" bölümüne bakınız. Bence asıl mesele, "şiddetle yazılmış" bir vızıltı kelimesidir. Teknik bir kavram değil. En iyi ihtimalle, bunun teknik içeriği hiçbir tür delik olmadığı anlamına gelir.
Uday Reddy

1
İki farklı bir tam sayıdır tipi aynı gösterimi tipik bir modern uygulanması üzerine (örneğin, her ikisi de intve long32 bit olan, ya da her ikisi longve long longbir bu tip bir işaretçi bir depolama yazmak ve başka tür bir işaretçi kullanır için kullandığı 64, bir program Okumak, genellikle tespit edilebilir bir çalışma zamanı hatasını tetiklemeyecektir, ancak keyfi başka şekillerde keyfi olarak arızalanabilir Modern C böylece Ritchie'nin dilindeki kaliteli uygulamaların sahip olduğu herhangi bir anlam kazanmadan, diğer dillerin tip güvenliğini kaybeder. daha önce döviz teklifinde bulundu
supercat

7

Uday Reddy'nin cevabında bulunan Türleri Anlama, Veri Soyutlama ve Polimorfizm (1985) adlı makalesi aşağıdaki cevapları vermektedir:

Her ifadenin türünün statik program analizi ile belirlenebileceği programlama dillerinin statik olarak yazıldığı söylenir. Statik yazım yararlı bir özelliktir, ancak tüm değişkenlerin ve ifadelerin derleme zamanında bir türe bağlanması zorunluluğu bazen çok kısıtlayıcıdır. Türün statik olarak bilinmemesine rağmen, tüm ifadelerin tür tutarlı olması garanti edilmesinin gerekliliği zayıf gereklilik ile değiştirilebilir; Bu, genellikle bazı çalışma zamanı türü denetimi tanıtılarak yapılabilir. Tüm ifadelerin tutarlı olduğu dillere kesin olarak yazılmış diller denir. Eğer bir dil güçlü bir şekilde yazılırsa, derleyicisi kabul ettiği programların yazım hataları olmadan çalışacağını garanti edebilir. Genel olarak, güçlü yazma için çaba sarf etmeli ve mümkün olduğunda statik yazmayı benimsemeliyiz.


Bunu bulma kredisini haketmediğimden topluluk wiki olarak gönderildi.
Ben Millwood

Buradaki sorun svick'in ilk yorumu ile ilgilidir. Güçlü yazmanın tanımını bulmanız iyi olsa da, bu kesinlikle yaygın olarak kabul edilen bir tanım değildir.
Eda-qa mort-ora-y

@ edA-qamort-ora-y: Bunu hangi temelde söylüyorsunuz? Yaygın olarak kabul edilen ve neyin kabul edilmediği için anekdot kanıtlarından daha iyi bir şeyiniz var mı? Alıntı var mı? (Olmasa bile geçerli bir noktaya sahip olabileceğinizi anlıyorum, ancak yukarıdaki soruya cevap verdiğini düşünüyorum; oy birliği olmasa bile, ciddi akademik cevaplardan en az birini bilmek iyidir).
Ben Millwood

1
Tanım konusunda hemfikir olduğumuzu kanıtlayamıyorum. Mantıksal olarak mümkün değil. Bununla birlikte, Wikipedia'da güçlü yazı yazmakla ilgili makaleler, anlaşmazlık ve çelişki için birçok kanıt ve referans sağlar. en.wikipedia.org/wiki/Strong_typing
edA-qa mort-ora-y 14:12 '

@ edA-qamort-ora-y: Wikipedia'dan yapılan alıntılar aslında bu kadar yardımcı olmuyor: bazıları akademik değil, bazıları ise terimleri tanımlamaktan başka nedenlerden kaynaklanıyor. Tipik Programlama makalesi ümit verici görünüyor, ancak yalnızca çok kısa sürede geçen tanımlara atıfta bulunuyor; Belki de cevabımı düzenlemeye değer. Devamsızlık kanıtı ile ilgili olarak, neden bahsettiğini bilen insanlar arasındaki tartışma / anlaşmazlık kanıtlarının benim için yeterli olacağını düşünüyorum (ki bu, Tipik Programlama makalesi bana verebilir).
Ben Millwood

6

Yetkili cevaplar Cardelli ve Wegner'in anket makalesinde bulunabilir: Türleri Anlama, veri soyutlama ve polimorfizm .

"Güçlü yazma" kabul edilmiş bir anlama sahipken, "zayıf yazma" demediğine dikkat edin. Herhangi bir güçlü yazım hatası, zayıf olarak kabul edilebilir ve insanlar ne tür bir başarısızlığın kabul edilebilir olduğu ve ne olmadığı konusunda farklı olabilir.



Mükemmel, tam istediğim buydu. Makale biraz okuma alıyor, bu yüzden göze çarpan noktaları özetleyen bir cevap olması gerektiğini düşünüyorum. Bunları sizin cevabınıza göre mi düzenlemeliyim yoksa kendi topluluk wiki cevabımı mı göndermeliyim? Her iki durumda da, bir başkasının herhangi bir girişi olması durumunda, birkaç gün daha vereceğim, sonra kalanları kabul edin :)
Ben Millwood

@benmachine. Makalenin tamamı okunmaya değer, ancak üst düzey kavramsal konular yalnızca ilk iki bölümde ele alınmaktadır.
Uday Reddy

4
Hala bu sayfada özetlenmesi gerektiğini düşünüyorum. Bağlantı daha sonra sona erebilir.
Ben Millwood

@benmachine. Sorunuza kendi cevabınız olarak bir özet gönderebilirsiniz.
Uday Reddy
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.