Yönetilen Kodlayıcılar ve Yerel Kodlayıcılar


19

Ben bir kodlayıcıyım ve hem yerel hem de yönetilen kod konusunda deneyimim var. Pascal ve C ile başladım, sonra C ++ 'ya ve sonunda C #' a geçtim.

Geçen yıl boyunca, neredeyse sadece C # kodlama ve bir C ++ kodlayıcı iken doğal olarak gelen şey çok kaybetti.

Birkaç hafta önce bazı yerli C ++ kodu yazmak için oturduğumda, yavaş yavaş her şeyin karmaşıklıkları, tuhaflıkları ve kendine has ifadeleriyle tanıştığım için kendimi karıştırıyorum. Ben neredeyse tamamen bir boyutuna geçmeden bir işleve dinamik olarak ayrılmış bir dizi geçirmenin alıcı işlevi dizinin ne kadar uzun olduğunu bilmenin hiçbir yolu olacağını anlamına unutmuş olduğunu söylemek utanıyorum.

Yönetilmeyen koda karşı yönetilen ve karşılaştırılan sayısız makale ve belge vardır. Yerel kodun iyi optimize edilmişse yönetilen koddan önemli ölçüde daha hızlı ve daha hafif çalışabileceğini hepimiz biliyoruz. Öte yandan, yönetilen kodun çöp toplayıcıları ve çalışma zamanı CPU'ya özgü ve işletim sistemine özgü optimizasyonu vardır, bu da yerel koda parası için bir çalışma sağlayabilir.

Tamamen teknik bir bakış açısıyla, net bir kazanan yok.

Şüphesiz, yönetilen kodun kodlanması ve anlaşılması daha basit büyüklük sıraları olduğu şüphesizdir. Sadece Win32 C ++ vs C # basit bir GUI oluşturmak için gerekli satır sayısı farkı bakın.

Yerel kodlama günlerimde, çoğunlukla süper bilgisayarlarda çalışan matematiksel simülasyonlar yazdım. Çirkin CLI'leri vardı ve çoğunlukla algoritmaya odaklanmışlardı. Bugünlerde C # yazıyorum ve güzel GUI uygulamaları üretiyorum, ancak yerel bir dilde benzer bir kalibre yapmak zorunda kalsaydım kaybolurdum. QT gibi bir çerçevede bile, C ++ / QT'de bir şey üretmek için C # 'dan iki kat daha uzun sürer.

C / C ++ 'da büyük ölçekli, tam özellikli bir GUI uygulaması yazan birini gördüğümde, huşu duygusu ve kıskançlık hissi hissetmekten kendimi alamıyorum.

Diğer deneyimli kodlayıcıların yönetilen ve yönetilmeyen dilleri nasıl gördüğünü merak ediyorum. Yönetilen kodu amateur-ish olarak görüyor musunuz ? Yerli kodlayıcıları daha sert görüyor musunuz ?

java  .net 

Yanıtlar:


26

Günlük işim şu anda C ++ 'da, ancak artık bir fark görmeyeceğim kadar uzun bir süre programladım. İşte benim gözlemlerim:

  • Diğer dillerle ilgili iddia edilen verimsizliklerin çoğu, C ++ programcıları tarafından en iyi uygulamalar olarak sıklıkla yeniden uygulanmaktadır. En azından veri işleme yoğun olmayan kodlar için, bu şeyleri otomatik olarak yapmayan dilin kazandığı yürütme hızı avantajını büyük ölçüde ortadan kaldırmak için yeterli sayıda boş kontrol, dizi sınırı kontrolü, tür kontrolü, giriş doğrulama vb.
  • Bu ekstra kazan plakası bir süre sonra kökleşmiş bir alışkanlık haline gelir, böylece ekstra bir iş gibi hissetmez ve eksik olduğunda boğaz ağrısı gibi durur.
  • Bir "yönetilen" dilde programladığımda, bellek sızıntısı oluşturmadığından emin olmak için hala bellek ayırmayı düşünüyorum. Açık bir şekilde koymayabilirim delete, ama yine de çöp toplayıcının silinmeye uygun olduğunu düşündüğüm noktanın farkındayım. Java'da başlayan düşük bellek sorunlarını çözmek için C ++ 'da yaptığımdan daha zorlandım, çünkü C ++' da çok uzun süre görmezden gelmek çok daha zordur.
  • Aynı şey dinamik yazma için de geçerlidir. Hala bir işlev parametresi bir dizi, int veya bir dize olup olmadığını kafamda izlemek zorunda. Aslında, daha zihinsel çaba gerektiriyor, çünkü bu tür benim için açıkça listelenmiyor.
  • Modern C ++ stili, C # öncesi dönemden çok farklıdır. İnsanlar dil değiştirmektense, geçmişin unutulmaz bellek yönetiminin çoğundan kaçınmak için mevcut C ++ özelliklerinin benzersiz şekilde nasıl kullanılacağını "keşfettiler". Belleği otomatik olarak serbest bırakan tasarım desenleri artık çok yaygın.
  • Bildiğim kadarıyla, sadece kod yazarak GUI uygulamaları yapmak mümkün olsa da, QT tasarımcısı gibi grafik tasarımcıları, çoğunlukla sadece olay işleyicileri veya çalışma zamanı özelleştirme için kullanılan kod ile çok tercih edilen yöntemdir.
  • Bir süredir yoğun olarak kullanmadığınız diller, sözdizimini çoğunlukla hatırlasanız bile her zaman biraz sakar hissediyorlar. Bir yıl boyunca python yazmazsam, unuttuğum çok fazla idiyosenkrazi var ve nesnel olarak çoğu insan python'u "daha kolay" dil olarak görmesine rağmen, bir süredir C ++ 'dan daha garip geliyor.

