C ++ 'ı C, Perl, Python vb. Yerine kullanmak için herhangi bir sebep var mı? [kapalı]


164

Bir Linux (sunucu tarafı) geliştiricisi olarak, nerede ve neden C ++ kullanmalıyım bilmiyorum.

Performansa gittiğimde ilk ve son seçenek C.

“Performans” ana mesele değilse, Perl ve Python gibi dilleri programlamak iyi seçimler olacaktır.

Bu alanda tanıdığım hemen hemen tüm açık kaynaklı uygulamalar C, Perl, Python, Bash betiği, AWK veya hatta PHP ile yazılmıştır , ancak hiç kimse C ++ 'ı kullanmaz.

GUI veya web uygulamaları gibi diğer alanları tartışmıyorum, sadece Linux, CLI ve daemonlardan bahsediyorum.

C ++ 'ı kullanmak için tatmin edici bir sebep var mı?


5
Sadece STL nedeniyle C ++ düşünün.
dan_waterworth

46
Böylece birlikte C, perl ve python kullanılarak yapılabilecek bir şey sadece C ++ kullanılarak yapılabilir. Ve neden C ++ kullandığını mı soruyorsun?
Manoj R

36
«Performansa giderken ilk ve son seçenek C.» Evet elbette: D Bu kanıtlanmamış ve önemsiz bir iddia.
deadalnix

16
@deadalnix: Öyle demem. C ++, optimizasyonda geri tepebilecek karmaşık kurallara sahiptir, çünkü bazı şeyleri yapmasına izin verilmemektedir. Ve görünmez performans katillerine adım atmak çok kolay. Çok fazla aksiyomatik ve bu nedenle doğrudur: D Hala gerçekte C ++ kodu bazen daha hızlı olacaktır çünkü daha etkili algoritmalar ve veri yapıları kullanacaksınız ve hiç kimse C kodunu yine de optimize etmiyor. Bu nedenle, doğru yapıldığında, C ++ daha güvenli ve daha etkili bir C'dir ve uyumluluk sorunu olmadığında veya% 100 kullanılabilirlik yazılımına gerek olmadığında C ++ 'ı C ++ üzerinden seçmelisiniz.
Kodlayıcı

4
Yayınlanan cevaplarda dikkate alınmayan en iyi neden, doğrudan OP'nin sorusuyla ilgilidir. BAĞIMSIZLIKLAR !!!!, Ortalama sisteminizde c ++ lib'leri bulunmadığından değil, ancak gömülü bir sistem bunları kullanamayabilir. Programınızı her sistemde kullanmanın tek yolu, programınızı normal C'ye yazmaktır. Diğer her şey neden C ++ kullanmamanız gerektiğini ya da daha az temsil etmeniz gerektiğini tartışıyor. Bunların hiçbiri, C ++ 'nın neden daha sık kullanılmadığını ve değer ne olursa olsun, neden bağımlılıklar olduğunu ele almıyor ... O ve ayrıca Linus'un ünlü c ++ rantı.
JM Becker

Yanıtlar:


308

Performansa giderken ilk ve son seçim C.

Ve o zaman yedeklemelisin. Şimdi, olamaz hiç sunucu gelişimi için konuşur. Belki de alternatifler yerine C ++ 'ı tercih etmek için zorunlu bir neden yoktur.

Fakat genel olarak konuşmak gerekirse, C ++ 'ı diğer dillerden ziyade kullanmak gerçekten performanstır. Bunun sebebi C ++ aksine vardır soyutlama bir araç sunmasıdır tüm Biliyorum, diğer diller hiçbir çalışma zamanında performans yükü.

Bu, hala çok yüksek bir soyutlama seviyesine sahip olan çok verimli kod yazmanıza izin verir .

Her zamanki soyutlamaları göz önünde bulundurun: sanal fonksiyonlar, fonksiyon işaretçileri ve PIMPL deyimi. Bunların tümü, gösterici aritmetiği ile çözülen çalışma zamanında olan dolaylı yüklemeye dayanmaktadır. Başka bir deyişle, bir performans maliyeti gerektirir (ancak bu kadar küçük olabilir).

C ++ ise, (performans) maliyeti olmayan bir dolaylı mekanizma sunar : şablonlar. (Bu avantaj, (bazen büyük ölçüde) artmış bir derleme süresiyle ödenir.)

Genel bir sıralama işlevi örneği düşünün.

C'de, fonksiyon qsort, elemanların birbirine göre sıralı olduğu mantığı uygulayan bir fonksiyon imleci alır. Java'nın Arrays.sortfonksiyonu çeşitli şekillerde gelir; bunlardan biri rasgele nesneler sıralar ve C'lerde Comparatorişlev göstergesine çok benzeyen bir nesnenin kendisine iletilmesini gerektirir qsort. Ancak “yerel” Java türleri için birkaç aşırı yükleme var. Ve her birinin sortyöntemin kendi kopyası vardır - korkunç bir kod kopyası.

Java burada genel bir ikilemi göstermektedir: ya kod çoğaltmanız var ya da bir çalışma zamanı ek yükü yaşıyorsunuz.

C ++ 'da, sortfonksiyon C' deki gibi çalışır qsort, küçük ama temel bir fark vardır: fonksiyona geçirilen karşılaştırıcı bir template parametresidir. Bu, çağrısının çağrılabildiği anlamına gelir . İki nesneyi karşılaştırmak için herhangi bir dolaylı işlem gerekmez. Sıkı bir döngüde (burada olduğu gibi) bu aslında önemli bir fark yaratabilir.

Şaşırtıcı olmayan bir şekilde, C ++ sortişlevi sorttemel algoritma aynı olsa bile C'lerden daha iyi performans gösterir . Bu, gerçek karşılaştırma mantığı ucuz olduğunda özellikle fark edilir.

Şimdi, am değil C ++ önsel daha verimli C (ya da diğer dillerde) daha olduğunu söyleyerek, ne de öyle önsel daha yüksek bir soyutlama sunar. Teklif ettiği şey, aynı zamanda çok yüksek ve inanılmaz derecede ucuz bir soyutlamadır; bu nedenle, genellikle verimli ve yeniden kullanılabilir kodlar arasında seçim yapmanız gerekmez.


16
Şimdi ben yerinde veya yanlış olup olmadığını bilmek için C ++ hakkında yeterince biliyorum. Ama aynı zamanda sadece 1 olumsuz oy aldı eklemek istiyorum, bu yüzden rahatla. Bu internet ve indirimler oluyor. Teknik olarak sağlam olsa bile harika cevap!
Chris,

