Statik tip kontrolünün çok muhafazakar olmasının çelişkili bir örneği nedir?


9

Gelen Programlama Dilleri Kavramları , John Mitchell statik tür denetlemesi nedeniyle Durma Problemi ait (aşırı sıkı) mutlaka muhafazakar olduğunu yazıyor. Örnek olarak verir:

if (complicated-expression-that-could-run-forever)
   then (expression-with-type-error)
   else (expression-with-type-error)

Birisi gerçekten pratik bir endişe yaratacak bir cevap veremez mi?

Java, böyle durumlar için dinamik olarak kontrol edilen dökümlere izin verdiğini anlıyorum:

if (foo instanceof Person) {
    Person p = (Person) foo;
    :
}

ancak bunun çapraz dil meselesinden çok Java dili / derleyici eksikliğinin gerekliliğini düşünüyorum.


2
Verdiğin Java örneği olan olmayan yapmacık örnek statik tip denetimi çok tutucu olma. Başka bir deyişle, cevap aklınıza gelen tip sistemine bağlıdır. Geldiğimiz herhangi bir örnek için, her zaman bu örneği işleyebilecek bir tür sistemi olacaktır (tür sistemi bu örnekte çok muhafazakar değildir). Herhangi bir tip sistem için, her zaman çok muhafazakar olduğu bir örnek bulabiliriz. Bu yüzden, tip sistemini belirtmeniz gerektiğini düşünüyorum. Java tipi sistem aklınızda olan şey değilse, düşündüğünüz daha spesifik bir şey var mı? ML tarzı tür çıkarımı?
DW

örneğin, statik kod analizinin nec tip kontrolü değil, "muhafazakar" olduğu iddia edilebilir . "muhafazakar" ı tanımlamak yararlı olacaktır . tartışmasız tüm statik tip sistemler dinamik sistemlere kıyasla "muhafazakar" olacaktır çünkü birincisi tanım gereği derleme zamanında daha katıdır . ancak dinamik denetleme benzer (tür tabanlı) hataları da döndürebildiğinden , çalışma zamanında daha katı olmadığı da iddia edilebilir. ve bu arada, dillerdeki çalışma zamanı dinamik denetimli yayınlar bir eksiklik değildir , muhtemelen statik olarak kontrol edilen dillerde, muhtemelen kanıtlanamaz.
vzn

Yanıtlar:


7

Her zaman bir algoritmanın hiç ifade edilip edilemeyeceğinden çok daha kolay bir konu olarak gördüm. Eğer Mitchell'in uydurma programı gibi programları gerçekten çalıştırmak isteseydim, sadece uygun Turing Machine simülatörünü statik olarak yazdığım dile yazardım.

Statik tip sistemle ilgili püf noktası, sadece esnekliğin daha kolay korunabilen kod yazmanıza izin verdiği durumlarda doğru esneklik türlerini sunmaktır.

Dinamik olarak yönetilmesi bazen statik olarak yazılmış dillerden daha kolay olduğu düşünülen program yapılandırma tekniklerine ilişkin bazı örnekler.

Jenerikler ve Kaplar

ML (c. 1973) ve CLU'dan (c. 1974) önceki statik olarak yazılan dillerde , kırmızı-siyah bir dizgi ağacı, kırmızı-siyah bir tamsayı ağacı, kırmızı-siyah bir yüzen ağaç veya kırmızı-siyah ağaç öğeleri belirli türü Foo. Bununla birlikte, hem statik olarak kontrol edilen hem de bu veri türlerinden herhangi birini işleyebilen kırmızı-siyah bir ağacın tek bir uygulamasını oluşturmak zordu (belki imkansız). Problemin etrafındaki yollar (1) tip sisteminden tamamen kurtulmaktı (örneğin: kullanarakvoid * C), (2) kendinize bir tür makro önişlemci yazmak ve daha sonra istediğiniz her bir özel tip için kod üreten makrolar yazmak veya (3) ayıklanan türün türünü kontrol etmek için Lisp / Smalltalk (ve Java) yaklaşımını kullanmak nesne dinamik olarak.

ML ve CLU, genel, statik olarak yazılan kap tipleri yazmanıza izin veren sırasıyla çıkarılmış ve açıkça bildirilmiş (statik) parametreli türler kavramını tanıttı.

Tipi Polimorfizm

Simula67 (c. 1967) ve Hope (c. 1977) öncesi statik olarak yazılan dillerde , hem dinamik gönderim yapmak hem de her alt tip için vakayı kapsadığınızı statik olarak kontrol etmek mümkün değildi . Birçok dilde etiketlenmiş sendikalar vardı , ancak programlarının caseveya switchifadelerinin veya atlama tablolarının olası her etiketi kapsadığından emin olmak programcının sorumluluğundaydı .

Simula modelini (C ++, Java, C #, Eiffel) izleyen diller, derleyicinin her alt sınıfın üst sınıf tarafından bildirilen tüm yöntemleri uygulayıp uygulamadığını denetleyebileceği alt sınıflara sahip soyut sınıflar sağlar. Hope modelini izleyen dillerde (SML / NJ'den Haskell'e kadar tüm ML varyantları) derleyicinin her typecaseifadenin tüm alt türleri kapsadığını kontrol edebileceği cebirsel alt türleri vardır.

Maymun Düzeltme ve En Boy Odaklı Programlama

Dinamik tip sistemler çeşitli prototipleme tekniklerini çok daha kolay hale getirir. Türlerin, dizelerden işlevlere (örneğin, Python, Javascript, Ruby) hash haritaları ile temsil edildiği dillerde, belirli bir türe dayanan her modülün davranışını küresel olarak değiştirmek kolaydır; yazın.

Maymun yamalarının programların bakımını zorlaştırmak için kullanılabileceği açık yollar olsa da, "kötülük" yerine "iyi" için de kullanılabileceği yollar da vardır. Özellikle en boy yönelimli programlama ile , dosya türünü sanallaştırılmış bir dosya sistemine işaret edecek şekilde değiştirmek, "serbest" için birim test altyapılarının oluşturulmasına izin vermek veya basit istisna türlerini değiştirmek gibi şeyler yapmak için maymun yamalama teknikleri kullanılabilir. daha iyi hata ayıklama için yakalandıklarında günlük iletilerini yazdırın.

1970'lerde temel statik kontrol fikirlerinin bulunduğu Generics ve Subtype Polymorphism'den farklı olarak, yön odaklı programlama için statik kontrol (bence) aktif bir araştırma alanıdır. 2001'den beri AspectJ adında bir dil olması dışında pek bir şey bilmiyorum .

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.