Tüm bu faktörlerin bir araya gelmesiyle, zihinsel modelim C ++ ile diğer dillerde programladığım zaman arasındaki farklarla oldukça tutarlıdır ve farklar çoğunlukla sadece sözdizimsel olarak hissedilir. Kabul edilirse, bunun çoğu C ++ dilinin kendisine özgü özelliklerden ziyade eğitim, alışkanlık, kodlama standartları ve modern tasarım modellerinin bir sonucudur, ancak karşılaştırma hala devam etmektedir.

Söylemeye çalıştığım şey, tecrübelerime göre programcının eğitiminin kullandığı dilden çok daha fazla fark yarattığıdır.


20

Yönetilen kodu amateur-ish olarak görüyor musunuz? Yerli kodlayıcıları daha sert görüyor musunuz?

Hayır.

Mühendis ve programcı arasındaki farkları görüyorum. Hardcore mühendis her zaman kabul edilebilir bir çalışma zamanı standartta zaman az miktarda işi yapmak için uygun olan dil / teknoloji yığını seçecektir.

Bu günlerde işlemci gücü ile, daha düşük seviyeyi kullanarak bir makineden olabildiğince fazla almaya ihtiyaç duyma sıklığı , yerel diller gittikçe azalıyor. Genellikle bunun için bir iş durumu yoktur. Verimlilik, yürütme süresinde her zaman birkaç milisaniye farkı aşacaktır.


+1 ama bunun ekonomik bir etki olduğunu aklınızda bulundurun - eğer bir hesaplama döngüsü 1 milyon dolara mal olursa, o zaman aşırı optimizasyon geçerli olur - ya da bilgisayarlarla hiç
uğraşmazdık

10
genel olarak daha düşük performans görmemiz dışında - Word6 modern donanımda aydınlatma gibi çalışır, Word2010'un yüklenmesi sadece bir dakika sürer. Bugün programcılara ayak uydurmak için bu süper hızlı donanıma ihtiyacımız var!
gbjbaanb

2
@gbjbaanb: Programcılar ne seçerse seçsin, yeterince büyük kod tabanları yavaş olacaktır. IIRC, Word hala C ++ ile yazılmıştır (ve tüm eski Word 6 kodunun önemli bir bölümünün hala orada olduğuna bahse girerim ).
Steven Evers

2
@gbjbaanb, Word 2010, .NET'te Word 6'nın doğrudan yeniden yazılması değildir. Çok daha fazla özellik ekler ve daha birçok kullanım senaryosunu ele almalıdır. Word 6'dan çok, çok daha büyük bir uygulamadır.
Mircea Chirea

6

Ne yazık ki, Microsoft bize "Yönetilen Kod" C # /. Net sınıf Kütüphaneleri ile sınırlamak için yol açtı.

Burada oynayan iki ayrı ve neredeyse alakasız şey var.

  1. Serin .Net kütüphaneleri.

  2. Yönetilen kod.

C #, tek bir fiyat için hem düzenli, desteklenen, kullanımı kolay bir pakette sunar.

C ++, neredeyse her şeyi yapan çok sayıda harika kütüphaneye sahiptir. "Yerel C ++" kodunu C # / .Net kodundan daha fazla "karmaşıklığa, tuhaflığa ve kendine özgü ifadeye" sahip olmak yerine, daha iyi C ++ kitaplıkları arayabilirsiniz.

