it-swarm-tr.com

Zayıf yazma lehine hangi argümanlar var?

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?

41
Fishtoaster

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):

  • zayıf yazma = güvensiz yazma/güçlü yazma = güvenli yazma
  • zayıf yazma = dinamik yazma/güçlü yazma = statik yazma
  • zayıf yazma = ördek yazma/güçlü yazma = nominal yazma
  • zayıf yazma = yapısal yazma/güçlü yazma = nominal yazma
  • zayıf yazma = örtük yazma/güçlü yazma = açık yazma
  • zayıf yazma = gizli yazma/güçlü yazma = manifest yazma
  • zayıf yazma = yazma yok/güçlü yazma = yazma
  • zayıf yazım = örtük kastlar/güçlü yazım = sadece açık kastlar
  • zayıf yazım = örtük veya açık dökümler/güçlü yazım = hiç döküm yok
  • zayıf yazım = örtük dönüşümler/güçlü yazım = yalnızca açık dönüşümler
  • zayıf yazma = örtük veya açık dönüşümler/güçlü yazma = hiç dönüşüm yok
  • zayıf yazma = yorumlama/güçlü yazma = derleme
  • zayıf yazma = yavaş/güçlü yazma = hızlı
  • zayıf yazma = çöp toplama/güçlü yazma = manuel bellek yönetimi
  • zayıf yazma = manuel bellek yönetimi/güçlü yazma = çöp toplama
  • … Ve bircok digerleri

Ancak en sık kullanılan üç tanım

  • zayıf yazım = aptal boktan programlama diliniz/güçlü yazım = süper harika programlama dilim
  • zayıf yazım = diğer tüm programlama dilleri/güçlü yazım = öğrenmek için uğraştığım tek programlama dili (genellikle Java, C # veya C++; garip bir şekilde, örneğin ilk ve tek dili olarak Haskell veya Scheme'yi öğrenen insanlar paylaşmıyor gibi görünüyor bu dünya görüşü)
  • zayıf yazma = anlamadığım her dil/güçlü yazma = Java (isteğe bağlı olarak C # veya C++ ile değiştir)

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.

46
Jörg W Mittag

Sıkça karıştırılan iki ana kavram olduğunu unutmayın:

Dinamik yazma

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;
}

Gevşek veya zayıf yazma

Zayıf yazma, bir dilin kullanıldığında türleri dolaylı olarak dönüştürdüğü (veya yayınladığı) anlamına gelir.

Yararları:

  • Herhangi bir tür değerini bir işleve parametre olarak iletin . Geri aramalar, esnek API'ler için kullanışlıdır ve kapakların daha basit bir şekilde uygulanmasını sağlar.
  • Ö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.

25
Nicole

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.

7
Berin Loritsch

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

2
Homde