“Türsüz” aynı zamanda akademik CS dünyasında “dinamik olarak yazılmış” anlamına mı gelir?


165

"JavaScript türsüz" yazan bir slayt destesi okuyorum. Bu, doğru olduğunu düşündüğümle çelişti, bu yüzden daha fazla bilgi edinmek için kazmaya başladım.

JavaScript'e verilen her cevap türsüz bir dil midir? JavaScript olduğunu söylüyor değil gitmek için yol değildi ki .. ben aşina ve mutlu olduğumu statik, dinamik, güçlü ve zayıf yazarak çeşitli formlarının türsüz ve sunulan örnekler.

Bu yüzden JavaScript'in yaratıcısı Brendan Eich'a sordum ve şöyle dedi:

akademik türler "türsüz" ifadesini kullanarak "statik tür yok" anlamına gelir. değerlerin türleri olduğunu görecek kadar zekiler (duh!). bağlam önemlidir.

Akademik olarak odaklanmış bilgisayar bilimleri insanları "türsüz" ifadesini "dinamik olarak yazılan" ile eşanlamlı olarak kullanıyorlar mı (ve bu geçerli mi?) Yoksa özlediğimden daha derin bir şey var mı? Brendan'ın bağlamın önemli olduğunu kabul ediyorum, ancak şu anki "git" kitaplarım bu konuda top oynamadığından herhangi bir açıklama alıntısı harika olurdu.

Anlayışımı geliştirebilmem için bunu çivilemek istiyorum ve çünkü Wikipedia bile bu alternatif kullanıma (zaten bulabildiğim) atıfta bulunmuyor. Terim kullanarak ya da terimin gelecekte yanlış olup olmadığını sorgulamakla uğraşmak istemiyorum :-)

(Ben de bir üst Smalltalker gördüm Smalltalk de "türsüz" olduğunu, bu yüzden bu bir seferde beni yola ne olduğunu bir kerelik değil! :-))


5
Başkalarının isimlendirmeyi kötüye kullanması alışkanlıklarınızı şekillendirmek zorunda değildir - sadece (daha fazla) doğru ifadeyi kullanın. Açıkçası, okuma meselesinin farkında olmalısınız.
Raphael

2
Hep olduğu gibi, aldı değişkenler herhangi değişken veri her türlü tutabilir ki türsüzdür. Değişkende bulunanların türü dinamik olarak değişebilir .
Şubat'ta Izkata


1
Ayrıca (yine doğal dil hakkında bilgisayar dillerinden daha çok şey söyleyerek) "untyped" = "tek tip" (tüm değerler için tek tip).
philipxy

Yanıtlar:


147

Evet, bu akademik literatürde standart bir uygulamadır. Bunu anlamak için, "tip" kavramının 1930'larda, lambda hesabı bağlamında (aslında, daha önce, küme teorisi bağlamında) icat edildiğini bilmek yardımcı olur. O zamandan beri, "tip teorisi" olarak bilinen bir bütün hesaplama mantığı dalı ortaya çıktı. Programlama dili teorisi bu temellere dayanmaktadır. Ve tüm bu matematiksel bağlamlarda, "tip" in özel ve köklü bir anlamı vardır.

"Dinamik yazma" terminolojisi çok daha sonra icat edildi - ve "tip" kelimesinin ortak matematiksel kullanımı karşısında bir çelişki.

Örneğin, Benjamin Pierce'ın standart ders kitabı Türleri ve Programlama Dilleri'nde kullandığı "tip sistemi" nin tanımı :

Tip sistemi, cümleleri hesapladıkları değer türlerine göre sınıflandırarak belirli program davranışlarının olmadığını kanıtlamak için izlenebilir bir sözdizimsel yöntemdir.

Ayrıca şunları da belirtiyor:

“Statik” kelimesi bazen açıkça eklenir - örneğin, “statik olarak yazılmış bir programlama dilinden” söz ediyoruz - burada düşündüğümüz derleme zamanı analizlerini farklı dillerde bulunan dinamik veya gizli yazımlardan ayırmak için Yığındaki farklı yapı türlerini ayırt etmek için çalışma zamanı türü etiketlerinin kullanıldığı Şema (Sussman ve Steele, 1975; Kelsey, Clinger ve Rees, 1998; Dybvig, 1996). “Dinamik olarak yazılan” gibi terimler tartışmasız yanlış adlandırmalardır ve muhtemelen “dinamik olarak kontrol edilir” ile değiştirilmelidir, ancak kullanım standarttır.