Daha iyi kütüphaneler de güzel C ++ kodu yazmanıza izin verir.

C / C ++ 'da büyük ölçekli, tam özellikli bir GUI uygulaması yazan birini gördüğümde, huşu duygusu ve kıskançlık hissi hissetmekten kendimi alamıyorum

Kötü politika. Bunun yerine hangi sınıf tanım kitaplıklarını kullandıklarını öğrenmelisiniz. Siz de bu kütüphaneleri kullanabilirsiniz.

Her şey araçlarla ilgili. Alet olmadan, sadece pantolonlu hayvanlarız.

"Yerel C ++", tüm araçlarınızı atmanız gerektiği anlamına gelmez. Bu, iyi araçlar bulmanız gerektiği anlamına gelir. Microsoft artık size yardımcı olmuyor, bu nedenle doğru araç karışımını bulmak için zaman harcamanız gerekiyor.


"Git ne kullandıklarını öğren" için +1, ama açıkçası bunun alet kullanan hayvanlar veya arada sırada pantolon giyen hayvanlar için çok hoş olmadığını düşünüyorum.
Ian Pugsley

@Ian Pugsley: Pantolon giyen ancak alet kullanmayan hayvanlar muhtemelen hayvan olma durumları iyi. Ancak, aletsiz hayvanları pantolon kullanmadan rahatsız edebileceğiniz konusunda haklısınız. Örneğin karım pantolon giymemeyi tercih ediyor ve alet kullanıyor. Belki de bu soruyu okumaz.
S.Lott

Sadece umut edebiliriz (ve oldukça yüksek şanslara bahis yapabiliriz). Söylediğim tek şey, bir pantolon giyecek kadar zeki bir hayvana bakmayacağım ... her ihtimale karşı.
Ian Pugsley

Evet, C # 'ın standart kütüphanesinden farklı olarak, C ++' lar eskidir ve modern ihtiyaçlardan yoksundur (GUI, serin ağ arabirimi, vb.).
Moshe Revah

Microsoft bir kez daha Windows 8'de C ++ ile size yardımcı oluyor (tüm Windows 8 geliştirme yüzeyi yerel kod ve C ++, C # ve JavaScript ile birlikte birinci sınıf bir vatandaştır): msdn.microsoft.com/en-us/library/windows/ apps /…
Zach

5

Buradaki sorun, sert programlama veya bunun gibi bir şey değil, kontrol ile ilgili. Gerçek şu ki C #, kontrol maliyetiyle üretkenlik sunuyor. Yüksek miktarda kontrole ihtiyaç duyan bir program yazıyorsanız (bu bellek tam olarak şimdi yerleştirilmiştir), o zaman C ++ kullanmaktan başka seçeneğiniz yoktur. Hızlı bir şekilde yapmanız gerekiyorsa, C # kullanmanız gerekebilir. Sorun, C # için destekleyici kitaplıkların C ++ için sağlanandan çok daha iyi ve daha yeni olmasıdır. Örneğin, MFC çok, çok eskidir ve uygulamalarının korkunç olduğu bilinmektedir, çoğunlukla Standardizasyondan çok önce yazılmıştır. Microsoft, yeni C ++ kitaplıkları sağlamak için biraz çaba harcarsa, Visual Studio 2010'daki yeni PPL'ye göz atın, sonra garip bir şekilde, bu görev C ++ 'da kolaylaşır. Ve bence bu şekilde göç ediyorlar,

Öte yandan, yönetilen kodun çöp toplayıcıları ve çalışma zamanı CPU'ya özgü ve işletim sistemine özgü optimizasyonu vardır;

Birçok yönetilen dil taraftarının bunu söylediğini duydum, ama aslında gerçek olduğunu hiç görmedim. Gerçek şu ki, daha yeni CPU'larda bulunan yeni CPU talimatları, çok sert bir matematik yapmazsanız, bu kadar fazla avantaj sunmaz; bu durumda, derleme veya yorumlama sırasında yükü kaldıramazsınız. -sime ve SSE'nin en yeni ve en iyisini kullanmak için Intel'in C ++ derleyicisini kullanabilirsiniz. C ++ derleyici optimizasyonlarının kapsamı, JIT'in yapabileceklerine kıyasla çok büyüktür, çünkü JIT program çalışırken zamanın bir kısmında yürütmek zorundadır, oysa C ++ derleyicileri derlemek için tatlı zamanlarını almak için oldukça efsanedir.

