Bu bir arkadaşımla bir tartışma başlattı ve kendimi iyi bir argüman düşünmek için zorlandım. Zayıf yazmanın faydaları nelerdir?
Bu tür bir tartışma ile ilgili sorun, basitçe, "zayıf yazma" ve "güçlü yazma" terimlerinin, örneğin "statik yazma", "dinamik yazma", "açık yazma", "örtülü yazma", "terimlerinin aksine tanımlanmamış olmasıdır. ördek tipleme "," yapısal tipleme "veya" nominal tipleme ". Heck, hala açık araştırma ve tartışma alanları olan "manifest tipleme" ve "gizli tipleme" terimleri muhtemelen daha iyi tanımlanmıştır.
Bu nedenle, arkadaşınız bir tartışmanın temeli olarak işlev görecek kadar kararlı olan "zayıf yazma" teriminin bir tanımını sunana kadar, bu soruya cevap vermek bile mantıklı değildir.
Ne yazık ki, Nick'in cevabı dışında, cevaplayanların hiç biri de tanımlarını vermekle uğraşmadı ve bazı yorumlarda ortaya çıkan karışıklığı görebilirsiniz. Söylemesi zor, çünkü kimse aslında tanımlarını sunmuyor, ama sanırım en azından üç farklı olanı sayıyorum, sadece bu sayfada.
Daha sık kullanılan tanımlardan bazıları (ve evet, ben biliyorum , bunların hiçbirinin mantıklı olmadığını, ancak bunlar tanımladığım tanımlar. Görülen insanlar aslında kullanır):
Ancak en sık kullanılan üç tanım
Herkes "zayıf yazmanın" bile ne olduğunu tanımına katılmadıkça, avantajlarının ne olabileceğini düşünmek bile mantıklı değildir. Neyin avantajları? Daha da kötüsü, hiç tanım yoksa , o zaman herkes tanımlarını argümanlarına uyacak şekilde değiştirebilir ve her tartışmanın çözülme garantisi vardır bir flamewar içine.
Ben kendim yıllar içinde birçok kez kendi tanımımı değiştirdim ve artık terimleri artık yararlı görmediğim bir noktaya geldim. Ayrıca zayıf yazmanın (çeşitli tanımlarında) Shell komut dosyasında bir yeri olduğunu düşünürdüm, ancak Bash ve PowerShell'de aynı sorunu çözmek zorunda kaldığımda, ne kadar yanlış olduğumu acılı bir şekilde hatırlattım.
Sıkça karıştırılan iki ana kavram olduğunu unutmayın:
Bir programlama dilinin, tür kontrolünün büyük çoğunluğunun derleme zamanında aksine çalışma zamanında gerçekleştirildiği zaman dinamik olarak yazıldığı söylenir. Dinamik yazarken değerlerin türleri vardır ancak değişkenler yoktur; diğer bir deyişle, bir değişken herhangi bir türdeki bir değeri ifade edebilir.
Buradaki avantajlar genellikle sadece "yeni" programcılar için reddedilir, ancak herhangi bir programcı için de uygun olabilir:
if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever
Aksi takdirde yeni bir değer vermek veya atamak zorunda olduğunuz her durumda daha az kod:
if (data is Array)) {
i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}
Zayıf yazma, bir dilin kullanıldığında türleri dolaylı olarak dönüştürdüğü (veya yayınladığı) anlamına gelir.
Yararları:
Örtülü boole değerlendirmesi . Her tür boole olarak değerlendirilebilir. Bunun ayrıca bir ||
Öğesinin bir bölümü boole'ye dönüştürülmeden atamada kullanılabilecek yan faydaları vardır:
var a = param || defaultValue;
Yine, daha az kod:
var num = 5;
var str = "Hello";
input.innerHTML = input.value = num;
for (var i=0; i < input.value; i++) { ... }
Hatta Java nesneleri bir String
ile birleştirirken örtülü .toString()
çağrısıyla partway'e gitmek zorunda kaldı; aksi takdirde Java = programcılar gün boyu onu lanetliyorlardı (log deyimleri kontrolden çıkmış olacaktı).
Her iki tanım da http://en.wikipedia.org/wiki/Type_system adresinden alınmıştır. Benden daha iyi dedi.
Temel argüman for zayıf yazma performanstan biridir. (bu OP'nin sorusunu belirtildiği gibi cevaplamak içindir). Dinamik ve statik, örtük ve açık hakkında birçok iyi tartışma var. vb.
C, en ünlü zayıf yazılan dildir ve değişken türünün herhangi bir çalışma zamanı denetimi veya derleme zamanı denetimi yapmaz. Temelde bir char *
'İ int *
' A atabilirsiniz ve dil umursamaz. Peki bunu neden yaptın?
C programlama, Assembly ile bir şeyler yapma yönteminize oldukça yakındır, bu yüzden sadece bir adresi önemsediğiniz zamanlar vardır. Bu nedenle void *
Referansını yayınlamak veya iletmek nadir değildir. Belleğin nasıl düzenlendiğini biliyorsanız (yine bir C ve Meclis endişesi), ihtiyacınız olan bilgilere ulaşmak için void *
İçindeki adrese dayalı bazı harika hesaplamalar yapabilirsiniz. Bu, Java) içinde gerçekleştirmeniz gereken işlemi kısa devre yapabilmenizi sağlar.
Çalışma zamanı tür denetlemesinin olağanüstü bir ek yükü olmasa da, kritik bir bölümün çok yavaş olmasına neden olacak zamanlar vardır. Bu durumda çoğunlukla gömülü programlama ve gerçek zamanlı sistemler hakkında düşünüyorum.
Bununla birlikte, çoğu durumda derleme zamanı denetlenen veya çalışma zamanı denetlenen güçlü bir tür sisteme sahip olmak acıdan daha sık yardımcı olur.
Zayıf yazım, örneğin Excel, javascript ve vbscript gibi şeylerde yeni başlayanların kavraması için genellikle daha kolaydır. Ayrıca, olası hatalar için bazı geliştirme hızları ile işlem yapabilirsiniz.
Bu konuda iyi bir makale: Güçlü yazım vs Güçlü test