Kademeli Yazma: “Statik yazım sistemine sahip hemen hemen her dilde dinamik yazım sistemi de vardır”


20

Bu iddia ile Aleks Bromfield devletler:

Statik tip sistemli hemen hemen her dilde dinamik tip sistem de bulunur. C dışında, bir istisna düşünemiyorum

Bu geçerli bir iddia mı? Çalışma zamanında Yansıma veya Yükleme sınıflarıyla Java'nın bu şekilde biraz aldığını anlıyorum - ancak bu 'kademeli yazma' fikri çok sayıda dile genişletilebilir mi?


Ben bir dil uzmanı değilim, ama dinamik türlere sahip olmadığına inanmadığım bir anda aklıma gelen birkaç kişi (Yerel olarak, bunlarla birlikte bir şeyler
toplayamayacağınızı söylemiyorum

4
Ben bir dil uzmanıyım ve bu adamın ne iddia ettiğinden emin değilim. "statik" ve "dinamik" yanlış adlandırmalardır ve genellikle tür kontrol / analiz zamanını belirtir (derleme zamanında veya çalışma zamanında). Bazı diller her ikisini de (örneğin, derleme sırasında desteklenmeyen türlerde işlemlere izin vermeyerek ve çalışma zamanı sırasında ClassCastException gibi özel durumları yükselterek) uzlaştırır ve bunun anlamı olabilir. Öyleyse, C'nin çalışma zamanı sırasında genellikle tür denetimi yapmadığı doğrudur . Bir lang demek. "dinamik tip sistemi" bulunmuyor.
Thiago Silva

Yanıtlar:


37

Orijinal tweeter burada. :)

Her şeyden önce, tweet'imin çok ciddiye alındığı için biraz eğlendim / şok oldum! Bunun yaygın bir şekilde yayılacağını bilseydim, yazmak için 30 saniyeden fazla zaman harcayacaktım!

Thiago Silva, "statik" ve "dinamik" ifadelerin , tür sistemlerinden ziyade tür denetimini daha doğru tanımladığını belirtmekte haklıdır . Aslında, bir dilin statik veya dinamik olarak da yazıldığını söylemek gerçekten doğru değildir. Aksine, bir dilin bir tür sistemi vardır ve bu dilin bir uygulaması, statik denetimi veya dinamik denetimi ya da her ikisini birden ya da her ikisini birden kullanarak (bu çok cazip bir dil uygulaması olmayacaktır!) Tür sistemini zorlayabilir.

Olduğu gibi, statik kontrole daha uygun belirli tip sistemleri (veya tip sistemlerinin özellikleri) ve dinamik kontrole daha uygun belirli tip sistemleri (veya tip sistemlerinin özellikleri) vardır. Örneğin, diliniz bir programın metninde belirli bir değerin her zaman bir tamsayılar dizisi olması gerektiğini belirtmenize izin veriyorsa, o özelliği doğrulamak için statik bir denetleyici yazmak makul olur. Tersine, dilinizde alt tip varsa ve downcasting'e izin veriyorsa, bir downcast'in çalışma zamanının geçerliliğini kontrol etmek oldukça kolaydır, ancak derleme zamanında bunu yapmak son derece zordur.

Benim tweet'imle gerçekten kastettiğim, dil uygulamalarının büyük çoğunluğunun bir miktar dinamik tip kontrolü gerçekleştirmesidir. Veya aynı şekilde, dillerin büyük çoğunluğu statik olarak kontrol edilmesi zor (imkansız değilse de) bazı özelliklere sahiptir. Downcasting bir örnektir. Diğer örnekler aritmetik taşma, dizi sınırları kontrolü ve boş kontrolü içerir. Bunlardan bazıları bazı durumlarda statik olarak kontrol edilebilir, ancak genel olarak, çalışma zamanında herhangi bir kontrol yapmayan bir dil uygulaması bulmakta zorlanırsınız.

Bu kötü bir şey değil. Sadece, dillerimizin zorlamasını istediğimiz birçok ilginç özelliğin olduğu ve statik olarak nasıl kontrol edeceğimizi gerçekten bilmediğimiz bir gözlem. Ve "statik türler" ve "dinamik türler" gibi ayrımların, bazı insanların inandığınız kadar kesin olmadığını hatırlatmak isteriz. :)

