Zayıf yazma lehine hangi argümanlar var?


40

Bu bir arkadaşımla yapılan bir tartışmada ortaya çıktı ve kendimi iyi bir argüman düşünmek için zorlandım. Zayıf yazmanın yararları nelerdir?


17
Cooper ve Torczon's Engineering a Compiler , zayıf tipleme sistemlerini kötü tasarlanmış tipte bir sistem kullanarak tanımlar. Bu kesinlikle kimseye fayda sağlayamayacak gibi gelmiyor.
Corbin

@Corbin Mart: Güzel. Bunu listeme eklemeliyim.
Jörg W Mittag

5
En iyi argüman şirket yöneticileri tarafından verilebilir: sistemimi kurmak için ucuz insanları işe almama izin veriyor
Vector

Yanıtlar:


46

Bu tür bir tartışmanın sorunu basitçe "zayıf yazma" ve "güçlü yazma" terimlerinin tanımsız olmasıdır, örneğin "statik yazma", "dinamik yazma", "açık yazma", "açık yazma", " Ördek yazarak "," yapısal yazarak "veya" nominal yazarak ". Heck, hala açık araştırma ve tartışma alanları olan “tezahür yazmaya” ve “gizli yazmaya” terimleri bile daha iyi tanımlanmıştır.

Bu nedenle, arkadaşınız bir tartışmanın temeli olarak hizmet edecek kadar istikrarlı olan "zayıf yazma" teriminin bir tanımını sunana kadar, bu soruyu cevaplamak bile mantıklı gelmiyor.

Maalesef, Nick'in cevabından ayrı olarak, cevap verenlerin hiç kimse tanımlarını sağlamak için zahmet etmedi ve bazı yorumlarda ortaya çıkan karışıklığı görebilirsiniz. Söylemesi zor, çünkü kimse aslında tanımlarını vermedi, ancak sanırım bu sayfada en az üç farklı olanı sayıyorum.

Daha yaygın olarak kullanılan tanımların bazıları (ve evet, bunların neredeyse hiçbirinin bir anlam ifade etmediğini biliyorum , ancak bunlar insanların kullandığı tanımlarıdır):

  • zayıf yazma = güvenli olmayan 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 = açık yazma / güçlü yazma = açık yazma
  • zayıf yazma = gizli yazma / güçlü yazma = açık yazma
  • zayıf yazma = yazma yok / güçlü yazma = yazma
  • Zayıf Yazma = kapalı yayınlar / Güçlü Yazma = yalnızca açık yayınlar
  • zayıf yazma = kapalı veya açık yayınlar / güçlü yazma = hiçbir sonuç yok
  • zayıf yazma = açık dönüşümler / güçlü yazma = 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

Bununla birlikte, en yaygın şekilde kullanılan üç tanım ,

  • zayıf yazma = aptal boktan programlama diliniz / güçlü yazma = benim süper harika programlama dilim
  • zayıf yazma = diğer tüm programlama dilleri / güçlü yazma = öğrenmek için şimdiye kadar rahatsız ettiğim tek programlama dili (genellikle Java, C # veya C ++; garip bir şekilde, örneğin Haskell veya Scheme'yi ilk ve tek dili olarak öğ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ğinizde C # veya C ++ ile değiştirme)

Herkes bile neyi "zayıf yazarak" nın tanımı üzerinde kabul etmedikçe olduğunu , hatta duyu avantajları ne olabileceğini düşünmek yapmaz. Neyin avantajları? Hiçbir tanım varsa da kötüsü, hiç , o zaman herkes sadece kendi argümanlarını uyacak şekilde kendi tanımlarını kayabilir ve her tartışma hemen hemen bir flamewar devretmek için garanti edilir.

Ben kendim yıllar geçtikçe kendi tanımımı kişisel olarak değiştirdim ve artık terimleri daha yararlı bulmadığım bir noktaya geldim. Ayrıca, zayıf yazmanın (çeşitli tanımlarında) kabuk komut dosyasında bir yeri olduğunu düşünürdüm, fakat ne zaman Bash ve PowerShell'de aynı problemi çözmek zorunda kalsam, ne kadar hatalı olduğumu acı bir şekilde hatırlattım.


5
Oldukça alaycı cevap! Nereden geldiğini anlıyorum ama bir tanım sağlamayan kimsenin "zayıf ve / veya dinamik tipleme" den bahsettiğini tahmin etmenin "yeterince iyi" olduğunu düşünüyorum. Mükemmel olmadığını biliyorum, ancak çoğu kişi, tip sistemleri tanımlamak konusunda kararsız görünüyor.
Nicole

7
@Renesis: Buna "gerçekçilik" diyeceğim :-) İnsanların yarısının tamamen farklı şeyler hakkında konuştuğunu anlamadıklarını ve diğerlerinin ne konuştuğunu anlamadıklarını anlamak için tip sistemleri hakkında yeterince tartışma gördüm. yaklaşık olarak . Birkaç ay önce, ismini vermeyeceğim bir dilin ana gelişme listesinde, performansı iyileştirmek için isteğe bağlı bir tür sistemi eklemek üzerine bir tartışma yapıldı. Bu tartışma bir hafta boyunca devam etti, onlarca insan ve yüzlerce posta içeriyordu. Değil bir isteğe bağlı bir tür sistemi fark tanımı gereği performansını artırmak mümkün değil. …
Jörg W Mittag

