"Statik yazma" ve "dinamik yazma" gibi ifadeler çok fazla etrafa fırlar ve insanlar çok farklı tanımlar kullanmaya meyillidir, bu yüzden ne demek istediğimizi açıklığa kavuşturalım.
Derleme zamanında denetlenen statik türleri olan bir dil düşünün. Ancak, bir tür hatasının yalnızca ölümcül olmayan bir uyarı oluşturduğunu ve çalışma zamanında her şeyin ördek tipinde olduğunu söyleyin. Bu statik türler yalnızca programcının rahatlığı içindir ve kodgenleri etkilemez. Bu, statik yazmanın kendi başına herhangi bir sınırlama getirmediğini ve dinamik yazarak karşılıklı olarak dışlanmadığını göstermektedir. (Amaç-C buna benzer bir şeydir.)
Ancak çoğu statik tip sistem bu şekilde davranmaz. Statik tip sistemlerin sınırlamalar getirebilecek iki ortak özelliği vardır:
Derleyici, statik tür hatası içeren bir programı reddedebilir.
Bu bir sınırlamadır, çünkü çoğu güvenli program mutlaka statik bir tür hata içerir.
Örneğin, hem Python 2 hem de Python 3 olarak çalıştırılması gereken bir Python betiğim var. Bazı işlevler parametre türlerini Python 2 ve 3 arasında değiştirdi, bu yüzden şöyle kod var:
if sys.version_info[0] == 2:
wfile.write(txt)
else:
wfile.write(bytes(txt, 'utf-8'))
Bir Python 2 statik tipi denetleyicisi, hiçbir zaman çalıştırılmasa bile Python 3 kodunu (ve tersi) reddeder. Güvenli yazım programım statik bir yazım hatası içeriyor.
Başka bir örnek olarak, OS X 10.6'da çalıştırmak isteyen, ancak 10.7'deki yeni özelliklerden faydalanan bir Mac programını düşünün. 10.7 yöntemleri çalışma zamanında bulunabilir veya bulunmayabilir ve bunları algılamak için benim üzerimde programcıdır. Statik bir tür denetleyicisi, tür güvenliğini sağlamak için programımı reddetmek veya çalışma zamanında bir tür hatası (işlev eksik) üretme olasılığı ile birlikte programı kabul etmek zorunda kalır.
Statik tip kontrolü çalışma zamanı ortamının derleme zamanı bilgisi tarafından yeterince tanımlandığını varsayar. Ancak geleceği tahmin etmek tehlikeli!
İşte bir tane daha sınırlama:
Derleyici, çalışma zamanı türünün statik tür olduğunu varsayan kod oluşturabilir.
Statik türlerin "doğru" olduğunu varsaymak, optimizasyon için birçok fırsat sağlar, ancak bu optimizasyonlar sınırlayıcı olabilir. İyi bir örnek, proxy nesneleri, örneğin uzaklaştırmadır. Diyelim ki yöntem çağrılarını başka bir işlemde gerçek bir nesneye ileten bir yerel proxy nesnesi olsun. Proxy'nin genel (herhangi bir nesne olarak maskelenebilir) ve saydam olması (mevcut bir kodun bir proxy ile konuştuğunu bilmesine gerek kalmaması için) iyi olurdu. Ancak bunu yapmak için, derleyici statik türlerin doğru olduğunu varsayan, örneğin statik çağrılar yöntem çağrıları yaparak, nesne gerçekten bir proxy ise başarısız olacağı için kod üretemez.
Bu tür bir uzaktan çalıştırmaya örnek olarak ObjC’nin NSXPCConnection veya C # ’s ŞeffafProxy (uygulamalarında çalışma zamanında birkaç önleme yapılması gerekebilir - tartışma için buraya bakınız ).
Kodgen statik türlere bağlı olmadığında ve mesaj iletme gibi olanaklara sahipseniz, proxy nesneleri, hata ayıklama, vb. İle birçok harika şey yapabilirsiniz.
Bu yüzden, bir tür kontrolcüyü tatmin etmeniz gerekmiyorsa, yapabileceğiniz bazı şeylerin bir örneği budur. Sınırlamalar statik tipler tarafından değil, zorunlu statik tip kontrolü tarafından uygulanmaktadır.