Sahada çalışan çoğu insan bu bakış açısını paylaşıyor gibi görünüyor.

Bu olmadığını Not değil o "türsüz" ve "dinamik yazılan" demek eş anlamlıdır. Aksine, ikincisi, birincinin belirli bir vakası için (teknik olarak yanıltıcı) bir isimdir.

PS: Ve FWIW, hem tip sistemlerde akademik bir araştırmacı hem de JavaScript'in akademik olmayan bir uygulayıcısı oldum, bu yüzden şema ile yaşamak zorundayım. :)


5
Bu ise çok yararlı ve hatta ona biraz tarih sağlama açısından benim favori cevap olabilir.
Peter Cooper

2
@PeterCooper btw, resmi anlambilimin büyük bir dalının daktilo edilmiş lambda calculi üzerinde (ha bir pun) öngörüldüğünü bilmek isteyebilirsiniz; örneğin Montague Semantiği. Ancak, açıklayıcı, üretken olmayan bir sistem olarak Montague Semantics gibi sistemlerde yazmayı, programlama dillerinde yazmaktan ayrı olarak bölümlere ayırdım.
knowtheory

+1. "[dynamically typed] is a (technically misleading) name for a particular case of [untyped]"
Steve

1
Bu "tipler" tarihi hakkında pek doğru değil. Kilise'nin lambda hesabı üzerindeki çalışmalarından bile daha yaşlılar. Russell set teorisinin inşasında paradokslardan kaçınmak için türleri kullandı.
Sam Tobin-Hochstadt

1
@ SamTobin-Hochstadt, evet, doğru. Tarihin sadece PL'lerin temellerini doğrudan ilgilendiren kısmından bahsettim. Açıklığa kavuşacağım.
Andreas Rossberg

68

Ben programlama dillerinde uzmanlaşmış bir akademik bilgisayar bilimcisiyim ve evet, "türsüz" kelimesi sıklıkla (yanlış) bu şekilde kullanılıyor. Sözcüğü, Forth ve montaj kodu gibi dinamik tür etiketi taşımayan dillerle kullanmak güzel olurdu, ancak bu diller nadiren kullanılır ve daha nadiren incelenir ve "türsüz" demek çok daha kolaydır. "dinamik olarak yazılır".

Bob Harper, Scheme, Javascript ve benzeri dillerin yalnızca tek bir tip değeri olan yazılan diller olarak düşünülmesi gerektiğini söylemekten hoşlanır. Sadece tek bir biçim formalizmi kullanarak tutarlı bir dünya görüşü oluşturmayı mümkün kıldığından, bu görüşe yaslanıyorum.

PS Saf lambda hesabında, tek "değerler" normal formdaki terimlerdir ve normal formdaki tek kapalı terimler işlevlerdir. Ancak lambda hesabını kullanan çoğu bilim adamı temel türleri ve sabitleri ekler ve sonra lambda için statik bir tür sistemi eklersiniz veya dinamik tür etiketlerine geri dönersiniz.

PPS Orijinal postere: programlama dilleri ve özellikle yazı sistemleri söz konusu olduğunda, Wikipedia'daki bilgiler düşük kalitededir. Buna güvenme.


12
Bence CS'de (akademi dahil) isimlerin titiz bir tanım olmadan kullanıldığı daha geniş bir sorun var. Bu, matematik ve (en?) Bilimlerle tam bir tezat oluşturuyor. Çok sayıda anlaşmazlık (örneğin OOP hakkında) bu doğru tanımların eksikliğinden kaynaklanıyor gibi görünmektedir. Çok sinir bozucu.
Konrad Rudolph

2
@KonradRudolph: Merak ediyorum, doğru tanımların eksikliğinden kaynaklanan anlaşmazlıklar yerine, kısmen anlaşmazlıklardan uygun tanımların eksikliği ortaya çıkabilir mi? Bazı terimler duygusal bir değer kazanır (pozitif veya negatif olsun) ve belirli dilleri destekleyenler daha sonra bu terimleri dillerini içeren veya dışlayan (ve en sevdikleri "düşman" dillerini hariç tutan veya ekleyen) şekilde tanımlar. Bir matematik Örneğin - hala aksiyomatik küme kuramı üzerinde naif seti teorisini destekleyen insanlar olsaydı, emin onlar "aksiyomatik küme teorisi" kendi görüşlerini arayıp "naif tanımlarsınız olabilir
ruakh