8
Sinizm için +1! "Güçlü yazma = IDE değişkenlerimin tiplerini bildiğinde (Intellisense vb.), Zayıf yazma = olmadığında)"
user281377

1
Yazma sistemleri için daha iyi tanımlanmış isimler, zayıf ve güçlü olan kapalı değer yargısından yoksundur .
Eva,

1
Muhteşem, eğlenceli ve doğru. Tip sistemleri hakkında ne kadar çok şey öğrendim, bir dilin diğerinden farklı olduğu illüzyonunda ne kadar süre yaşadığımı fark ettim. Bu kavramın ne kadar kafa karışıklığına yol açtığı şaşırtıcı ve gerçekten zayıf / güçlü olanın gerçek bir şey olmadığını kabul edersek bunun gerçekten gerekli olmadığını düşünüyorum.
Brian

25

Unutmayın, genellikle karışık olan iki ana kavram vardır:

Dinamik yazma

Bir programlama dilinin, tür kontrolünün çoğunluğu derleme zamanında olduğu gibi çalışma zamanında yapıldığında dinamik olarak yazıldığı söylenir. Dinamik yazımda, değerlerin türleri vardır, ancak değişkenler yoktur; yani, bir değişken herhangi bir türden bir değeri ifade edebilir.

Buradaki avantajlar genellikle "yeni" programcılar için olduğu gibi 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 vermeniz veya atamanız gereken durumlarda 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 yazım tiplerini dolaylı olarak dönüştürdüğü (veya çevirdiği) anlamına gelir.

Yararları:

  • Herhangi bir tip değerini bir fonksiyona 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ük boole değerlendirmesi . Herhangi bir tür bir boole olarak değerlendirilebilir. Bu ayrıca, ||boole dönüştürmeden atamada kullanılabilecek bir parçanın bir parçası gibi yan faydalara da sahiptir :

    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++) { ... }
    

    .toString()Nesneleri a ile birleştirirken Java'nın bile kısmi çağrı yapması gerekiyordu String; Aksi takdirde, Java programcıları bütün gün boyunca küfredeceklerdi (log ifadeleri kontrolden çıkacaktı).


Her iki tanım da http://en.wikipedia.org/wiki/Type_system ' dendir . Benden daha iyi olduğunu söyledi.


1
Dinamik yazma, statik olarak yazılmış bir dilde çok sayıda kod üretmenin gerekli olduğu durumlarda da faydalıdır. Dinamik olarak yazılmış dillerde (PHP, Python, vb.) C # ile ORM kütüphaneleri için Entity Framework için gerekli kod oluşturma miktarını karşılaştırın. Bazıları IDE IntelliSense’in yararlarının tüm bu kod üretme maliyetinden daha ağır olduğunu iddia etse de ...
Dean Harding

3
Yorumunuz "// no i = ((Array) data) .length veya Array myArr = (Array) data;" derleme zamanında veri dizilimi kanıtlanabileceği için dinamik yazma ile ilgisi yoktur. Statik olarak yazılmış bir dil, bilgiden elde edilen bilgiyi yayabilir.
Peter Taylor

@Peter Taylor, basit durumlarda bunun doğru olduğunu varsayalım, bunu yapanları biliyor musunuz? Bir ifbloğun kullanılmasının ya da daha karmaşık (hatta çalışma zamanı ya da dinamik) bir mantığın kullanılmasının bir sonraki satırın hatalara karşı yasal ve güvenli olacağına dinamik yazma ile ilgili olması gerekir.
Nicole

@Resis, hayır, hayır. Ancak, ML dil ailesi, statik olarak yazılmıştır ve tür çıkarımı kullanır, bu nedenle bir değişkenin türünü açıkça belirtmeniz gerekir.
Peter Taylor

