Neden C # 'da yönetilmeyen güvenli kod kullanmıyorsunuz?


10

C # 'da işaretlenmemiş kodu çalıştırmak için bir seçenek vardır. Yönetilen kod çok daha güvenli olduğu ve birçok sorunun üstesinden geldiği için genellikle yapılması önerilmez.

Ancak merak ediyorum, eğer kodunuzun hatalara neden olmayacağından eminseniz ve hafızayı nasıl kullanacağınızı biliyorsanız (hızlı kodu beğendiyseniz) genel tavsiyelere uyun?

Bir video kamera için, son derece hızlı bir bitmap manipülasyonu gerektiren bir program yazdığım için bunu merak ediyorum. Bazı hızlı grafik algoritmaları kendim yaptım ve yönetilmeyen kod kullanarak bitmap'lerde mükemmel çalışıyorlar.

Şimdi genel olarak merak ediyorum, bellek sızıntısı veya çökme riski olmadığından eminseniz, neden yönetilmeyen kodu daha sık kullanmıyorsunuz?

PS geçmişim: Bu programlama dünyasına girdim ve yalnız çalışıyorum (birkaç yıl boyunca yapıyorum) ve umarım bu yazılım tasarımı sorusu o kadar da garip değil. Gerçekten böyle şeyler soracak öğretmen gibi başka insanım yok.


8
unsafe"ne yaptığınızı bilin ve risklere karşı faydaları tartın" anlamına gelir . unsafeBir avuç kez kullandım ve her zaman performansla ilgili kendi yöntemiyle ortaya çıkarılabilecek çok spesifik bir şeydi. Genel bir programlama tekniği olarak kullanmıyorum, çünkü çoğu zaman ek performans avantajı güvenlik kaybına değmez.
Robert Harvey

14
Bazen çökmüş veya bellek sızıntısı olan yıllar boyunca bol miktarda kod yazdım, bellek sızıntıları veya çökme riskleri olmadığından eminim.
whatsisname

1
İşte iyi bir unsafekullanım örneği: stackoverflow.com/q/11660127/102937
Robert Harvey

3
Sanırım bitmap kodunuzda hala hatalar var, ama onları tespit etmediniz. Durum böyle olmasa bile, mevcut koda yeni gereksinimler uygulamak zorunda kalana kadar bekleyin.
Doc Brown

1
Kodunuzun hatalara neden olmayacağından emin olsanız bile yine de hatalara neden olur.
user253751

Yanıtlar:


27

Peki, bu çoğunlukla yaşlı atasözü vakası

  • Optimize etme
  • (yalnızca uzmanlar için) Henüz optimizasyon yapma