Son bir not: "güçlü" ve "zayıf" terimleri programlama dili araştırma topluluğunda gerçekten kullanılmaz ve gerçekten tutarlı bir anlamı yoktur. Genel olarak, birisinin bir dilin "güçlü yazım" olduğunu ve başka bir dilin "zayıf yazım" olduğunu söylediğinde, en sevdikleri dilin ("güçlü yazım" olan dil) diğer dilin ("zayıf yazım" olan dil), en sevdikleri dilin ("zayıf yazım" olan dil) diğer dilin ( biri "güçlü yazarak") değil.


9
"Sadece, dillerimizin zorlamasını istediğimiz birçok ilginç özelliğin olduğu ve statik olarak nasıl kontrol edeceğimizi gerçekten bilmediğimiz bir gözlem." - Sadece bunu nasıl yapacağımızı bilmiyoruz değil. Biz sadece nasıl kontrol edileceğini bilmiyoruz ilginç bir özelliktir "Bu giriş için bu program halt mı", ama aslında biz yapmak biliyorum olup imkansız kontrol etmek.
Jörg W Mittag

"Diğer örnekler aritmetik taşma, dizi sınırları kontrolü ve boş kontrolü içerir." Yalnızca, sistemde bu özellikleri kontrol eden birkaç dil olsa da, çoğu dinamik olarak yazılmış dilde bile, bunların genellikle türlerin değil , değerlerin bir özelliği olduğunu unutmayın. ("Null" kontrolü statik tip sistemlerin ortak bir özelliğidir.)
porglezomp

Orada olan dinamik bir tip sistem ve statik tip sistem . Hiçbiri uygulanmasa bile, neyin doğru ve neyin yanlış olduğunu açıklayan hala oradalar. Dil / uygulama bunlardan birini kontrol edebilir veya etmeyebilir. BTW, statik ve dinamik tip sistemi tutarlı olmalıdır, ancak tanım gereği böyle değildir .
Elazar

Her dilin, belirli işlemlerin gerçekleştirilmesini yasaklayan bir dizi kural olan dinamik bir tür sistemi vardır.
Elazar

7

İyi evet. Statik olarak yazılmış herhangi bir dilde özellik çantalarınız olabilir. Sözdizimi korkunç olacak, aynı zamanda dinamik olarak yazılan sistemin tüm dezavantajlarını kazanacaksınız. Derleyici daha güzel bir sözdizimi kullanmanıza izin vermediği sürece gerçekten bir avantaj yoktur, C # gibi bir şey dynamicyapıyor.

Ayrıca, bunu C'de de kolayca yapabilirsiniz.

Diğer cevaplara tepki olarak: İnsanların statik / dinamik yazmayı güçlü / zayıf yazarak yanlış anladıklarını düşünüyorum. Dinamik yazma, çalışma zamanında verilerin yapısını değiştirebilmek ve kodun, kodun gereksinimine uyan verileri kullanabilmekle ilgilidir. Buna Ördek Yazma denir .

Yansımayı belirtmek tüm hikayeyi anlatmaz, çünkü yansıma mevcut verilerin yapısını değiştirmenize izin vermez. C, C ++, Java veya C # 'da bir sınıfa veya yapıya yeni alan ekleyemezsiniz. Dinamik dillerde, mevcut sınıflara yeni alanlar veya öznitelikler eklemek sadece mümkün değil, aynı zamanda oldukça yaygındır.

Örneğin , Python-C-derleyicisi olan Cython'a bakın . Statik C kodu oluşturur, ancak tip sistemi hala dinamik doğasını korur. C statik olarak yazılan bir dildir, ancak Python'dan dinamik yazmayı destekleyebilir.


Teknik olarak, ExpandoObjectJavaScript veya Ruby'den farklı olarak, çok fazla tercih edilen bir işlem olmasına rağmen , sürüm 4'ten itibaren C # ile yapabilirsiniz . Yine de, çok önemli bir noktaya değindiniz, bu da ördek yazmanın (geliştiricilerin% 99'u "dinamik olarak yazılmış" derken aslında ne anlama geldiği) ve yansımanın aynı şey olmadığı anlamına geliyor.
Aaronaught

