Google'ın Go türü güvenli bir dil midir?


14

bu sayfa http://golang.org/doc/go_faq.html yazıyor:

Go'nun statik türleri olmasına rağmen, dil, türleri tipik OO dillerinden daha hafif hissettirmeye çalışır

Yani sorum tam olarak güvenli bir şekilde genel (C # gibi) veya gevşek yazılan (javascript gibi) veya isteğe bağlı (Vb.Net'te katı seçenek gibi)


@JamesMcNellis, eğer bir tür başarısız olursa, sadece bir tür dökümü yaptığım için olabilir (başka bir eylem bir tür istisnasına neden olmamalıdır)
Pacerier

1
@ davidk01 Java derlenecek (1 + "boo") ve Java'nın güzel türü güvenli. Bu ifadenin bunun için kesin bir statik anlamı vardır, çünkü +, String nesneleri için dil tarafından aşırı yüklenir ve tüm ilkel değişmez değerler, daha sonra Dizeler haline dönüştürülebilen sarılı nesnelere türden kaldırılabilir.
Trixie Wolf

Yanıtlar:


26

Tip güvenliği siyah veya beyaz tipte güvenli değildir veya değildir. Bu daha çok bir spektrumdur ve bazı diller diğerlerine göre daha güvenli olabilir (ve tersi de geçerlidir). Ancak, C # vs Javascript ile ne düşündüğünüzü düşünüyorum muhtemelen statik yazım (burada tür denetimi derleme zamanında gerçekleşir) vs dinamik yazarak (burada tür denetimi çalışma zamanında gerçekleşir) - kesinlikle, bu Go SSS'nin neden bahsettiği.

Google Go statik olarak yazılmıştır, ancak bir dizi özellik (en azından bir şekilde) dinamik olarak yazılmasını "görünür" kılar. Örneğin, sınıfınızı herhangi bir arabirim uygularken açıkça işaretlemenize gerek yoktur. Sınıfınızın yöntem imzaları arabirimdekilerle eşleşiyorsa, sınıfınız bu arabirimi otomatik olarak uygular (bir tür ördek türü). Bu, üçüncü taraf kitaplıklarındaki yerleşik sınıfları ve sınıfları genişletmek için kullanışlıdır, çünkü arayüzünüzü üçüncü taraf sınıfındaki yöntemlerle eşleştirmek için oluşturabilirsiniz ve bunu otomatik olarak uygular.

Tip güvenliği aslında tip sisteminin farklı bir "eksenidir". Örneğin, C, tür açısından güvenli olmayan statik olarak yazılan bir dildir - işaretçiler, programınızı çökertecek şeyler bile, istediğiniz her şeyi yapmanıza izin verir. Javascript dinamik olarak yazılmıştır, ancak yazım güvenlidir: programınızı kilitleyecek işlemleri gerçekleştiremezsiniz. C # çoğunlukla tür güvenlidir, ancak kod alanlarını açıkça işaretleyebilir unsafeve artık tür güvenli olmayan şeyler yapabilirsiniz.

Google Go, türlerle uğraşamayacağınız ve programı çökertemeyeceğiniz için de güvenlidir (işaretçilere doğrudan erişim yok).


"Güvensiz" paketini kullanmadığınız sürece, bu durumda programı istediğiniz gibi
kilitleyebilirsiniz

Sen can türlerini deneyin karışıklık ve işaretçiler erişimi var. Ve evet, bunu yaparak programınızı kolayca çökertebilirsiniz.
eithed

4

Bir türün asla yanlış yorumlanmayacağı güvenli bir şekilde yazılmıştır, ancak yanlış bir tür programın paniğe neden olabilir.


i anlamıyorum, bu tür olmayan güvenli kod aslında derlenebilir anlamına mı geliyor? (dinamik kullanmazsak c # 'da mümkün değildir)
Pacerier

Tip iddiaları, tip-bilge yapmak, temel olarak dinamik bir tipte bir yöntem çağırmak gibidir
dan_waterworth

tamam kısaca bu tür bir güvenlik türü c # sağlar izin vermez?
Pacerier

Eğer tür iddiaları yapmazsanız yapar.
dan_waterworth

5
@Pacerier: C # 'da yanlış yazılan ifadeleri dinamikler olmadan çalıştırmak mükemmel bir şekilde mümkündür: Sadece yayınları her yere yerleştirin (temel olarak tür iddialarıdır).
sepp2k

-1

Go'nun harita türü iş parçacığı için güvenli değildir , statik olarak yazılmıştır. O mu değil tip miras, genel programlama, iddialarını, yöntem aşırı yüklenmesini veya işaretçi aritmetik ya ve iyi bir nedenle var.

Tip güvenliği ve bellek güvenliği uzun vadeli amaçlardır, burada lie'de bir sorun vardır.

Tip güvenliği, kilobayt ve megabayt olarak kabul edilebilir bir genel yük sunar. Go, MapReduce ve "Büyük veri" ile tasarlanmıştır, tip güvenliği ile ilgili performans sorunlarını sunan bir petabayt veri ortaya koyar, tip kontrolü (boks / kutudan çıkarma) ek yükler oluşturur ve döngüleri işlemden uzaklaştırır.

Tip güvenliği alt tipleme ve polimorfizmde ve ördek tiplemede (nesneyi nesneye atma) kısıtlayıcı olabilir, bu da tehlikeler ve Go gibi dillerin büyük fayda sağladığı bir alan yaratır. C ++ ve Java, Go ile değiştirilmiyor, dağıtılmış programlama ve büyük paralel sisteme yardımcı olmak için yeni bir dildir.

Bruce Eckel'in yaptığı büyük açıklama - "Go, C ++ 'nın başlangıçta çözmeyi amaçladığı sorunların sınıfı için çok daha mantıklı" tartışmalıdır. C ++ çok verimli bir dildir ve MapReduce'un Boost uygulaması çok etkilidir.

Eşzamanlılık ilkelleri gelecektir. Tip güvenliği her zaman çok çekişmeli bir konuydu ve Go belki de 20 yıl içinde veya Algol'dan bu yana bu sorunu ele alan ilk dil.


3
Ne yazık ki bu cevabı -1 ile daha fazla ün kazanmam gerekiyor. Tip güvenliği bir ek yük değildir, çalışma zamanı ek yükü kesinlikle bayt birimleriyle ölçülmez ve Go'nun Java anlamında boks / kutudan çıkarılması vardır. Statik yazım, derleyicinin dinamik olarak yazılan bir dilden daha fazla optimizasyon yapmasını sağlar. Harita azaltma ne burada ne de orada, iplik güvenliği ile aynıdır.
Eloff

Golang'ın, bir dil özelliği olarak jeneriklerin uygulanmasını önlemek için ortak bir desen olarak boş bir arayüz kullanarak türleri öne sürme deyimi kesinlikle "tip güvenli" olarak kabul edeceğim bir şey değildir ve sorun spesifik olduğunda dil spesifikliğini koruyabilir ortaya çıkıyor (ve olacak) artık kanal rulo golang bir sorunu çağırır sorunu çözmek için kalan kişinin plaka üzerinde karmaşıklık bırakır. Kesinlikle son yirmi yılda tasarlanan bir dil gibi görünmüyor, çünkü tip güvenliğini çok daha iyi ele alan diller var.
tsturzl
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.