4
@Norman, yanlış kullanım olarak adlandırdığınıza şaşırdım - bildiğiniz gibi, tür kavramı, dinamik olarak yazılmış diller olarak adlandırılan dillerden on yıl öncesine dayanır ve sonuncusu "tür" olarak adlandırılanın, öncekiyle ilgisi yoktur. Bu yüzden kötüye kullanımın başka türlü olduğunu söylemek doğru olur.
Andreas Rossberg

5
@Norman: Programlama dilleri ve özellikle yazım sistemleri söz konusu olduğunda, Wikipedia'daki bilgilerin kalitesiz olduğunu düşünüyorsanız, onu yalnız bırakmayın ve geliştirmeyin. (sadece trolling)
Gyom

3
@Gyom Vikipedi sürecinin uzmanlığı değil değişimi ödüllendirdiğini anladığım gün Wikipedia'yı geliştirmekten vazgeçtim . Benim zaman SO :-) geliştirmek için daha iyi
Norman Ramsey

43

Bu konuya baktım ve sorunuzun cevabının basit ve şaşırtıcı bir şekilde "evet" olduğunu gördüm: akademik CS türleri veya en azından bir kısmı "dinamik olarak yazılan" anlamında "yazılmamış" kullanır. Örneğin, Programlama Dilleri: İlkeler ve Uygulamalar , Üçüncü Baskı (Kenneth C. Louden ve Kenneth A. Lambert, 2012'de yayınladı) şöyle diyor:

Statik yazı sistemi olmayan diller genellikle türlenmemiş diller (veya dinamik olarak yazılmış diller) olarak adlandırılır ) olarak adlandırılır. Bu diller arasında Şema ve diğer Lisp, Smalltalk lehçeleri ve Perl, Python ve Ruby gibi çoğu komut dosyası dili bulunur. Bununla birlikte, türlenmemiş bir dilin programların verileri bozmasına izin vermediğine dikkat edin; bu, tüm güvenlik denetimlerinin yürütme zamanında yapıldığı anlamına gelir. [...]

[ bağlantı ] (not: orijinal olarak kalın harflerle yazılır) ve "bu şekilde" kullanılmamış olarak kullanılmaya devam eder.