Python'un gerçek ördek yazması olmadığını da ekleyebilirim. Sadece "kendi uygulamak" için bazı kancaları vardır ( True"Bu deli nesne tanımladığım sınıfın bir örneğidir" demek için dönebilirsiniz sihirli bir yöntemi vardır ). OCaml anladığım kadarıyla bu özelliği var, ama gerçekten bilmiyorum.
vlad-ardelean

6

Dinamik diller statik dillerdir . Yaygın olarak "dinamik yazma" olarak adlandırılan şey gerçekten özel bir statik yazma durumudur - kendinizi yalnızca tek bir türle sınırlandırdığınız durumdur. Bir düşünce deneyi olarak, herhangi bir yöntemi Objectçağırmadan hemen önce yalnızca değişkenleri / alanları / parametreleri ve alçalmayı kullanarak Java veya C # 'da bir program yazmayı hayal edin . Python veya Javascript "unityped" gibi dilleri aramak daha doğru olur. (Bu iddia, muhtemelen böyle bir Java veya C # programının birçok alt tür kullanacağını düşünürse, birçok insanı karıştırır / rahatsız eder, ancak ortalama OOP dili türleri ve sınıfları birleştirir. Daha fazla bilgi için blog gönderisini okuyun.)

C'nin bile "dinamik" yazımına sahip olduğunu unutmayın - herhangi bir işaretçiyi void(ve bellek bana hizmet veriyorsa char) bir işaretçiye ve geri döndürebilirsiniz. Ayrıca, orada çalışma zamanı denetimi olmadığını da unutmayın; Eğer yanlış anlarsanız, tanımlanmamış davranışınızın tadını çıkarın!


Ancak oyuncu kadrosu statik olarak yapılır. Bunun dinamik yazmanın bir örneği olduğunu göremiyorum.
osa

@osa Sadece kod diyor çünkü String foo = (String) baro anlamına gelmez baraslında a içindedir String. Bunu sadece çalışma zamanında kesin olarak biliyorsunuz, bu yüzden oyuncu kadrosunun nasıl "statik olarak" yapıldığını göremiyorum.
Doval

Buna katılmıyorum. En azından Javascript'te, çalışma zamanındaki nesnelere yeni yöntemler ve özellikler ekleyebilirsiniz. C # ' dynamicda bunu yapmak için açıkça bir nesne kullanmanız gerekir . Bir object... mülküne bir özellik eklemeye çalışırsanız , yapamazsınız.
Arturo Torres Sánchez

3

Statik ve dinamik yazma arasındaki fark , bir değerin türü kontrol edildiğinde ortaya çıkar: derleme zamanı ve çalışma süresi. Değerlerin türlerini yanlarında taşıdığı dillerde (örn. Java nesneleri), dil gerçekten statik yazmayı tercih etse bile her zaman dinamik yazmaya başvurabilirsiniz. Java'da dinamik olarak yazılmış bir yöntemle bir örnek:

void horribleJava(List untypedList) {
  for (Object o : untypedList)
    ((SpecificType) o).frobnicate();
}

Her öğenin türünün çalışma zamanında nasıl kontrol edildiğine dikkat edin. Eşdeğer statik olarak yazılmış yöntem:

void goodJava(List<SpecificType> typedList) {
  for (SpecificType o : typedList) {
    o.forbnicate();
  }
}

C'de, değerler (ve özellikle işaretçiler) çalışma sırasında türlerini korumaz - her işaretçi bir ile eşdeğerdir void *. Bunun yerine, değişkenlerin ve ifadelerin bir türü vardır. Dinamik yazmayı elde etmek için, tür bilgisini kendiniz taşımanız gerekir (örneğin, bir yapıdaki alan olarak).


1
Bir kadronun gerçekten pratik anlamda dinamik yazım olduğunu düşünmüyorum. Yine de derleme zamanında tür bilgisi gerektirir, sadece çalışma zamanına kadar gerçek doğrulamayı savunur. frobnicateİlk önce bilmeden yöntemi burada çağıramazsınız SpecificType.
Aaronaught