Çöp toplama sihirli bir şey ya da bunun gibi bir şey değildir - bu bir algoritma seçimidir. Tüm durumlar için uygun mu? C # 'daki IDisposable karışıklığa ve Java'nın bu sorunu denemeye nasıl uğraşmadığına bakarken, C ++ yıkıcıları dosyalarınızı kapatacak ve belleğinizi serbest bırakacak ve soketlerinizi vb. Kapatacak. GC bazı programlar için harika ve bazıları için değil.


İşlemciler arasında SIMD'den daha fazla fark var - C ++ derleyiciniz muhtemelen boru hattını JIT'iniz kadar dikkate alıyor olsa da.
Peter Taylor

Sistem durumunu incelemek ve erişilebilecek sabitlenmiş her nesne referansını tanımlamanın mümkün olduğu bir çalışma zamanı ortamı , C ++ ile mümkün olmayan yollarla GC ile ilgili birçok maliyeti amorti edebilir. Java veya C # 'da, String foo,bar;ifade foo=bar;iki talimat yürütür - bir kayıt yükü ve bir kayıt deposu. Dize uzunluğundan bağımsız olarak sabit yürütme süresi. C ++ yaklaşabilir mi?
supercat

2

Bence yerel C / C ++, C # ile karşılaştırıldığında, C / C ++ kendisi için birleştirici gibi görünüyor. Her zamanki gibi başka bir karmaşık soyutlama katmanı (sadece doğru değil, ama diyelim) size daha kolay gelişme, ancak hızda bir miktar azalma ve aşırı bellek kullanımı sağlar. Gördüğüm gibi, sadece farklı kategorilere ayrılıyor, böylece programcıların yeni alt tipleri yaratılıyor.

Btw soyutlama seviyesi C # için inanılmaz derecede hızlı, microsoft mükemmel bir iş yaptı.


2

Amatör diller değil amatör amatörler var. Dilleri (hepsi, en azından çoğu) amaçlarına sahiptir.

Şu anda üretim sistemini test etmek için kullanılan bir sigorta hesaplama motoru üzerinde çalışıyorum. Üretim sistemi C'de yapıldı, motorumuz Java ile yapıldı ve uzun zamandan beri C motorundan daha iyi performans gösteriyoruz, aynı zamanda çok daha üretken oluyoruz. Java per C'den daha hızlı olduğu için, yeterince hızlı ve algoritmalarımız daha iyi olduğu için bunları daha kolay uyguladık, kodumuzu daha hızlı ve daha iyi test edip yeniden düzenleyebildik.

Ayrıca, hesaplama sonuçlarını üretim veritabanının içeriği ile karşılaştırmak için test kodu yazdım: C'de değil, Java'da değil Ruby'de. Yine, yeterince hızlı ve çok daha az kod gerektiriyor, bu yüzden uygulanması daha kolay, test edilmesi daha kolay, genişletilmesi daha kolay.

Hangi dili kullanırsam kullansam amatör gibi hissetmiyorum, ancak olmaması gereken aptalca bir hata yaptığımda böyle hissediyorum.


1

Geçen yıl çalıştığım firma kaba kuvvetle bir iletişim CRC kodunu tersine mühendislikti (sonunda aldık). 3 Geliştiricinin her birinin kendi versiyonu vardı, Borland C, C # .Net 2008, VB6. VB6 açıkça yavaştı, Borland C hızlıydı ama C # .net hızını 12 kat hızlandırdı. Hiç beklediğimiz değildi.


1
Adım adım aynı algoritmayı kullanıyorlar mı? Aynı çıktıyı hesaplıyor olabilirler, ancak çıktıya ulaşmak için kullanılan temel matematik adımları farklı olabilir ve performans, temel adımların ham sayımı ile belirlenir ve bu da "formül" ün bunlara nasıl ayrıştırıldığından belirlenir.
rwong

Eski bir C derleyicisi en son işlemci talimatlarını kullanmıyor olabilir (örn. SSE2 ve üstü)
GrandmasterB

1
Her üç dil de optimize edilmiş yerel koda derlenir (derleme sırasında VB6 / C ++, JIT sırasında .NET). Yani muhtemelen programlama dilleri yerine programcılarınız arasındaki farkları ölçüyorsunuz.
nikie

@nikie JIT! = derleme. Ve derleyicilerin kalitesi farklıdır. JIT hakkında tüm konuşma rağmen, Java aynı C ++ (hiçbir API çağrıları, sadece dizi referansları, döngüler ve basit aritmetik) yazarken çok daha hızlı yürütmek aynı algoritma gördüm.
quant_dev