46
çalışma zamanında genel performans yok - bu her zaman doğru değildir. STL vektör uygulamalarına bakarsanız, realloc () kullanmanın avantajlarından yararlanamadıklarını göreceksiniz (işaretçiler, uzun hikaye nedeniyle yapamazlar), bildiğim tüm üst düzey dilleri ise realloc kullanabiliyor ve kullanabiliyorsunuz ( ) vektör ifadesinde. Bu, bariz olmadığı ve hepsi siyah beyaz olmadığı için sadece bir örnek.
mojuba

19
@ Jaroslaw, @Steve: fakat aynı (= kod bloat, komut önbellek özeti), her veri türü için uyarlanmış elle optimize edilmiş kod için geçerlidir (Java'nın çeşitli Arrays.sortuygulamalarına bakınız ). Sadece yüksek soyutlama avantajını kaybedersiniz. Bu, şablonların belirli bir dezavantajı değil, genel olarak kod çoğaltmanın dezavantajıdır. Dahası, bu sıkıntılı döngüler nedeniyle farketmez, genellikle her zaman yüklü olanla aynı koddur.
Konrad Rudolph

18
@ Jaroslaw: Talimat önbelleği ile ilgili komik olan şey bir önbellek olmasıdır . Yani, her şeyi saklamaya çalışmaz , sadece son kullanılan kod . Şablonlar, farklı türler için çok sayıda benzer kod üretebilir (a vector.push_backiçin vector<int>ve bir diğeri için vector<float>, ancak a ile çalışırken kodun komut önbelleğinde vector<int>olmasının çok az nedeni vardır vector<float>. Dolayısıyla, bunun gerçekten önemli olduğunu görmüyorum. Bireysel şablon hazırlama, en iyi duruma getirilmiş ve genel olarak tüm yakalayıcı uygulamalarından tipik olarak daha küçüktür
jalf

29
@ Steve314: "Şişirme" dediğiniz şey, C ve Java için manuel olarak yapılan şey. C ++ 'da otomatik hale getirilebilir ve derleyiciler satıcıların şişkinlikten korunmalarını sağlamaya cesaret edebileceği kadar akıllı olabilir. Ya yavaş olmak (C'de olduğu gibi) ya da kopyalanmış kodu kullanmak (Java'da olduğu gibi) arasında karar vermek zorunda kalırsam, derleyicinin çoğaltmayı yapması (ve belki de akıllı olması) oldukça iyi görünüyor, değil mi?
sbi

166

C ++ 'dan nefret eden çok fazla C programcısı görüyorum. Neyin iyi neyin kötü olduğunu anlamak biraz zaman aldı (yıllar). Bence bunu ifade etmenin en iyi yolu şudur:

Daha az kod, çalışma zamanı ek yükü yok, daha fazla güvenlik.

Ne kadar az kod yazarsak o kadar iyi. Bu, mükemmellik için çaba gösteren tüm mühendislerde hızla ortaya çıkmaktadır. Tek bir yerde bir hatayı düzeltirsiniz, çok değil - bir kez bir algoritmayı ifade eder ve birçok yerde tekrar kullanırsınız, vb. Yunanlıların bile eski Spartalılara kadar izlenen bir deyişi vardır: Bu konuda bilge olduğunu ". Ve işin aslı, doğru kullanıldığında , C ++, çalışma zamanı hızına mal olmadan, C'den çok daha güvenli (yani derleme zamanında daha fazla hata yakalama) yaparken, C'den çok daha az kodla ifade etmenize izin veriyor.

İşte oluşturucumdan basitleştirilmiş bir örnek : Bir üçgenin tarama çizgisi boyunca piksel değerlerini enterpolasyon yaparken. Bir X koordinatı x1'den başlamalı ve bir X koordinatı x2'ye (bir üçgenin soldan sağına) erişmeliyim. Ve her adım boyunca, geçtiğim her piksel boyunca değerleri enterpolasyon yapmak zorundayım.

Piksellere ulaşan ortam ışığını enterpolasyon ettiğimde:

  typedef struct tagPixelDataAmbient {
      int x;
      float ambientLight;
  } PixelDataAmbient;

  ...
  // inner loop
  currentPixel.ambientLight += dv;

Rengi enterpolasyon ettiğimde ("Gouraud" gölgelemesi olarak adlandırılır, "kırmızı", "yeşil" ve "mavi" alanların her pikselde bir adım değeri ile enterpolasyonu yapılır):

  typedef struct tagPixelDataGouraud {
      int x;
      float red;
      float green;
      float blue;  // The RGB color interpolated per pixel
  } PixelDataGouraud;

  ...
  // inner loop
  currentPixel.red += dred;
  currentPixel.green += dgreen;
  currentPixel.blue += dblue;

"Phong" gölgelemesi yaptığımda, artık bir yoğunluğu (ambientLight) veya bir rengi (kırmızı / yeşil / mavi) enterpolasyon yapmıyorum - Normal bir vektörü (nx, ny, nz) enterpolasyonluyorum ve her adımda enterpolasyonlu normal vektöre dayanarak aydınlatma denklemini hesaplayın:

  typedef struct tagPixelDataPhong {
      int x;
      float nX;
      float nY;
      float nZ; // The normal vector interpolated per pixel
  } PixelDataPhong;

  ...
  // inner loop
  currentPixel.nX += dx;
  currentPixel.nY += dy;
  currentPixel.nZ += dz;

Şimdi, C programcılarının ilk içgüdüsü "heck, değerleri enterpolasyona sokan üç fonksiyon yaz ve bunları ayarlanan moda göre çağır" olacaktı. Her şeyden önce, bu benim bir tür problemim olduğu anlamına gelir - ne ile çalışıyorum? Piksellerim PixelDataAmbient mı? PixelDataGouraud? PixelDataPhong? Bekle, verimli C programcısı der ki, sendika kullan!

  typedef union tagSuperPixel {
      PixelDataAmbient a;
      PixelDataGouraud g;
      PixelDataPhong   p;
  } SuperPixel;

..ve o zaman, bir işlevin var ...

  RasterizeTriangleScanline(
      enum mode, // { ambient, gouraud, phong }
      SuperPixel left,
      SuperPixel right)
  {
      int i,j;
      if (mode == ambient) {
          // handle pixels as ambient...
          int steps = right.a.x - left.a.x;
          float dv = (right.a.ambientLight - left.a.ambientLight)/steps;
          float currentIntensity = left.a.ambientLight;
          for (i=left.a.x; i<right.a.x; i++) {
              WorkOnPixelAmbient(i, dv);
              currentIntensity+=dv;
          }
      } else if (mode == gouraud) {
          // handle pixels as gouraud...
          int steps = right.g.x - left.g.x;
          float dred = (right.g.red - left.g.red)/steps;
          float dgreen = (right.g.green - left.a.green)/steps;
          float dblue = (right.g.blue - left.g.blue)/steps;
          float currentRed = left.g.red;
          float currentGreen = left.g.green;
          float currentBlue = left.g.blue;
          for (j=left.g.x; i<right.g.x; j++) {
              WorkOnPixelGouraud(j, currentRed, currentBlue, currentGreen);
              currentRed+=dred;
              currentGreen+=dgreen;
              currentBlue+=dblue;
          }
...

Kaosun kaydığını hissediyor musun?

Her şeyden önce, kodumu çökertmek için gerekli olan tek bir yazım hatası var, çünkü derleyici beni işlevsellikten "Gouraud" bölümünde, ".a" ya erişmek için asla durmayacak. (ortam) değerleri. C tipi sistem tarafından yakalanmayan bir hata (derleme sırasında), çalışma zamanında ortaya çıkan ve hata ayıklama gerektiren bir hata anlamına gelir. Eğer ben erişen olduğumu fark ettiniz left.a.green"dgreen" hesabında? Derleyici kesinlikle sana söylemedi.

Ardından, her yerde tekrarlama var - fordöngü oluşturma modları olduğu kadar çok sayıda orada, "sağa eksi sola adım adım bölünmüş" yapmaya devam ediyoruz. Çirkin ve hataya açık. "J" yi kullanmam gerektiğinde, Gouraud döngüsünde "i" kullanarak karşılaştırdığımı fark ettiniz mi? Derleyici yine sessiz.

Peki ya modlar için if / else / ladder? Üç hafta içinde yeni bir işleme modu eklersem ne olur? Yeni modu tüm kodumda "if mode ==" biçiminde kullanmayı hatırlayacağım mı?

Şimdi yukarıdaki çirkinliği, bu C ++ yapı seti ve bir şablon işlevi ile karşılaştırın:

  struct CommonPixelData {
      int x;
  };
  struct AmbientPixelData : CommonPixelData {
      float ambientLight;
  };
  struct GouraudPixelData : CommonPixelData {
      float red;
      float green;
      float blue;  // The RGB color interpolated per pixel
  };
  struct PhongPixelData : CommonPixelData {
      float nX;
      float nY;
      float nZ; // The normal vector interpolated per pixel
  };

  template <class PixelData>
  RasterizeTriangleScanline(
      PixelData left,
      PixelData right)
  {
      PixelData interpolated = left;
      PixelData step = right;
      step -= left;
      step /= int(right.x - left.x); // divide by pixel span
      for(int i=left.x; i<right.x; i++) {
          WorkOnPixel<PixelData>(interpolated);
          interpolated += step;
      }
  }

Şimdi şuna bak. Artık bir sendika çorbası yapmıyoruz: her bir mod için özel türlerimiz var. Bir ortak sınıftan ( CommonPixelData) miras alarak ortak şeylerini ("x" alanı) yeniden kullanırlar . Ve şablon derleyiciyi CREATE'e (yani, kod-oluşturmaya) kendimizi C olarak yazdığımız üç farklı işlevi, ancak aynı zamanda, türleri hakkında çok katı kılıyor!

Şablondaki döngümüz değişmez ve geçersiz alanlara erişemez - yaparsak derleyici havlayacaktır.

Şablon ortak çalışma (her seferinde "adım" artan döngü) gerçekleştirir ve bunu sadece çalışma zamanı hatalarına neden olmayacak şekilde yapabilir. Tipine göre enterpolasyon ( AmbientPixelData, GouraudPixelData, PhongPixelData) ile yapılır operator+=()biz yapılar içinde katacak - temelde dikte nasıl her tür enterpolasyonlanan.

Ve WorkOnPixel <T> ile ne yaptığımızı görüyor musunuz? Tür başına farklı işler yapmak istiyoruz? Biz sadece bir şablon uzmanlığı diyoruz:

void WorkOnPixel<AmbientPixelData>(AmbientPixelData& p)
{
    // use the p.ambientLight field
}


void WorkOnPixel<GouraudPixelData>(GouraudPixelData& p)
{
    // use the p.red/green/blue fields
}

Yani - çağırılacak işleve türe göre karar verilir. Derleme zamanında!

Tekrar silmek için:

  1. ortak parçaları tekrar kullanarak kodu en aza indiririz (şablon üzerinden),
  2. Derleyici her zaman kontrol edebilmemiz için çirkin hack kullanmıyoruz, katı tip bir sistem kullanıyoruz.
  3. ve hepsinden önemlisi: Yaptığımızın hiçbiri, herhangi bir çalışma zamanı etkisine sahip değil. Bu kod SADECE eşdeğer C kodu kadar hızlı çalışacaktır - aslında, C kodu çeşitli WorkOnPixelsürümleri çağırmak için işlev işaretçileri kullanıyorsa , C ++ kodu C'den daha HIZLI olacaktır, çünkü derleyici türe özgü WorkOnPixelşablon uzmanlaşmasını satırda tutacaktır aramak!

Daha az kod, çalışma zamanı ek yükü yok, daha fazla güvenlik.

Bu, C ++ 'ın her şeyden önce ve tüm dillerin sonu olduğu anlamına mı geliyor? Tabii ki değil. Yine de takasları ölçmek zorundasın. Bilgisiz insanlar Bash / Perl / Python betiği yazmaları gerektiğinde C ++ 'ı kullanacaklar. Tetikleme mutlu C ++ yenileri, onları durdurup paketlemeden önce, sanal çoklu kalıtım içeren derin iç içe sınıflar yaratacaktır. Bunun gerekli olmadığını fark etmeden önce karmaşık Boost meta-programlama kullanacaklar . Onlar HALA kullanacak char*, strcmpve makrolar yerine std::stringve şablonları.

Fakat bu, kiminle çalıştığınızı ... izlemekten başka bir şey ifade etmez. Sizi yetersiz kullanıcılardan koruyacak bir dil yok (hayır, hatta Java değil).

Çalışmaya ve C ++ 'ı kullanmaya devam edin - fazla abartmayın.


18
"Hayır, Java bile değil" için +1 :)
Nathan Osman

53
Örnek için +1. Uzun bir mesajdı, ancak C ve C ++ kodları arasındaki karşılaştırma etkileyici.
paercebal

Ve bu, bayanlar ve baylar, neden Lex / yacc var. Aynı akıl yürütme, c ++ 'nın parçalarının aynı kod üretme felsefesine düştüğünü asla anlamadım. Bir ara yine bakmam gerekecek.
Spencer Rathbun

2
Çok sayıda 2B oluşturma kodu yazdım (on yıldan uzun bir süre önce) ve C ile C ++ arasında geçiş yaparken bu sorunla karşılaştım: tarama satırınız 1 bit pikselden (8 piksel bir bayt)? Tarama satırınız R, G ve B bayttan (piksel başına 3 bayt) oluştuğunda? Ve R, G ve B için üç ayrı tamponunuz olduğunda? Cevabı biliyorsunuz: C ++ orada hiçbir yardımı yok ve şablonları kullanmakta ısrar etmek sizi çok fazla alan ve zaman optimizasyonu yapacak
Walter Tross 29:13

Bunun için neden C ++ 'da şablon kullanıyorsunuz? Metodunuz temel sınıfın bir parametresini bildirir, böylece [C # programmer] bakış açımdan türetilmiş tip bir örneği temel tip parametresine geçirebiliyormuşsunuz gibi görünür. C ++ bilmiyorum, lütfen açıklar mısın?
Vlad

79

Kazanan bebek için RAII .

Cidden, C ++ 'da deterministik imha, kodu hiçbir şekilde ek yükü olmadan daha net ve güvenli hale getirir.


20
"C ++: Ciddiyetle deterministik seçenek. Bugün doktorunuza sorun."
Kyle Strand

2
Takip: Rust şimdi bu alanda bir rakip. Rust'un imha yöntemleri hakkında temel bir RAII örneğine ve belgelerine bakın .
Kyle Strand,

1
C, deterministik olacak, ancak malloc-ed bellek kullanılırken gerçekleşmesini sağlamak için daha fazla çalışma gerektirecek
Baldrickk

1
@Baldrickk in bir kaynak kullandığınız her yere temizleme kodu yazmanız gerekir. C ++ 'da, kaynağın tanımında bir kez yazıyorsunuz . Hem C hem de Java "temizleme işleminden sonra kullanılan kaynaklardan" ve "kaynak sızdırıyor" hatalarından muzdariptir, çünkü temizleme otomatik değildir . Bellek yalnızca kaynak değil.
Caleth

70

C ++ 'ı kullanmak için tatmin edici bir sebep var mı?

  1. Şablonlar ve STL. Çok sayıda yararlı soyutlama ve işçilikten tasarruf sağlayan araçlar için (ikili ayak izi biraz daha büyük olsa da) kayda değer bir çalışma süresi performansı elde etmeden çok az bir inşaat zamanı (ve bazı potansiyel olarak anlaşılmaz hata mesajları) ile işlem yaparsınız .

    O (tıklandığında önce bana birkaç yıl aldı) başınızı etrafında sarmak için bir süre alır, ancak bunu bir kez hayatı yapabilirsiniz çok basit.

  2. C ++ metin işleme olan büyüklüklerdir C'DE daha az ağrılı


35
Cevabımda tamamen unuttuğum metin işleme için +1.
Konrad Rudolph

8
Heh Özellikle metin işleme ağrılı en Python diyelim kıyasla bulundu ..
Nils

7
Yükseltme hala C ++ kullanmamın tek nedeni.
Ferruccio

33
@Nils: 1'den fazlaya acı veren bir ölçekte, C ++ dilinde metin işleme, Python gibi daha modern dillerden kesinlikle daha kötü. Sadece C’deki metin işlemesi kıçındaki acıyı tanımlar . Seçim, söz konusu uygulama için C ile C ++ arasındaysa, C ++ kolayca kazanır.
John Bode

8
İnsanların neden C / C ++ dilinde metin işleme gibi şeylerle bu kadar zorlandıklarını bilmiyorum. Sadece bir kütüphane kullanın veya kendinizinkini yazın. Düşük seviye işlevleri (bir kerelik ağrı) yazdığınızda, büyük bir performans, sıkı kod ve daha fazla esneklik elde edersiniz. Evet, hızlı / kirli komut satırı araçları için Python kullanacağım ancak ciddi üretim kodu için C / C ++ kullanacağım.

41

Evet.

Yürütülebilir verimlilik arıyorsanız, C veya C ++ 'a düşersiniz, bu yüzden buna odaklanacağım.

Şablonlar yaygınlaşmadan önce bile, 1990'ların ortasındaki kadar erken tartışacağınız iki farklı basit nedenden dolayı C ++ over C'yi kullanmayı tercih ettim: nesne polimorfizmi ve RAII .

Her çeşit ilginç şey için polimorfik C ++ nesnelerini kullandım. Örneğin, OMAP ve XScale ARM CPU'larında kare tampon kaplamalı gömülü bir Linux sistemi üzerinde çalışıyordum. İki donanım mimarisi, çok farklı API'ler ile farklı kaplama özelliklerine sahiptir. Yerleşimlerin idealleştirilmiş bir görünümünü ortaya çıkarmak için ortak bir sanal "Yerleşim" temel sınıfını kullandım ve kodun hangi mimaride çalıştığına bağlı olarak çalışma zamanında uygun şekilde başlatılan "OmapOverlay" ve "XScaleOverlay" sınıflarını yazdım.

Basitleştirmek için RAII, nesnenin yapıcısı sırasında veya daha sonra nesnenin ömrü boyunca bir nesneye bağlı kaynakları tahsis ettiğiniz ve nesnelerin imha edicisinde serbest bırakıldığı veya serbest bırakıldığı fikridir. C ++ 'da bu gerçekten hoş, çünkü otomatik değişken olan nesneler kapsam dışına çıktığında imha ediliyor. C ve C ++ 'da aynı derecede yetkin kişiler için, C ++' da kaynak ve bellek sızıntısından kaçınmak çok daha kolaydır. Ayrıca bir etiketin çağrılmasından önceki bir fonksiyonun sonunda bir etiketin çok yaygın C meme'sine sahip çok fazla C ++ kodu görmüyorsunuz free(), ve gotobazıları orada atlama fonksiyon bloğunda.

Bunca şeyi C ile yapabileceğinizi tamamen biliyorum - bu sadece çok daha fazla iş, çok daha fazla kod satırı ve neyle uğraştığınızın çok daha çirkin ve çoğunlukla anlaşılması zor. Tüm X sunucu içindekiler aracılığıyla polimorfizm kodu var ve dostum, kabaca ve garip ve izini sürmek çok mu zor.

Ayrıca, GTB + ve Clutter gibi GNOME teknolojileriyle, hepsi de GObject sistemi kullanılarak C ile yazılmış çok fazla çalışma yapıyorum. GObject, güzel kapağı çıkarılmış ve tüm çirkin iç kısımları açığa çıkaran C ++ nesne sistemi gibidir ve bir satırlık bir C ++ yönteminin yapacağı şeyi yapmak için genellikle yarım düzine kod satırı gerektirir. Şu anda biraz yazıyorum ClutterActorsve matematik gerçekten ilginç olsa da, sürekli şunu düşünüyorum, "Hepsi C ++ 'ta çok daha özlü ve anlaşılır olur".

Ben de sık sık, "Biliyor musun, eğer bunu C yerine C ++ ile yazıyor olsaydım, saat 9'da ofisimde oturmak yerine karımla birlikte MythBusters'ı izleyerek salonda olurdum ."


9
Burada söylediklerinizle gerçekten ilgili olabilir, özellikle 1) RAII ve 2) ile ilgili düşüncelerim "Düşüncelerinizi C + yerine C ++ ile yazıyorsam ..." düşüncesiyle ilgili olabilir. ve ekip hemen hemen bir "C" veya "C sınıfı" dükkan "türü olsa bile, RAII'yi kesme manipülasyonu, mutex işlemleri ve izleme / günlüğe kaydetme (özellikle G / Ç'yi değiştirme gibi şeyler) için teşvik etmeyi deniyorum. çizgiler). Polimorfik çerçeve tamponları tanımınız bana polimorfik mesaj tamponlarını dağıtılmış bir sistemde kullanmamı hatırlattı.
Radian

29

C ++ C kadar hızlı (bazı şeyler daha hızlı, bazıları daha yavaş) ve daha iyi soyutlamalar ve organizasyonlar sunuyor. Sınıflar, ilkel türlere benzer şekilde çalışır ve akılda tutulmadan büyük miktarda kod kullanılmasına izin verir. Operatör aşırı yüklenmesi ve şablonlar, veri gösterimleri değişirse daha iyi çalışan kod yazmayı mümkün kılar. İstisnalar, daha kolay hata yönetimi sağlayabilir. Derleyici, derleme zamanında daha fazla şeyi kontrol etmek için kullanılabilir.

Bunun için ödediğiniz fiyat oldukça kötü bir öğrenme eğrisidir ve bu konuda ince hatalar yapmak, aşina olduğum diğer dillerden daha kolaydır.

Bu yüzden, şimdi yaptığınız şey için öğrenmenin sizin için faydalı olup olmadığını söyleyemem. Kesinlikle Python veya Perl ve C kombinasyonları ile alabilirsiniz, ancak C ++ kullanımı zor bir pakette hem soyutlama hem de performans sunar.


13
Orada hiçbir daha hızlı ise her zaman C şekilde kullanabilirsiniz (ve bakım) çünkü C ++ C daha yavaş olduğu olgusu.
Jack Aidley

1
@JackAidley - C ++ 'ın kısıtlama ve statik dizi parametrelerini desteklememesi dışında. Ve bunun dışında bir yerde C ++ tarzı kullanmak, onu başka yerlerde de kullanmaya zorlar.
martinkunev

@martinkunev restrict, takma optimizasyon optimizasyonlarından dışlama yapmak için kullanılır, bu nasıl işleri daha hızlı hale getirmeye yardımcı olur ? ve "statik dizi parametresi" nedir? ve "stil" performansı nasıl etkiler?
underscore_d

1
@underscore_d, takma olmayanlar için bir garantiye dayanan optimizasyonlara izin verir; statik dizi parametreleri, derleyicinin bir işaretçi argümanının NULL olmadığını ve bu işaretleyicinin en az belirli sayıda öğeye işaret ettiğini varsaymasına izin verir; "Tarz" kelimesinin çeşitli anlamlara geldiğini ve bağlam dışına çıkarmanın anlamını değiştirdiğini - mesela istisnaların akıllı işaretçilerin kullanımını nasıl zorladığını konuşuyorum.
martinkunev

1
@martinkunev Hmm, bu yüzden statik bir dizi parametresinin bir T (&arr)[n]veya std::array<T, n>- kullanarak bir C ++ şablonundan işlevsel olarak farklı bir şey sağlayıp sağlamadığını merak ediyorum , orada fazla bilgi olmadığı için bunu daha fazla araştırmak zorunda kalacak. Akıllı işaretçiler hakkında mantıklı, bu kesinlikle iyi bir örnek. Eşit bir oyun alanında kodlama yaparsak, istisnalar kullanmazız, bu yüzden olası maliyetlerin hiçbiri gerçekleşmez ... ancak 3. parti kütüphanelerinin resme girmesinden sonra birçok varsayımda bulunma ihtimalinden mahrum kalacağınızdan şüpheleniyorum. Risk altındadır.
underscore_d

27

C ++ 'ı 1990'ların dili, geçmiş bir dönemin dili olarak görüyorum.

O zamanlar büyüktü çünkü performans açısından daha düşük maliyetle daha yüksek düzeyde dil yapıları ve mekanizmaları teklif ediyordu. Adres defteri uygulamalarından aviyonik yazılımlara kadar her şeyi geliştirmek için evrensel bir araçtı ve OO çılgınlığına ilham verdi. OOP açlığı ve AIDS'i çözdü ve evet, 1990'ların sonlarında OO olmayan bir dilin öğrenmeye değmeyeceğini programlamaya başladığımda beni beyin yıkamaya çalıştığı için C ++ 'ı suçluyorum.

Artık donanımlar çok daha ilerlemiş ve daha yeni, modern diller ortaya çıkmıştır, C ++ 'ı hala bazı soyutlamalara (oyunlar, fizik simülasyonları, CAD sistemleri, vb.) İhtiyaç duyduğunuz, yoğun hesaplama gerektiren yazılımlar haricinde, çoğu uygulama programlaması için uygun bir seçenek olarak göremiyorum. ). C de kompakt, modüler bir motor yazarsanız ve düzgün bir betik diline atanmış daha yüksek seviyeli bir uygulama mantığına sahipseniz, bunlardan bile kaçınılabilir.

Metal kullanımı C'ye dikkatlice inmeniz gerekiyorsa ve yüksek seviyeye gitmeniz gerektiğinde, her bir baytı bir işaretçi aracılığıyla özgürce değiştirebiliyorken, kapsülleme reklamını vermeyen modern bir dilde yapın.


11
Bu yüzden işaretçiler kullanarak rastgele baytları değiştirmeyin. Kaçınılması zor değil, değil mi?
David Thornley

11
@Blagovest: C ++ 'nin karmaşıklığı konusunda sizinle aynı fikirdeyim ve bunu asla nesne yönelimli bir dilin yerine kullanmayacağım. Ancak karmaşıklığına rağmen, farklı cevaplarda (soyutlama, kaynak teslimi, ip işleme…) dile getirdiği birçok avantaj nedeniyle hala C'yi kazanıyor. Aslında, C ++ hala alakalı birkaç geçerli alanları adında var ve bu C'ye üstün nerede
Konrad Rudolph

6
@Blagovest: Bu yüzden karanlık köşelerden uzak duruyorum. Oraya C ++ 'a girmek, tanıdığım diğer dillerden daha kolay. Bunu kullanarak, ben taşıma RAII, çok daha iyi dize yarar C, STL tipi şablon sınıfları, OO özellikleri ve C üzerinde sahip diğer avantajları olduğunu
David Thornley

24
@ Balagovest: Hayır, yapmazsınız. Örneğin, bahsettiğiniz şeyler RAII'ye ulaşmak için yetersiz ve konteyner sınıfları basit el yapımı veri yapılarının ötesinde bir işlevselliğe sahip. Bunun mümkün olduğunu düşünüyorsanız, C ++ 'ı hiç iyi öğrenmediniz.
David Thornley

5
@ Jaroslaw Çok çekirdekli makinelerin neden OOP'yi mezara koyduğunu göremiyorum. C ++ 'ı kastediyorsan nereden geldiğini görebiliyordum. OOP birçok modern programlama dilinde, özellikle de yüksek seviyeli dillerde temel bir kavramdır. Bu şekilde programlarsanız, C bile OO olabilir. C ++ IMO kadar uygun değil.
vedosity

21

Linus'a göre , hayır:

Git kaynak koduna ilk baktığımda iki şey bana garip geldi: 1. C ++ yerine Pure C. Neden hiçbir fikrim yok. Lütfen taşınabilirlik hakkında konuşma, bu BS.

Sen saçmalık dolusun.

C ++ korkunç bir dildir. Birçok standart altı programcının onu kullanması, bununla birlikte toplam ve mutlak saçmalık oluşturmanın çok daha kolay olduğu noktaya göre daha da korkunç hale geldi. Açıkçası, C seçimi hiçbir şey yapmasa bile , C ++ programcılarını dışarıda tutmak, kendi başına C'yi kullanmak için çok büyük bir sebep olurdu.

Başka bir deyişle: C'nin seçimi tek aklı başında seçimdir. Miles Bader'in şakalaşarak "seni kızdırmak için" dediğini biliyorum, ama bu doğru. Ben C üzerinde C ++ olmak projeyi tercih ediyorum herhangi programcı gerçekten bir programcı muhtemel olduğu sonucuna geldiniz olurdu gelmiyor böylece sinirlendirmeye tercih ve ben dahil ediyorum herhangi bir proje berbat ile.

C ++ gerçekten çok kötü tasarım seçeneklerine yol açıyor. STL ve Boost gibi dilin "hoş" kitaplık özelliklerini ve programlamanıza "yardımcı olabilecek", ancak neden olan diğer toplam ve mutlak saçmalıkları kullanmaya her zaman başlıyorsunuz:

  • işe yaramadıklarında sonsuz miktarda acı (ve STL'nin ve özellikle de Boost'un sabit ve taşınabilir olduğunu söyleyen herhangi biri, BS bile komik değil, o kadar dolu ki)

  • yolun iki yıl aşağısında bir soyutlamanın çok verimli olmadığını fark ettiğiniz, verimsiz soyutlanmış programlama modelleri, ancak şimdi tüm kodunuz etrafındaki tüm güzel nesne modellerine bağlıdır ve uygulamanızı yeniden yazmadan düzeltemezsiniz.

Başka bir deyişle, iyi, verimli ve sistem düzeyinde ve taşınabilir C ++ yapmanın tek yolu, kendinizi temelde C'de bulunan her şeyle sınırlandırmakla sona erer ve projenizi C ile sınırlandırmak, insanların bunu mahvetmediği anlamına gelir. ve ayrıca, düşük seviyeli sorunları gerçekten anlayan ve hiçbir aptal "nesne modeli" saçmalığını mahvetmeyen birçok programcıya sahip olacağınız anlamına gelir.

Bu yüzden üzgünüm, ama verimliliğin temel bir amaç olduğu git gibi bir şey için, C ++ 'nın "avantajları" çok büyük bir hata. Bunu göremeyenleri kızdırmamız da büyük bir avantaj.

C ++ ile yazılmış bir VCS istiyorsanız, git Monotone ile oynayın. Gerçekten mi. "Gerçek bir veritabanı" kullanıyorlar. "Güzel nesne yönelimli kütüphaneler" kullanıyorlar. "Güzel C ++ soyutlamaları" kullanıyorlar. Ve açıkçası, bazı CS insanlarına çok çekici gelen bu tasarım kararlarının bir sonucu olarak, sonuç korkunç ve anlaşılmaz bir karmaşa.

Ama eminim ki gitmekten daha çok hoşuna gider.

      Linus

62
Linus'un burada tartışmalar yapacak adam olduğunu sanmıyorum. Öfke korkunç derecede öznel ve olgunlaşmamış. Aslında birkaç iyi noktası var ama çok derin bir şekilde gömülüyorlar (“saçmalık” ın altında da saçmalık) bulmak çok zor.
Konrad Rudolph

19
Haha, bu iyi bir kahkahaydı. Bu adamla asla tanışmak istemiyorum.
Felix Dombek,

30
Linus, bana asla asılmayan ama yetenekli bir çatı ustası hatırlatıyor, ancak tavadaki adamlara hercai menekşe diyor çünkü çivi yerine vida kullanıyorlar.
Bob Murphy,

8
Linus'un bir noktası var ama ciddiye alınmaması için çok sert bir şekilde ifade ediyor.
Blagovest Büyükliev

39
@Daniel'e katılıyorum, Donanımın sınırlarını zorlamak hakkında konuşabilecek biri varsa, John Carmack kıyamet yaratıcısı, deprem ve diğer oyunların yaratıcısı ve Id yazılımı kurucusudur. Birkaç ay önce bir twitt'de c ve c ++ hakkında yazıyor: "IMO, iyi C ++ kodu iyi C kodundan daha iyidir, ancak kötü C ++ kötü C kodundan çok daha kötü olabilir." twitter.com/#!/ID_AA_Carmack/status/26560399301
Onema

18

C ++ kullanmak için zorlayıcı bir neden olduğunu sanmıyorum. OO programlama yapmak istiyorsanız, bunun yerine Python'u kullanabilir ve C'de hızlı performans gerektiren parçaları yazabilirsiniz.

EDIT: C ile iyi bağlantı kuran başka diller de var, bu yüzden Python'u sevmiyorsanız, alternatifler de var.


3
Gömülü gelişim ne olacak? Python her zaman kullanılamaz ve C ile iyi yazılmış C ++ arasındaki hız farkı, belirli bir işlem gücü seviyesindeki cihazlarda önemsizdir. Tabii ki, bir C ++ derleyicisinin de her zaman erişilebilir olmayacağını düşünüyorum ...
James

6
@James "iyi yazılmış C ++" - yakalama var :(
dss539 22:10

5
Bu cevaba katılıyorum, python ile en üst seviyeye çıkın, çünkü 3 kat daha hızlı bir şekilde yazacağınız için, profil ve sonra bunları C / C ++ ile değiştirerek tıkanıklıkları giderin. "Bottleneck'i C ++ koduyla değiştir" demek gereksizdir, çünkü hızlı olmanız gereken kod ile yüksek bir seviyeye sahip olmayacaksınız, çünkü düşük seviyeli kod olacaktır. Bir şey var: c ++ 'ın python ile arayüzünü bilmiyorum: /. Ancak ekranın önünde geçirilen süre ve verimlilik açısından, C ++ kodlarının çoğu hiçbir şey için hızlı olamayacağından, bunun en iyi çözüm olduğunu düşünüyorum!
jokoon

8
Büyük bir finans şirketi için çalışın ve Python'daki büyük bir dağınık ekipte karmaşık bir finansal sistem kurun ve bunun nasıl bir şey olduğunu görün. Deneyim size şunları öğretecektir: a) güvenlik türünün avantajları, b) kıçınızı koruyan derleyicilerin avantajları, c) Python'un noobs'un yazmasına izin verdiği LUDICROUS kodu. İnsanlar, C ++ ile ayaklarınızı vurmanın kolay olduğunu söylüyorlar -> bazı piton işleri işe yarayabilir ama sınırda delilik olabilir. Şu anda C ++ 'ta çalışmayı tercih ederim ...
MrFox

1
@suslik: Vay canına, bu tür bir sistem için herkesin python kullanması konusunda şok oldum. Sana kötü noob python kodu konusunda katılıyorum; Bazılarını kendim gördüm.
Larry Coleman

13

C ++ kullanmak için bir neden var mı? Kesinlikle.

Bazı insanlar C ++ 'ı diğer seçeneklere göre kullanmayı tercih edebilir . C ++ 'ı kullanmak için bir neden olup olmadığını sormak, neden yüzlerce dondurmaya ihtiyacımız olduğunu sormak gibidir. Herkes sadece Vanilya'ya yapışmayı sevmez.

Geliştiriciler zaten C ++ ile çok yetenekli ise, onlar için soru 'neden kullanmalı?' Değil, 'neden olmasın?' Olabilir. Şu anda SO'da devam eden bu popüler anti-C ++ olayı var gibi gözüküyor, ama inan ya da inanma, herkes buna abone değil. Bazı insanlar C ++ 'ı diğer dillerden daha iyi severler.

C ++ 'ın uygulamalar için kullanılması gerekiyor mu? Tabii ki değil. Ancak bu aynı soru başka diller için de istenebilir. Bir uygulama için belirli bir dilin kullanılması gereken çok, çok az sayıda durum vardır.


12

Ben sadece C'den C ++ 'ya geçiş yapıyorum ve bence şablonlara ve OOP'a ihtiyaç duymasanız bile kazancınızın önemli olduğunu düşünüyorum.

  • Daha iyi hafıza yönetimi
  • Güçlü tip sistemi
  • Daha iyi bir standart kütüphane
  • Ad alanları
  • vb.

8

Bundan henüz kimsenin bahsetmediğine şaşırdım, ancak C ++ bize neredeyse tüm sorunları ve işaretçilerin tuzaklarını çözen referansları sundu :

void ModifyVar(int& var)
{
    var = 5;
}

int test = 4;
ModifyVar(test);

Onun yerine:

void ModifyVar(int * var)
{
    *var = 5;
}

int test = 4;
ModifyVar(&test);

Çok daha güvenli ve daha kolay ... ve değer geçme yükü olmadan.


3
Ayrıca daha az esnek. Referanslar (C ++ - tarzı) bazı ortak yapıları işaretçiler içeren bir dilde basitleştirmede iyidir, ancak işaretçilerin yerine geçmekten çok uzaklar, hatta komik değil. Ve örneğiniz referanslar için hiç de iyi bir durum değil.
Ben Voigt

3
@Ben: O zaman neden kötü bir örnek olduğunu açıklayabilir misiniz ?
Nathan Osman

6
@George: Hiçbir şey değişmedi, çünkü iki (sayı) karakter daha kısa mı? Herhangi bir problem çözmüyor, herhangi bir tuzağı vurgulamıyor, geçici bir değişkenin ömrünü uzatmak gibi bir şey bile yapmıyor (referansların iyi olduğu).
Ben Voigt

@Ben: Bir şeyi unutuyorsunuz - referans her zaman geçerlidir. İşaretçiler, herhangi bir şey doğru yapılmazsa her türlü bellek hatasına neden olabilecek herhangi bir şeye işaret edebilir (NULL dahil). Referanslar asla NULL olamaz ve işaret ettikleri adres asla değiştirilemez.
Nathan Osman,

5
@George: "başvuru her zaman geçerlidir" yanlış düz. İhtiyacınız olursa bir örnek vereceğim, ancak bunun farkında olmak için yeterince uzman olduğunuzu umuyorum. Ve ben de geçersiz bir işaretçi kullanarak geçersiz bir referans oluşturmaktan bahsetmiyorum. İşaretçileri kullanan işlevlerin argümanlardaki ön koşulları belirten belgelere ihtiyacı vardır. Ancak pratik olarak konuşursak, tüm fonksiyonlar bu seviyedeki dokümantasyona ihtiyaç duyar, bu nedenle işaretçilere karşı bir grev yapmak saçmadır.
Ben Voigt,

5

Genellikle nerede ve neden olacaklar:

  • aşinalık
  • istenen dil özellikleri
  • kullanmak istediğiniz belirli kütüphaneler
  • performans gereksinimleri

Sunucu tarafı programlama için, derlenmiş veya yorumlanmış sayısız farklı dil arasından seçim yapabilirsiniz. Genellikle dil seçimi, sizin veya ekibinizin hangi platform üzerinde en etkili olacağı ile belirlenir. Veya henüz bir ekibiniz yoksa, piyasadaki becerilerin kullanılabilirliği.

Bir yandan not: C / C ++ 'ı performansa dayalı olarak (sadece) C / C ++ ile genişletilebildiğinden gerçekten anlamıyorum. Yavaş kısımları C / C ++ uzantılarına geçirme yeteneği ile birlikte hızlı bir gelişim diline sahip olursunuz. Şüphesiz, eğer her işletim sisteminin önemli olduğu sistem programlama yapıyorsanız, anlaşılabilir ancak çoğu uygulama geliştirmede bunu anlamıyorum.


2
Aşinalık 1 numaralı sebep ve bunu ilk söyleyen sen olmana şaşırdım.
Paul Butcher

4

C ++ vs Python vs Perl kolayca değerlendirilemez. Bu, projeye ve gereksinimlere bağlıdır.

C ++, birçok platformda çalışan ve çok eskiden beri bir dizi yardımcı programa sahip. Ancak, String'i Integer'a ve geriye doğru geçirmek için akışlarda dolaşmaya başlamak acı vericidir.

Öte yandan C ++, kütüphanelere bağımlılıklarla ilgili çok fazla şey yapıyor. Bir şeyi GCC X veya VC ++ Y'de derledikten sonra, kodun bu araçların bir sonraki sürümünde çalışacağına güvenemezsiniz. Aynı cehennem Windows'da, aynı cehennem de Unix'te.

Perl, gücünü Unix dünyasından alıyor ama özellikle düzenli bir ifade aracı. Bu çoğu zaman kullanılan şeydir. Java'nın bile normal bir şekilde yapamayacağı bazı ciddi araçlarla birlikte (bir dosyayı bir web sunucusuna nasıl yükleyeceğinizi kontrol edin), Perl "sadece yap" dır.

Python kolay, esnek ve dinamik bir dildir. Bir fonksiyonuna bir tamsayı gönderebilmeniz o kadar kolay, komut dosyası dize bekler, ancak bir sonuç alabilirsiniz! Beklenmedik olsa da sonuç. Bu yüzden programcının çok dikkatli olması gerekir. IDLE biraz hata ayıklama sunuyor, ancak TELNET'e bir sisteme veya SSH'ye üç seviyeden aşağı indiğinizde ve sorununuzu bulmak istediğinizde, hata ayıklayıcı yanınızda durmayacak. Ancak, bazı büyük matematik işleri hızlıca yapabilir.

Java, buzzwords, yabancı teknolojiler ve büyük kelimelerin ekosistemidir ve web sunucusuna sadece bir dosya yüklemek istediğinizde, sadece sunucuda JSP varsa bunu yapabileceğinizi görürsünüz . Sistem kütüphanelerini veya izleme gibi sistem fonksiyonlarını çağırmak istiyorsanız, çok fazla kazmanız gerektiğini tespit edersiniz. Ve belki de JNI'ye ve OK'ye ulaşmak için ... sonra düşünürsün ... "Neden, Lord?"

Bunun dışında Java, iş süitleri için mükemmel bir araçtır ve çok iş parçacıklı, çok hoşuma gitti.

CV'nize bir program hazırlayıp hızlı bir şekilde göstermek için "Ah, ben de bu teknolojiyi biliyorum" ve olmak istediğin patronun, hayret et! Gerçi teknolojiye ihtiyaç duyulmasa bile ... (Tamam, millet, Bahar Çerçevesinden nefret ediyorum ....)


1
ne yazık ki, Python'un sürüm bağımlılıkları olduğunu düşünmelisiniz - özellikle Python 3'e geçtikten sonra, perl ile aynı veya Perl 6'ya taşınmak için uğraşanlar oldu mu? Her şey kötü bağımlılıklara sahip :(
gbjbaanb

3

Dil seçerken akılda tutulması gereken şey, onu kullanmaktan ne kadar faydalanacağınız ve onu edinmenin ne kadar süreceğidir.

Python ve perl gibi diller arasındaki ana fikir, daha az insan zamanı, ancak daha fazla cpu zamanı ile daha fazlasını yapmaktır. Aslında, bir python veya perl betiğini kodlamak için yürütüldüğünden daha fazla zaman harcayacaksınız, ama benim iddiamı elde ediyorsunuz.

C / C ++ 'ın avantajı, hızlı olmaları, ancak sözdizimi ve güçlü yazım pahasına olması: bilgisayarın derleme zamanında seçmemesi için çok fazla şey yapmanız gerekiyor.

Bir kod yaptığınızda, bazı satırlar diğerlerinden çok daha fazla çalıştırılır ve bu satırlar sorun teşkil eden satırlardır. Öte yandan, çok fazla zaman harcadığınız kodun geri kalanının tümü çok daha az uygulanır. Bunu duymuş olabilirsin, ama bu meşhur 80/20 kuralı ve bu kuralı atlayamayacaksın.

Bu sorunun çözümü, daha kolay bir dil kullanmaktır (daha kolay, daha fazla geliştirici dostu demek istiyorum: daha az yazarak, tembel yorumlama, önceden varolan çok sayıda rutin ve malzeme vb.).

C veya C ++ ile yapmış olsaydınız çok daha fazla beyin ağrısı çekmiş olsaydınız çok çabuk bir şekilde yapacaksınız.

Programınız yavaş olacak, ancak bir profilleyicide, zamanın% 80'ini koşturan parçayı ayırıyorsunuz ve bunları C veya C ++ ile yapıyorsunuz.

Bu şekilde ilerleterek, çok zaman kazandırdınız ve programınız verimli, çok hızlı, hafıza sızdırmak için daha az şansa sahip ve zamandan tasarruf ediyorsunuz.

Komut dosyası dilleri geliştiricinin tarafında olacak şekilde tasarlanmıştır, ancak optimizasyon hala mümkündür. Elbette bir tasarım deseni sihirbazı, bir STL vudu ya da bir kılıç savaşçısı ve belki de bir haskell keşişi olabilirsiniz. Ancak diller bizi bilgisayarlarla konuşur, bizim için bilgisayar olmamızı sağlar!



2

Kullandığım C ++, sınıflı C olarak adlandırılıyor!


8
Yaşasın, 'class' anahtar sözcüğünü kullandın. Şimdi OO tasarımını anladınız!
dss539

C ++ 'a ad alanları olan C denir.
Aralık'ta jsz,

6
Benim C ++ denir, um .. Manoj'ın C ++ 'ı.
Manoj R

+1 Sınıflandırmamın C ++ kullanmamın tek nedeni.
Aralık'ta

... tamam, istisnalar da.
Aralık'ta

0

Bu şekilde oluşturulan tüm sorulara aslında tek bir cevap var. Y teknolojisi yerine X teknolojisini kullanmanın en iyi nedeni (X ve Y'nin kabaca aynı seviyede olduğu (tüm çağdaş programlama dilleri gibi)), X'i zaten bildiğiniz ve Y'yi bilmediğiniz içindir.

(ancak Haskell geldikten sonra başka bir şey kullanmak için hiçbir sebep yoktu)


0

Hayır, hiç de değil. Performansa ihtiyacınız yoksa ve bir kütüphane varsa, diğer dili kullanabilirsiniz, sonra C / C ++ ile uğraşmayın. Bugünlerde sadece dilleri çalıştırabilen (kolayca?) Gömülü sistemleri hedeflediğimde yapıyorum. Bazen C kullanırım çünkü bir eklenti yazıyorum ama gerçekten hayır.

Ancak, C'yi kullanmaktan kaçınmak için Python, Perl, vb. Kullanmazdım. Tercihim aslında C #, çünkü iyi bir kütüphaneyi (.NET'in gücü olan) seviyorum ve statik olarak yazılmış dilleri seviyorum. Boo iyi bir alternatif. Fakat gerçekten Haskell , OCaml , D , ML ve benzeri şeyler iyi.


7
Sen noktayı kaçırdın.
Matt Joiner

@ Matt Joiner: Yapmadığımdan eminim. Ne kaçırdım?

Soru C ++ kullanmamakla ilgilidir.
Matt Joiner

@ Mate Joiner: hmm, başka bir bakışta sorulmakta olduğunu görebiliyorum. Ama ben de cevap

Neredeyse bu C # ...
Vreality
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.