Bunu şaşırtıcı buluyorum (afrischke ve Adam Mihalcin'in verdiği aynı sebeplerden dolayı), ama işte buradasınız. :-)


Eklemek için düzenlendi: Takıp daha fazla örnek bulabilirsiniz"untyped languages" Google Kitap Arama'ya ekleyerek . Örneğin:

[…] Bu birincil bilgi gizleme mekanizması birçok türlenmemiş dildir. Örneğin PLT Şeması [4] üretken kullanırstruct s , […]

- Jacob Matthews ve Amal Ahmed, 2008 [ bağlantı ]

[…], Türetilmemiş bir işlevsel dil için bir bağlayıcı zaman analizi sunuyoruz […]. […] Şema'nın yan etkisiz bir lehçesi için uygulanmış ve kısmi bir değerlendiricide kullanılmaktadır. Bununla birlikte, analiz Haskell gibi katı yazılmamış fonksiyonel diller için geçerli olacak kadar geneldir. [...]

- Charles Consel, 1990 [ bağlantı ]

Bu arada, benim izlenimim, bu arama sonuçlarına baktıktan sonra, bir araştırmacı "türlenmemiş" işlevsel bir dil yazıyorsa, muhtemelen türetilmemiş lambda ile aynı anlamda "türlenmemiş" olduğunu düşünmesidir. Adam Mihalcin'in bahsettiği analiz. En azından, birkaç araştırmacı aynı şemada Scheme ve lambda hesabından bahsediyor.

Arama ne olmaz demek, tabii ki, bu kimlik reddetmek ve araştırmacılar olup olmadığıdır yok "türsüz" olarak bu dilleri düşünün. Bunu buldum:

Daha sonra gerçekten bir daireselliğin olmadığını fark ettim, çünkü dinamik olarak yazılmış diller türlenmemiş diller değil - sadece türler genellikle program metninden hemen belli değil.

- birisi (kim olduğunu söyleyemem), 1998 [ link ]

fakat açıkçası bu kimliği reddeden çoğu insan bunu açıkça söylemeye ihtiyaç duymaz.


2
Vay. Şok edici. Bilgi için teşekkürler.
afrischke

Tam olarak aradığım alıntı, teşekkürler! Kinda beni korkutuyor, ancak Amazon'da ortalama 2 yıldız var, ancak daha fazla alıntı memnuniyetle karşılandı, ancak bu harika bir başlangıç.
Peter Cooper

@PeterCooper: Cevabımı daha fazla alıntı eklemek için düzenledim. Amazon derecelendirme sorununu yayınlanmış gazetelerden alarak atlatıyorlar: bildiğim kadarıyla hala çöp olabilirler, ama en azından Amazon'un bize bunu söylemesinden endişelenmemiz gerekmiyor. :-P
ruakh

"Yazılmamış" ile "dinamik olarak yazılmış" ile karıştırmak mantıksızdır. Geliştiriciler mantıksız olmamalıdır.
rotman

10

Yazılmamış ve dinamik olarak yazılanlar kesinlikle eşanlamlı değildir. En çok "türlenmemiş" olarak adlandırılan dil, aslında birleşik bir dil olan Lambda Calculus'tur - her şey bir işlevdir, bu nedenle her şeyin türünün işlev olduğunu statik olarak kanıtlayabiliriz. Dinamik olarak yazılan bir dilin birden çok türü vardır, ancak derleyicinin bunları statik olarak denetlemesi için bir yol eklemez, derleyiciyi değişken türlerine çalışma zamanı denetimleri eklemeye zorlar.

Ardından, JavaScript dinamik olarak yazılan bir dildir: JavaScript'te bazı değişkenlerin xbir sayı, işlev veya dize veya başka bir şey olabileceği şekilde programlar yazmak mümkündür (ve hangisinin Durma Sorunu veya bazılarını çözmesi gerektiğini belirlemek) zor matematiksel sorun), böylece xbir argümana başvurabilirsiniz ve tarayıcı çalışma zamanında xbir işlev olduğunu kontrol etmelidir .


AFAIK Aynı problemler Lambda ifadesi için de geçerlidir. "Geçerli konumum" için bir işlevi "hedeften uzaklığımı" hesaplayan bir işleve geçirebilmenize rağmen, aynı "geçerli konumum" işlevini "puffs" ve daha iyi vicks ile daha iyi olan bir işleve de geçirebilirsiniz. burnunuz için ". Herhangi bir dinamik sistemde olduğu gibi geçerli olabileceği anlamına gelmez.
Steve

5
@Steve Çöp çöpü herhangi bir programlama dili için geçerlidir ve türler kavramı ile ilgisi yoktur. OCaml veya SML gibi güçlü yazılan bir dilde bile Kuzey Kutbunu "hedeften uzaklığımı" hesaplayan bir işleve geçirebilirim (ve hayır, mevcut konumum Kuzey Kutbu değil).
Adam Mihalcin

Akademi dışındaki insanlar için şunu eklemek istedim: montaj gibi şeyler de türsüz sayılır.
CoffeeTableEspresso

6

Değerler veya değişkenler hakkında konuşmanıza bağlı olarak her iki ifade de doğrudur. JavaScript değişkenleri türsüzdür, JavaScript değerlerinin türleri vardır ve değişkenler çalışma zamanında herhangi bir değer türüne göre değişebilir (yani 'dinamik olarak').

JavaScript ve diğer birçok dilde, değişkenler değil, değerler türler taşır. Tüm değişkenler, tüm değer türleri arasında değişebilir ve "dinamik olarak yazılan" veya "türlenmemiş" olarak kabul edilebilir - tip / kontrol edilemeyen bir değişkenin ve herhangi bir tür alabilen bir değişkenin tip kontrolü açısından mantıklı ve pratik olarak eşdeğerdir. . Tür kuramcıları diller ve türler hakkında konuştuğunda, genellikle bunun hakkında konuşuyorlar - değişkenler taşıyan türler - çünkü bellekte çalışan bir program değil, program metni (yani değişkenler) üzerinde çalışan tür denetleyicileri ve derleyiciler ve benzeri yazmakla ilgilenirler. (yani değerler).

Aksine, C gibi diğer dillerde, değişkenler türleri taşır fakat değerler taşımaz. Java gibi dillerde, değişkenlerin ve değerlerin her ikisi de türleri taşır. C ++ 'da, bazı değerler (sanal işlevlere sahip olanlar) türleri taşır, bazıları ise içermez. Bazı dillerde, değerlerin tür değiştirmesi bile mümkündür, ancak bu genellikle kötü tasarım olarak kabul edilir.


5
Temel ayrımın değerler ve değişkenler arasında değil, değerler ve ifadeler arasında olduğunu düşünüyorum : Statik olarak yazılan bir dilde, ifadelerin türleri vardır, dinamik olarak yazılan bir dilde ise yalnızca değerler yapar. (Değişken isimler elbette bir tür ifadedir.)
ruakh

4

Bu soru anlambilimle ilgili

Bu verileri size verirsem: 12türü nedir? Kesin olarak bilmenin hiçbir yolu yok. Bir tamsayı olabilir - bir kayan nokta olabilir - bir dize olabilir. Bu anlamda çok "türetilmemiş" verilerdir.

Size bu veride "toplama", "çıkarma" ve "birleştirme" gibi işleçleri kullanmanıza izin veren hayali bir dil ve başka bir rastgele veri parçası verirsem "tür" biraz önemsizdir (hayali dilimle) (örnek : belki add(12, a)verimler 109olan 12artı aSCII değeri a).

Bir saniye için C ile konuşalım. C hemen hemen herhangi bir keyfi veri parçası ile istediğiniz her şeyi yapmanızı sağlar. İki uints alan bir işlev kullanıyorsanız - istediğiniz her şeyi atabilir ve iletebilirsiniz - ve değerler yalnızca uints olarak yorumlanır . Bu anlamda C "türsüzdür" (eğer böyle davranırsanız).

Ancak - ve Brendan'ın noktasına gelmek - size "Yaşım" olduğunu söylersem 12- o 12zaman bir türü var - en azından bunun sayısal olduğunu biliyoruz. Bağlamla birlikte , dilden bağımsız olarak her şeyin bir türü vardır.

Bu yüzden başlangıçta söyledim - sorunuz anlambilimden biri. "Unsyped" nin anlamı nedir? Bence Brendan "statik tip yok" dediğinde kafasına çiviyi vurdu - çünkü bu muhtemelen anlamına gelebilir. İnsanlar doğal olarak şeyleri türlere ayırırlar. Sezgisel olarak biliyoruz ki, bu ayrımları yapmayı öğretmeden bir araba ile maymun arasında temelde farklı bir şey var.

Başlangıçta örneğime geri dönersek - "türlerle ilgilenmeyen" bir dil (per-se), bir sözdizimi hatası oluşturmadan "bir" yaş "ve" ad "eklemenize izin verebilir ... mantıklı bir işlem olduğu anlamına gelmez.

Javascript, her türlü çılgın şeyi "hataları" dikkate almadan yapmanıza izin verebilir. Bu yaptığınız şeyin mantıklı bir ses olduğu anlamına gelmez. Bu geliştirici çalışması için.

Derleme / derleme / yorumlama zamanında tür güvenliğini zorlamayan bir sistem / dil "türetilmemiş" veya "dinamik olarak yazılmış" mı?

Semantik.

DÜZENLE

Buraya bir şeyler eklemek istedim çünkü bazı insanlar "evet, ama Javascript'in bazı" türleri "var.

Başkasının cevabı hakkındaki yorumumda dedim ki:

Javascript'te "Maymun" olarak oluşturduğum nesnelere ve "İnsanlar" olarak inşa ettiğim nesnelere sahip olabilirim ve bazı işlevler yalnızca "İnsanlar" üzerinde, diğerleri yalnızca "Maymunlar" üzerinde çalışacak şekilde tasarlanabilir ve ama diğerleri sadece "Silahlı Şeyler". Dilin hiç söylenip söylenmediği, "silahlı şeyler" gibi bir nesne kategorisi olup, Javascript ("dinamik") kadar montajla ("türsüz") alakasızdır. Her şey mantıklı bir bütünlük meselesidir - ve tek hata, bu yöntemle kolları olmayan bir şey kullanmak olacaktır.

Yani, Javascript'in bazı "türler kavramına" ve dolayısıyla "dinamik türlere" sahip olduğunu düşünüyorsanız ve bunun "türetilmemiş bir sistemden" bir şekilde farklı olduğunu düşünürseniz - yukarıdaki örnekten herhangi bir " türleri vardır "içsel olarak gerçekten alakasız.

Örneğin, C # ile aynı işlemi gerçekleştirmek için bir arayüze ICreatureWithArmsya da benzer bir şeye İHTİYACIM VAR . Javascript'te öyle değil - C veya ASM'de böyle değil.

Açıkçası, Javascript'in herhangi bir "tip" anlayışı olup olmadığı önemsizdir.


4
-1. Soru, belirli bir kelimenin, belirli çevrelerde, belirli bir anlamla kullanılıp kullanılmadığını soruyor ve cevabınız bunun, kelimenin bu anlama sahip olup olmadığı sorusu olduğunu açıklamak mı? Gerçekten, yeni bir şey eklemeden OP'nin zaten bildiği her şeyi açıklayan takdire şayan bir iş yaptığınızı düşünüyorum. . .
ruakh

Bir tanım oluşturmak için gerekli birkaç soru var gibi görünüyor, belki? Tip zorlaması (statik veya dinamik) ve tanımlı tiplerin varlığı. Yani JavaScript türleri var, ancak bir işlem gerçekleştirmeden önce tür geçerliliğini denetlememesi nedeniyle "türsüz" olarak kabul edilebilir mi?
Peter Cooper

@ruakh - Bakış açınızı anlayabiliyorum. Bununla birlikte, OP sordu: is there something deeper to this that I am missingve bence, bunun anlamsal bir mesele olduğunu anlamadaki başarısızlık daha derin bir şeydir - bu yüzden elimden gelenin en iyisini yapmak için elimden geleni yaptım.
Steve

@PeterCooper - Düzenlememi görün ve bunun sizin için bir şey ekleyip eklemediğini söyleyin ( JavaScript has typescevabınızda söylediğinizden beri ).
Steve

2
'Açıkçası, Javascript'in "türler" hakkında herhangi bir anlayışı olup olmadığı önemsizdir.' Doğru değil. Cevabımda ima ettiğim gibi, bağlam ne olursa olsun, 12'ye bir işlev olarak bakamazsınız. JavaScript bir işlev türüne (veya bakış açınıza bağlı olarak birden çok işlev türüne) sahip olduğundan, bu önemli bir ayrımdır.
Adam Mihalcin

4

Türler hakkında yazan CS araştırmacılarının çoğunun temelde yalnızca sözdizimsel olarak türetilebilen türlerin yazılan diller olarak kabul ettiği doğru olsa da, bu kullanımda umbrage alan dinamik / gizli olarak yazılan dilleri kullanan çok daha fazlası var.

3 tür dil olduğunu düşünüyorum:

Untyped - değerin yorumlanmasını yalnızca operatör belirler - ve genellikle her şey üzerinde çalışır. Örnekler: Assembler, BCPL

Statik olarak yazılan - ifadelerin / değişkenlerin kendileriyle ilişkili türleri vardır ve bu tür, derleme zamanında operatörün yorumunu / geçerliliğini belirler. Örnekler: C, Java, C ++, ML, Haskell

Dinamik olarak yazılan - değerlerin kendileriyle ilişkili türleri vardır ve bu tür, çalışma zamanında operatörün yorumunu / geçerliliğini belirler. Örnekler: LISP, Şema, Smalltalk, Ruby, Python, Javascript

Bildiğim kadarıyla, dinamik olarak yazılan tüm diller tür güvenlidir - yani değerler üzerinde yalnızca geçerli işleçler çalışabilir. Ancak aynı durum, statik olarak yazılmış dil için geçerli değildir. Kullanılan tip sisteminin gücüne bağlı olarak, bazı operatörler sadece çalışma zamanında kontrol edilebilir veya hiç kontrol edilmeyebilir. Örneğin, statik olarak yazılan dillerin çoğu tamsayı taşmasını düzgün işlemez (2 pozitif tamsayı eklemek negatif bir tamsayı oluşturabilir) ve sınır dışı dizi başvuruları hiç denetlenmez (C, C ++) veya yalnızca işaretlenir Çalışma süresi. Ayrıca, bazı tip sistemler o kadar zayıftır ki, yararlı programlama, derleme zamanı ifade türlerini değiştirmek için kaçış kapakları (C ve aile için dökümler) gerektirir.

Tüm bunlar saçma iddialara yol açar, çünkü C ++ Python'dan daha güvenlidir, çünkü (statik olarak yazılmıştır), oysa gerçek Python'un bacağınızı C ++ ile vurabilirken kendinden güvenlidir.


Upvoted. "Tüm dinamik olarak yazılan diller yazı tipinde güvenlidir". "Ancak aynı durum, statik olarak yazılan dil için geçerli değildir", statik olarak yazılan dillerin tamamının veya çoğunun güvenli olmadığı anlamına mı geliyor?
Tim

Upvoted. (1) "Tüm dinamik olarak yazılan diller tür güvenlidir" bildiğimize sevindim, ancak Javascript dinamik ve zayıf yazıldığından, bkz. Stackoverflow.com/questions/964910/… . (2) "Ancak statik olarak yazılan dil için de aynı şey geçerli değil", statik olarak yazılan dillerin tamamının veya çoğunun güvenli olmadığı anlamına mı geliyor?
Tim

Tür olarak döküm hatası, sınır dışı abonelik veya boş gösterici istisnaları olasılığını dahil ederseniz, çok az sayıda dil statik olarak güvenlidir (ve çoğu kişi tür hatası olarak en azından döküm hatasını içerir). Örneğin pas, boş göstericiye sahip olamayacağınız için Java'dan daha statik olarak tür açısından daha güvenlidir. Java, herhangi bir yasadışı işlem için istisnalar almanız ve her şey belirtilmesi (dinamik yöntemler hariç) için dinamik olarak tür güvenlidir. Benzer şekilde Rust (bu şekilde belirtilen "güvensiz" kod hariç).
Dave Mason

Ancak, dilin "belirtilmemiş" bölümleri olduğundan ve "belirtilmemiş" işlemlerden birini yaparsanız, C ++, C dinamik olarak tür güvenli değildir, kelimenin tam anlamıyla her şey dilden gelen yasal bir yanıttır (ilişkisiz değişkenlerin değerleri olabilir) Değişim, virüsler programınıza bulaşabilir, program tüm diskinize yazıp çökebilir, program beklediğiniz şeyi bile yapabilir :-).
Dave Mason