1
@quant_dev: Tecrübelerime göre orada olan sihirli bir değnek yok ;-) .NET JIT ile deneyimim JIT ve MSVC arasındaki fark ++ çok küçük olmasıdır. Ben de aynı kod için her iki şekilde 12x şüphe.
nikie

1

Bir şeylerin karışımına bağlıdır, ancak temel olarak, diğer her şey eşittir, evet, yerel kod yönetilen koddan daha "hardcore" dır.

Normal bir iş uygulaması için bu genellikle kötü bir şeydir, çünkü ortalama bir geliştirici, kodlarının iş dışı yönlerine daha fazla zihinsel enerji koyması gerektiği anlamına gelir.


1

Programım en iyi Java gibi C ++ olarak tanımlanabilir. Benim fikrime göre Java'da aynı düşük seviye programlamayı elde edebilirsiniz, ancak C ++ düşük seviye programlamasından çok daha zor. Bununla birlikte, genellikle bu düşük seviyeli programlamaya kodunuzun küçük bir kısmında ihtiyaç duyarsınız ve gerekli olmadığı durumlarda yönetilen bir dil daha verimlidir.


1

Yerli geliştiriciler genellikle daha sert oldukları için ün kazanırlar çünkü daha sert hissederler ve bu şekilde hareket ederler. Yerel geliştiriciler, herhangi bir hataya tolerans göstermeyen bir sistemde eğitilirler, çünkü kaçınılmaz olarak sert çökmelere veya sınırsız bellek sızıntılarına neden olurlar. Özellikle .NET, her şeyi etrafına deneme / yakalama gibi temel tembel saldırılara izin verir, geliştiriciyi temel sorunu anlamak zorunda olduklarını düşünmekten kurtarır (" bazen sadece InvalidOperationException'ı atar. Açıklayamıyorum, sadece her şeyi yakalayalım. kodu kritik! "). Bu hiç siyah beyaz değil, ama gözlemlerim yönetilmeyen dünyada büyüdü ve şimdi tam zamanlı yönetilen kodda çalışıyorlar.

Ayrıca, yönetilen geliştiriciler daha temiz ve daha düzenli BCL'lere erişme eğilimindedir. Bu genellikle onları kapakların altında gerçekte neler olduğunu keşfetmeye teşvik eder. Aynı şey, örneğin, STL veya Boost için de söylenebilir, ancak .NET sınıf kütüphanesi genellikle bizi zaman zaman entelektüel olarak tembel hale getirecek kadar iyidir.

Bununla birlikte, iyi, sevk edilebilir bir yönetilen program yazmak çok iş gerektirir. Bu, yönetilmeyen geliştiricilerin yaptığı gibi bellek ve CPU profili oluşturma, birim testleri ve kod analizi yapmak anlamına gelir. Yönetilmeyen geliştiriciler bunun gidişatını anlama eğilimindedir ve yönetilen geliştiriciler anlamayanlardan daha fazlasını dahil etme eğilimindedir.

Yine, siyah ve beyaz değil. Entelektüel olarak tembel yönetilmeyen geliştiriciler ve hardcore yönetilen geliştiriciler var. İkisi de tanımı gereği diğerinden daha seçkin değildir.


0

Yönetilen kodu amateur-ish olarak görüyor musunuz? Yerli kodlayıcıları daha sert görüyor musunuz?

İki dünya arasında bir boşluk var ve nedenini göremiyorum: yönetilen sistemler yerel kodda bir yere yazılmıştır (son olarak, her şey "montajda" çalışır). Görmek istediğim (henüz hayatımda), uygulamanın tüm alt görevlerinin doğru dil türünde yazılacağı bir uygulama oluşturma sistemidir.


Açıkladığınız gibi bir uygulama oluşturma sistemi sadece (ve umarım daha iyi) bir programlama dilidir.
David Thornley

.NET'e aşina değilim, ancak AFAIK, bir VM ve herhangi bir .NET dili ile kullanılabilen büyük bir kütüphane tarafından çalıştırılan ortak bir yürütülebilir biçime sahip karışık bir dil sistemidir . Aynı sistem yerli / derlenmiş dünyada da iyi olurdu. Platformdan bağımsız, elbette.
ern0

0

Go piyasaya sürüldüğünden beri yerel kod kolaylaştı . Hem okumayı hem de yazmayı Java ve C # 'den daha kolay buluyorum. Her ne kadar Go ile GUI programlama çok hoş olmasa da (seçeneklere hızlıca baktım). C # ile karşılaştırıldığında geniş topluluk ve çeşitli kitaplık
eksikliği nedeniyle yargılamamaya çalışın (örneğin), çünkü hala yeni kabul edilir.

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.