2
@Aaronaught Ancak bu , tür denetimini çalışma zamanı erteledikten sonra dinamik yazımdır . Her iki örneğimin de belirli bir tür adı gerektiren nominative yazmayı kullandığını unutmayın . Yapısal yazmayı düşünüyorsunuz , örneğin bazı yöntemlerin varlığını gerektiren ördek yazımı. Yapısal-nominatif ve statik-dinamik tipleme eksenleri birbirine diktir (Java nominatif ve çoğunlukla statiktir; ML ve Go yapısal ve statiktir; Perl, Python ve Ruby (çoğunlukla) yapısal ve dinamiktir).
amon

Son yorumumda söylediğim gibi, tanıştığım hiçbir programcının gerçekten umursamadığı teorik bir ayrım. İnsanların yanlış terminolojiyi kullandıklarını (ve aslında orijinal tweeter'ın tam olarak bu tür bir sersemlik için gittiğini) aşındırıcı bir şekilde iddia edebilirsiniz, ancak aslında siperlerde olan insanlar için dinamik yazma = ördek yazma. Aslında, tanım o kadar yaygındır ki, C # gibi diller aslında onu kodlamıştır (yani dynamicanahtar kelime ile). Eşitlersek statik için derleme zamanında ve dinamik için çalışma zamanı sadece muddies çoğunlukla sular.
Aaronaught

@Aaronaught: Biri bir arayüze atlarsa ve amaçlanan anlama gelen bir yöntemi uygulayan sınıflar sürekli olarak bunu söylemek için aynı arayüzü uygularsa, o zaman esas olarak çalışma zamanı ördek yazması olur. Bazı "ördek yazarak" sadece yöntem adını kullanmak gerektiğini iddia ederken, "gerçek" yöntem adı arabirimi adı artı yöntem adı olarak kabul etmek daha yararlı olacağını düşünüyorum. Aksi takdirde, gereken [1,2].Add([3,4])verim [1,2,3,4], [1,2,[3,4]]veya [4,6]?
Supercat

@supercat: Yukarıdakilerin hiçbiri başarısız olmaz çünkü Adddizide böyle bir yöntem belirsiz olacağından diziyi kabul eden bir yöntem yoktur . Ördek yazmak sizi anlaşılır türler ve işlevler yazmaktan mazur görmez.
Aaronaught

2

Statik ve Dinamik yazım temel olarak türlerin nasıl denetlendiğini ifade eder. Statik yazım, çeşitli değişkenlerin veya ifadelerin türlerinin doğrulanmasının gerçek koda (genellikle derleyici tarafından) göre kontrol edildiği, dinamik tür sisteminde ise bu doğrulamanın yalnızca çalışma zamanında, çalışma ortamı tarafından gerçekleştirildiği anlamına gelir.

Metnin atıfta bulunduğuna inandığım, türler aslında statik olarak kontrol edilse bile, çalışma zamanında, yani dinamik olarak da kontrol edilir. Java Reflection'dan doğru şekilde bahsettiniz; yansıma yalnızca çalışma zamanında gerçekleşir ve Java Runtime Environment (JVM), yansıma kullanıldığında aslında tür denetimi gerçekleştirir, bu da temel olarak dinamik tür denetimi anlamına gelir.


O zaman doğru değil. C ++, Pascal, Fortran --- herhangi bir derlenmiş dilde --- türler yalnızca statik olarak kontrol edilir ve dinamik olarak değil (dynamic_cast kullanmıyorsanız). Belleğe rasgele şeyler yazmak için işaretçiler kullanabilirsiniz ve kimse türleri bilmeyecektir. Bu nedenle, statik yazma SADECE STATİK OLARAK KONTROL EDİLİR, dinamik yazma ise SADECE ÇALIŞMA SIRASINDA KONTROL anlamına gelir.
osa

-1

Ekspet yanlış: C ayrıca önemli bir dinamik tip sistemine sahip. Basitçe kontrol etmez ("C kuvvetle yazılır, zayıf kontrol edilir"). Örneğin, bir yapıyı double( reinternpret_cast-stili) olarak ele almak, tanımlanmamış bir davranış sağlar - dinamik bir tür hatası.


(Her kim indirilmişse - @Tiago Silva'nın yorumu aynı şey hakkında söylüyor)
Elazar
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.