Tartışmayı çevreleyen çok sayıda güçlü görüş var ama açıkçası bu aslında bir fikir meselesi değil, gerçekler meselesi . Bu yüzden ampirik araştırmalara bakmalıyız . Ve bundan elde edilen kanıtlar açık:
Evet , statik yazım değiş tokuşa değer - sadece bir miktar değil, aynı zamanda esasen . Aslında, sağlam kanıtlar statik yazmanın koddaki hata sayısını en az% 15 azaltabileceğini göstermektedir (ve bu düşük bir tahmindir, gerçek yüzde neredeyse kesinlikle daha büyüktür). Bu şaşırtıcı derecede yüksek bir rakam: Sanırım çoğu statik yazım yanlısı bile bu kadar sert bir fark yaratabileceğini düşünmüyordu.
Bunu göz önünde bulundurun: eğer biri size projenizdeki hataları% 15 oranında azaltmanın basit bir yolu olduğunu söyleseydi, bu hiç akıllıca olmaz. 1 Neredeyse meşhur gümüş mermi.
Kanıt, Yazılacak veya Yazılmayacak makalesinde sunulmuştur : JavaScript'te Algılanabilir Hataların Ölçülmesi , Zheng Gao, Christian Bird ve Earl T. Barr. Herkesi okumaya teşvik ediyorum, bu örnek araştırma sunan iyi yazılmış bir makale.
Yazarların analizlerini ne kadar titizlikle yaptıklarını kısaca özetlemek zordur ancak işte size çok kaba bir taslak:
TypeScript ve Flow , uyumlu olmalarına rağmen yazım ipucu ve statik yazım denetimi ekleyen JavaScript'i temel alan iki programlama dilidir. Bu, mevcut kodun türlere göre artırılmasına ve ardından kontrol etmesine izin verir.
Araştırmacılar GitHub'dan JavaScript'te yazılmış Açık Kaynak projeleri topladılar, çözümlenmiş hata raporlarına baktılar ve bildirilen her bir hatayı TypeScript ya da Flow'ın statik tip denetleyicisi tarafından yakalanacak bir koda indirgeme girişiminde bulundular. Bu, statik yazım kullanarak sabitlenebilecek hata yüzdesinin daha düşük bir sınırını tahmin etmelerini sağladı.
Araştırmacılar, analizlerinin türle ilgili olmayan bir hatayı türlerle ilgili olarak değerlendirmemesi için kesin önlemler aldı. 2
Geçmiş çalışmalarla karşılaştırıldığında, bu yeni çalışmanın belirli güçlü yönleri var:
- JavaScript ile TypeScript / Flow arasındaki tek fark yazım olduğundan, çok az (varsa) karıştırıcı faktörle statik ve dinamik yazmanın doğrudan karşılaştırması vardır .
- Hem TypeScript hem de Flow (yani farklı tip sistemler) kontrol ederek ve farklı kişilerin hataları düzeltmek için (manuel) tip ek açıklamaları çoğaltmasını sağlayarak birden fazla boyutta çoğaltma gerçekleştirirler. Bunu farklı projelerden çok sayıda kod temelinde gerçekleştiriyorlar.
- Kağıt, statik yazmanın düzeltilebilir hatalar üzerindeki doğrudan etkisini ölçer (biraz daha belirsiz bir kalite yerine).
- Yazarlar neyin ölçüleceğine ve nasıl ön plana alındığına dair titiz bir model tanımlamaktadır. Dahası, açıklamaları inanılmaz derecede açıktır ve kusurları analiz etmeyi kolaylaştırır (bir araştırma makalesinin kendisini saldırılara açtığı zaman her zaman iyidir: eğer hiçbir saldırı tartışmalarını engelleyemezse, daha da güçlüdür). 3
- Numune büyüklüklerinin yeterli olması için uygun güç analizleri yaparlar ve sonraki istatistiksel analizleri hava sızdırmazdır.
- Şaşırtıcı açıklamaları dışlamak ve sadece tek bir hareketli parçayı ölçmek için aşırı muhafazakarlar. Ayrıca, analizlerini türler ekleyerek anında düzeltilebilecek hatalarla sınırlandırırlar ve yazmayı sağlamak için daha gelişmiş yeniden düzenlemeyi gerektirebilecek her şeyi hariç tutarlar. Yani gerçekte, etki makul bir şekilde çok daha büyük, ama kesinlikle bildirdiklerinden daha küçük değil.
- Ve son olarak, hafif bir etki bulamazlar, şaşırtıcı bir fark bulurlar . Aşırı muhafazakar prosedürlerine rağmen,% 95 güven aralığının en düşük ucunda bile, böceklerin asgari% 10 kontrolleri ile kolayca kaybolabilecekleri en az% 10 hata olduğunu bulmuşlardır.
Kağıtta henüz kimsenin keşfetmediği temel bir kusur olmadığı sürece, kağıt, neredeyse hiç bir ücret ödemeden, statik tiplemenin büyük bir faydasını kesin olarak göstermektedir. 4
Tarihsel bir kayda göre, programlamada disiplinleri yazmaya ilişkin araştırmalar sert bir başlangıç yapmış çünkü uzun süredir kanıtlar açık değildi . Bunun nedeni, statik ve dinamik yazmanın etkisini incelemek için sistematik deneyler yapmak kolay değildir: Sistematik bir deney araştırdığımız etkiyi izole etmelidir. Ve ne yazık ki, programlama dillerine bağlı olduğundan, yazma disiplininin etkisini izole edemeyiz.
Aslında farklı lehçelerde hem statik hem de dinamik yazmaya izin veren programlama dilleri vardı (ör. VB Option Strict
On
ya Off
da ya da statik olarak yazılmış Lisp). Bununla birlikte, bunlar doğrudan bir karşılaştırma için pek uygun değildi, çünkü en önemlisi, doğrudan karşılaştırmaya izin veren yeterince büyük bir kod tabanı mevcut değildi. En iyi ihtimalle onları “laboratuvar ayarları” nda karşılaştırabiliriz; burada test konuları rastgele bir dili statik ya da dinamik olarak yazılmış bir değişkende çözer.
Maalesef, bu yapay programlama ödevleri gerçek dünya kullanımını iyi bir şekilde modellemiyor. Özellikle, çoğu kapsam bakımından küçüktür ve metnin yarım sayfasında özetlenebilen iyi tanımlanmış bir sorunu çözer.
Neyse ki geçmişte kaldı, çünkü TypeScript, Flow ve JavaScript aslında statik yazım dışında aynı diller ve geniş bir gerçek dünya kod ve hata kodları örneklemesi var.
1 Orijinal belgeden yapılan alıntıdan ilham alınmıştır.
2 Bundan tamamen memnun değilim: statik olarak yazılan dillerin en güçlü yanlarından biri, görünüşte ilişkisiz sorunların statik olarak kontrol edilebilecek şekillerde ifade edilebiliyor olmasıdır. Bu, birçok mantık hatasını tür hatalarına dönüştürür ve bu da statik yazarak yakalanabilecek hata oranını büyük ölçüde artırır. Aslında, kağıt türü ile ilgili olmayan hataları kabaca sınıflandırır ve bunların büyük bir yüzdesinin aslında statik yazarak yakalanabileceğini iddia ediyorum.
3 Herhangi bir kişiyi, özellikle dinamik yazım savunucularını, analizde eksiz kusurları bulmaya davet ediyorum. Çok fazla (varsa) olduğunu düşünmüyorum ve potansiyel bir kusurun sonucu önemli ölçüde değiştirmeyeceğinden eminim.
4 Gerçek, büyük ölçekli projelerdeki statik yazım maliyetinin mevcut olmadığından şüpheleniyorum, çünkü mimarinin doğal bir parçası haline geliyor ve hatta planlamayı basitleştirebilir . Statik tip hataların düzeltilmesi zaman alır ancak daha sonra keşfedilen hatalardan çok daha az zaman alır. Bu kapsamlı bir şekilde deneysel olarak çalışılmıştır ve onlarca yıldır bilinmektedir (bkz. Örneğin Kod Tamamlama ).