1
@ Peter Taylor doğru. Dinamik yazmanın yararlarının çoğu, bazı durumlarda Haskell, Scala ve hatta C # gibi daha iyi statik yazma sistemlerine sahip dillerde mevcuttur. Dinamik yazmanın en büyük avantajı, HTML DOM gibi doğal olarak yazılmaz olan şeylerle başa çıkmak olduğunu söyleyebilirim. Neden node.attr yerine ["attr"] yazalım? Zaten her zaman çalışma zamanında çözülürler.
Matt Olenik

7

Ana argümanı için zayıf yazarak performans biridir. (Bu OP'lerin sorusuna belirtildiği gibi cevap vermek içindir). Dinamik ve statik, örtük ve açık hakkında çok iyi tartışmalar var. vb.

C, zayıf yazılmış en ünlü dildir ve değişkenlerin türünde herhangi bir çalışma zamanı denetimi veya derleme zamanı denetimi yapmaz. Özünde bir yayınlayabileceğim char *bir etmek int *ve dil umurumda olmaz. Peki neden bunu yaptın?

C programlama, montaj ile işleri yapma biçiminize oldukça yakındır, bu yüzden sadece bir adrese önem verdiğiniz zamanlar vardır. Bu void *sebeple referans atmak ya da iletmek alışılmadık bir durum değil . Hafızanın nasıl düzenlendiğini biliyorsanız (yine bir C ve montaj endişesi), void *ihtiyacınız olan bilgiye ulaşmak için adrese dayanarak oldukça havalı hesaplamalar yapabilirsiniz . Bu, örneğin Java'da yapmanız gereken işlemi kısa devre yapmanıza izin verebilir.

Çalışma zamanı türü denetlemesinin olağandışı bir bit yükü olmamasına rağmen, kritik bir bölümün çok yavaş olmasına neden olmak için yeterli olan zamanlar vardır. Bu durumda daha çok gömülü programlama ve gerçek zamanlı sistemler hakkında düşünüyorum.

Bununla birlikte, çoğu durumda, derleme zamanı veya çalışma zamanı denetlenen derleme zamanı güçlü olan bir sisteme sahip olmak, incindiğinden daha sık yardımcı olur.


2
Güçlü bir şekilde yazılmış bir dilin neden C kadar verimli bir şekilde derlenemediğini anlamıyorum. Fakat derleyici çok daha karmaşık olmalı.
9000

2
C ++ böyle bir dilin bir örneğidir. C ++ 'da tüm tip kontrolü derleme zamanında yapılır, hiçbiri çalışma zamanında yapılmaz ... UNLESS RTTI özelliğini etkinleştirmediniz.
Berin Loritsch

2
Emin değilim bu performans argümanı ile kabul ama olan ilginç bir görünüm.
Martin Ba,

2

Zayıf yazma, yeni başlayanlar için örneğin excel, javascript ve vbscript gibi şeyler için genellikle daha kolaydır. Ayrıca olası hatalar için bazı geliştirme hızları takas ediyorsunuz.

Konuyla ilgili iyi yazı: Güçlü yazım vs Güçlü test


1
Zayıf yazılmış diller ile yeni başlayanlar dostu diller arasında güçlü bir yazışma olduğunu sanmıyorum. Yakut ve python şiddetle yazılmış ve genellikle yeni başlayanlar dostu olarak kabul edilir. C zayıf yazılır ve genellikle acemi düşman olarak kabul edilir.
sepp2k

Hayır, genel olarak dil değil, sadece yazarak hakkında konuşuyordum
Homde

2
Dinamik ve güçlü bir şekilde yazılmış, acemi dostu bir kombinasyon. Her ne kadar insanlar statik olarak yazılmış bir dilden, dinamik olarak yazılmış bir diline geçtiklerini görseler de, gerçekten kafaları karışıyor. Okullar çoğu zaman C veya Java öğretmeye başladıklarından beri dinamik olarak yazmaya başlamış birini hiç görmedim.
jsternberg

3
@Mchl: Statik / dinamik veya güçlü / zayıf yazarak ile ilgisi yoktur. Türleri bildirmek zorunda olmak, açık / örtülü yazma ile ilgilidir.
Jörg W Mittag

1
Olması da iyi olabilir;) Ben de açıkça açıkça örtük yazılan dile geçtim. Hatalıysam beni düzelt Pascal, statik, güçlü ve açık bir şekilde yazılırken, PHP dinamik, zayıf ve dolaylı olarak yazılmıştır, öyle değil mi?
Mchl
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.