Ama aslında güvensiz kodlardan kaçınmak için üç ana sebep düşünebilirim.

  1. Hatalar : Sorunuzun kritik kısmı "kodunuzun hatalara neden olmayacağından eminseniz" dir. Peki, nasıl tamamen emin olabilirsiniz? Kodunuzun doğru olmasını garantileyen resmi yöntemli bir kanıtlayıcı kullandınız mı? Programlamada bir şey kesindir ve bu, hatalara sahip olmanızdır. Bir emniyeti çıkardığınızda, yeni tür böceklerin kaymasına izin verirsiniz. Çöp toplayıcısının hafızayı sizin yerinize halletmesine izin verdiğinizde, birçok sorun ortadan kalkar.

  2. Her zaman düşündüğünüz kadar hızlı değil : Diğer nokta: soruna bağlı olarak, kazanç o kadar büyük olmayabilir. Bunları şu anda bulamamam rağmen, Google'ın Java, Scala, Go ve C ++ hızlarını karşılaştıran bir çalışmayı hatırlıyorum. Yere optimize edildiğinde, elbette C ++ çok daha hızlıydı. Ancak "deyimsel" şekilde programlanan algoritma o kadar hızlı değildi. Standart yapı ve deyimler (stl konteyner, açılmamış döngü yok, vb.) Kullanmaları anlamında deyimsel. Microsoft, C # ve C ++ ile benzer bir deneme yaptı. En iyi Microsoft Mühendislerinden biri olan Raymond Chen, C # 'yı yenmek için kendi std :: string uygulamasını yazmak zorunda kaldı. (bkz: http://www.codinghorror.com/blog/2005/05/on-managed-code-performance-again.html) Çok daha az çaba için, yönetilen kodda oldukça iyi bir performans aldınız, bu yüzden genellikle sorun değil.

  3. Yeniden kullanılabilirlik : Güvenli olmayan kod yalnızca tam güven ortamında kullanılabilir. Örneğin, bir ASP.NET sunucusunda, arabellek taşması nedeniyle bir güvenlik açığı oluşturmak oldukça kolay olacağı için genellikle güvenli olmayan kodu kullanamazsınız. Başka bir örnek clickonce olacaktır. Veya uygulamanıza bir ağ paylaşımından erişildiyse. Dolayısıyla, kodunuzu çeşitli dağıtım senaryosunda kullanmayı planlıyorsanız, güvenli olmayan kod oyun dışındadır.

Yani temelde: kaşlarını çattı çünkü gereksiz hatalar getirebilir, hiç kazanç sağlamayabilir ve kodunuzun tekrar kullanılabilirliğini azaltır.

Ancak senaryonuz gerçekten performans için gerektiriyorsa (ve bunu kanıtlayacak verileriniz varsa), belleği nasıl işleyeceğini bilen deneyimli bir programcısınız ve kodunuz kontrollü bir ortamda kullanılacak, o zaman emin olun, devam edin.


4

Bir bakıma, yönetilmeyen kod bir ödeme şeklidir: ekstra geliştirme çabasıyla daha hızlı yürütme satın alırsınız. Gerçekten de, yönetilmeyen kodun geliştirilmesi, hata ayıklaması ve bakımı için daha fazla zaman gerekir. Tam olarak doğru olmak çoğu katılımcı için bir zorluktur. Bir bakıma, bu, montajdaki programlamaya benzer: elbette, montajda * yazarsanız CPU'nuzdan daha fazla güç sıkıştırabilirsiniz , ancak bu rotaya çok daha fazla çaba harcarsınız.

Bazen, geliştirme süresindeki fark çok önemlidir - saat yerine gün. Bununla birlikte, yürütme hızındaki fark neredeyse dramatik değildir. Bu nedenle, yönetilmeyen kodun geliştirilmesi, postanızda açıkladığınız duruma benzer durumlara ayrılmıştır - ses ve video işleme gibi kaynağa aç algoritmaların uygulamaları.

Aslında, sorunuzun cevabı neden herkes Ferrari'yi sürmüyor? Neyse ki, herkes bunu karşılayamaz.


* Derleyicilerdeki optimizasyon teknolojisinde son birkaç on yılda kaydedilen ilerlemeler, bu boşluğu o kadar daraltmıştır ki, artık kesin bir bahis değildir.


0

Çünkü matematiksel anlamda doğruluktan veya başka bir kısıtlamadan "emin" olmak (yani kanıtınız vardır) zorunlu diller için çok zor bir problemdir. Programlar genellikle o kadar çok sayıda duruma sahiptir ki, olası her durumu kontrol ederek bile doğrulamak mümkün değildir. Ve yapıcı bir kanıt oluşturmak otomatikleştirebileceğiniz bir şey değildir.

Bunun nedeni, yürütmeyi yöneten sigortaların çoğu zaman güvensiz kodla alacağınız küçük performans kazancını daha fazla ağırlamasıdır. Tabii ki, bu da özel kullanım durumuna bağlıdır.


1
Aklın doğruluğu veya sadeliği ile ilgisi olduğunu sanmıyorum ..
Jimmy Hoffa

Kimse resmi bir doğruluk kanıtı hakkında konuşmuyor.

1
Eminim yayınınız bu noktayı kaçırmaktadır, ancak resmi bir kanıt oluşturmuyorum. Benzer şekilde, programımın bir kez ve herkes için kanıtlamadan doğru olduğundan emin olabilirim (örneğin kapsamlı testler, hata ayıklama ve herhangi bir hata olmadan uzun süreli gerçek dünya kullanımından sonra). Bu yorum, çoğu insanın "doğru olduğundan" söylediklerinde ne anlama geldiğine çok daha yakındır. Resmi yöntemler çok niş bir konudur ve çoğu geliştirici için tamamen dikkate alınmaz.

1
Böyle bir soru görmüyorum. Okuduğum soru, yönetilen dünyadan kaçış kapağının neden daha sık kullanılmaması / kullanılmaması gerektiğidir (yönetilen koda varsayılan olarak ayarlanmasının mantıklı olduğunu ima eder). Her durumda, bu soruyu cevaplamak istiyorsanız (doğruluk sağlamanın sertliğini göstererek), bunu mutlak, resmi doğruluk güvencesi hakkında konuşmadan yapabilirsiniz . Şu andan itibaren cevabınız sadece zorunlu diller için eksiksiz, doğru doğruluk kanıtları etrafında dönüyor. Ama bu aşırıya kaçıyor ve yönetilen C # ile ilgili kanıtların eşit (veya neredeyse aynı) zor olduğunu düşünüyorum.

1
@fish: Ne dediğini görebiliyorum. Kanıtlanması zor bir şey ile akıl yürütmesi zor bir şey arasında bir ilişki vardır. Doğru olduğunu kanıtlamak zorsa, doğru olduğundan emin olmak çok zor.
Michael Shaw

0

Kısacası, hiçbir şey tüm bu işleri yapmanıza ve C ++ ortamında programınızın bit ve cıvatalarını yönetmenize engel olmaz. Çöp toplayıcı olmadan tüm bellek çemberlerini ve sızıntılarını doğru bir şekilde yönetebileceğinizden emin olduğunuzdan, bunu C ++ ile yapabilirsiniz: :)

Aksine, C #, .NET çerçevesinde güvenli bir şekilde çalışmak için güvenli / yönetilen ve güçlü yazılan geliştirme ortamı sağlama avantajlarına sahiptir.

Yönetilmeyen kod programlamanın olası geri çekilmesi, daha uzun geliştirme süresi, ayrıntılı testler için zaman tahsisidir. Tabii ki işlem hızı ve yazılımınızın nasıl çalıştığı üzerinde daha fazla kontrol elde edeceksiniz .

Bu nedenle, 4.0'dan başlayarak .NET Framework'te yönetilmeyen kodla çalışma seçeneği, onu kullanmamanız üzerine kazanç getirebileceğinden emin olduğunuzda kenar durumlar için bir seçenektir ...


Aha thats ilginç ben mikro denetleyici dünyadan olduğumu görmek ve orada genellikle iyi c ++ yazmak hata için az yer var ve iyi yazılım iyi tasarım yapmak anahtar şey
user613326
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.