@DaveMason: Tanımsız. Bir yoktur muazzam belirtilmemiş esasen uygulama tanımlı uygulama yok bunu belgelemek için" anlamına gelir iken C. Tanımsız davranış "belirtilmemiş" ve "tanımsız" arasındaki fark Tarif ettiğiniz ne yapabilirim temelde yasadışı işler --- edilir "(bazı nüanslar, orada burada var bu yüzden olduğu bir sadeleştirme). Belirtilmemiş davranışları çağırmak bu nedenle mükemmel bir şekilde yasaldır (aslında, ne zaman bir fonksiyon çağrısı yazarsa bunu yapar).
Tim Čas

2

Ben bir bilgisayar bilimcisi değilim, ama bu iki terimin farklı kavramları tanımladığı için, "türlenmemiş" CS topluluğunda (en azından bilimsel yayınlarda) "dinamik olarak yazılmış" ile eşanlamlı olarak kullanılırsa oldukça şaşırırdım. Dinamik olarak yazılan bir dilin bir tür kavramı vardır ve çalışma zamanında tür kısıtlamalarını zorunlu kılar (örneğin, bir tamsayıyı Lisp'teki bir dize ile bir hata almadan bölemezsiniz). hepsi (örn. montajcı). Programlama dilleri hakkındaki Wikipedia makalesi bile (http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages) bu ayrımı yapar.

Güncelleme: Belki de karışıklık, bazı metinlerin Javascript'te "değişkenler yazılmadığı" (doğru olan) bir şey söylediği gerçeğinden kaynaklanmaktadır. Ancak bu otomatik olarak dilin türsüz olduğu anlamına gelmez (bu yanlış olur).


1
Assembler çok zayıf tiplere sahip. En azından x86'da, her şey bir tamsayıdır, ancak bazı tamsayılar diğerlerinden farklı boyutlardadır. Bu, orijinal x86 spesifikasyonunun MMX, x87 ve diğer uzantılarına girmeden önce bile.
Adam Mihalcin

Katılmam gerekiyor. Javascript'te "Maymun" olarak oluşturduğum nesnelere ve "İnsanlar" olarak inşa ettiğim nesnelere sahip olabilirim ve bazı işlevler yalnızca "İnsanlar" üzerinde, diğerleri yalnızca "Maymunlar" üzerinde çalışacak şekilde tasarlanabilir ve ama diğerleri sadece "Silahlı Şeyler". Dilin hiç söylenip söylenmediği, "silahlı şeyler" gibi bir nesne kategorisi olup, Javascript ("dinamik") kadar montaj ("türsüz") ile alakasızdır. Her şey mantıklı bir bütünlük meselesidir - ve tek hata, bu yöntemle kolları olmayan bir şey kullanmak olacaktır.
Steve

@Adam Mihalcin Doğru. [Makro] montaj dilleri elbette çeşitli derecelerde tür kavramlarına da sahip olabilir. (Örneğin, "Yazılan Montaj Dili" ne bakın.) Hala benim açımdan önemli olduğunu düşünüyorum.
afrischke

3
@Steve seni takip edip edemeyeceğimden emin değilim. OP, CS çevrelerinde "dinamik olarak yazılan" ve "türlenmemiş" arasında bir ayrım yapıp yapmadığını sordu. Bunun, Javascript ve montajın bellekteki bitleri nasıl tedavi ettiği arasında neredeyse hiçbir ayrım olmadığına inanıp inanmamanızla hiçbir ilgisi yoktur. Ne okudum göre (ve ben özellikle ben hiçbir Javascript programcısı değilim gibi bakmak zorunda): ECMAScript / Javascript standardı 6 veri türü (Boolean, String, Tanımsız, Number, Null ve Object) tanımlar ve herhangi bir noktada zaman içinde bir değer bir somut tiptir ...
afrischke

1
... Şimdi bu, montaj dillerinin sahip olmadığı bir kavramdır (hepsi bit ve bayt vardır), bu nedenle Javascript ve montaj arasında açık bir ayrım vardır.
afrischke

1

Brendan ile hemfikir - bağlam her şeydir.

Benim almam:

2004'te kafasının karıştığını hatırlıyorum, çünkü Ruby'nin türsüz mü yoksa dinamik olarak mı yazıldığına dair tartışmalar vardı. Eski okul C / C ++ insanları (ben olduğum) derleyici hakkında düşünüyorlardı ve Ruby'nin çözümsüz olduğunu söylüyorlardı.

Unutmayın, C'de çalışma zamanı türü yoktur, sadece adresler vardır ve yürütülen kod bu adresteki her şeyi olmadığı gibi davranmaya karar verirse, whoops. Bu kesinlikle tipsiz ve dinamik olarak yazılandan çok farklı.

O dünyada, "yazmak" derleyiciyle ilgilidir. Derleyicinin denetimleri daha katı olduğundan C ++ "güçlü yazma" özelliğine sahipti. Java ve C daha "zayıf yazılmıştır" (Java'nın güçlü mü yoksa zayıf mı yazıldığına dair argümanlar bile vardı). Dinamik diller, bu süreçte derleyici tipi denetimi olmadığı için "türsüz" dür.

Bugün, programcıları uygulamak için dinamik dillere çok alışkınız, açıkçası, derleyici veya yorumlayıcı tipi kontrolü anlamına gelmediğini düşünüyoruz, ki bu hata ayıklamak için inanılmaz derecede zor olacak. Ancak orada bunun açık olmadığı bir dönem vardı ve CS'nin daha teorik dünyasında anlamlı bile olmayabilir.

Derin bir anlamda, hiçbir şey türlenemez (ya da neredeyse hiçbir şey), çünkü anlamlı bir algoritma yazmak için bir değeri manipüle etme niyetiniz olmalıdır. Bu, bir derleyici veya yorumlayıcının belirli bir dil için nasıl uygulandığının ayrıntılarıyla ilgilenmeyen teorik CS dünyasıdır. Yani "tiplenmemiş" (muhtemelen bilmiyorum) bu bağlamda tamamen anlamsızdır.

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.