Endüstri neden C'den C ++ 'ya geçti? [kapalı]


19

Her şeyden önce gerçek bir cevap almak istiyorum, her zaman çeşitli kaynaklardan ve makalelerden daha fazlasını almaya çalışıyorum ve C ++ gibi şeyleri okuduğumda sanal işlevleri olduğu için ve bu C daha iyi olduğundan , gerçekten ne söyleyeceğini bilmiyorum ve beyni olan bir insan olarak düşünmeliyim. Bu yüzden lütfen yanıtlarınızda bu seviyeye ulaşmaktan kaçının.

Benim sorum, aşağı yukarı Doom 3 ile tamamlanan büyük bir C ++ geçişi hakkında.

Benim için ilginç olan şey, bu kilometre taşından önce, oyun motorlarının ve oyunların çoğunun, tıpkı Quake döneminden beri olduğu gibi C ile yazılmış olması . Kimlik yazılımının, C ++ 'da IdTech 4 için kod tabanını tamamen yeniden yazmaya karar vermesi de ilginçtir, dürüstçe gerçekten iyi bir neden listesi olmadan anlayamadığım çok büyük bir iş.

Doom 3'e odaklanıyorum çünkü esas olarak OpenGL dünyasıyla ilgileniyorum ve yolculuğumda bu konuya odaklanmaya çalışıyorum, bu yüzden bu konuda çok okudum, ancak böyle bir sorunun render-API olabileceğini düşünüyorum - çok fazla sorun olmadan agnostik.

Neden belli bir zamanda endüstri kitlesel olarak C ++ 'a geçti? Kimlik seçiminin nedenleri nelerdir?

Söylemek istediğim son şey, C dilinin uygulanması çok daha basit ve daha az sayıda özellik sağlamasıdır, çünkü C ++ 'dan farklı olarak parçalarda "parçalanmış" olma şansı daha azdır. En basit ifadeyle, iyi bir şekilde uygulanan tüm özellikleri ile iyi bir C ++ derleyicisi yerine gerçekten iyi bir C derleyicisi bulmak için çok daha fazla şansı var.

Örneğin, Android için NDK hala en yeni ve en iyi özelliklerle iyi bir C ++ desteğine (r8b sürümü ile) sahip değildir ve dünyadaki en popüler mobil işletim sistemi için yerel araç takımıdır!

Kodumu modern bir C ++ ile yazsaydım, şimdi muhtemelen acı çekerdim çünkü dünyanın en popüler işletim sistemlerinden biri benim için sınır dışı olurdu. Android gibi, diğer birçok derleyici de o kadar iyi değil.

Ben 2-3 sürümü eski bir C ++ sürümüne atıfta bulunan C ++ kodu yazmalı?


1
Ben sadece C + + C yarı uzantısı olduğunu sanıyorum. İnsanlar C yerine C ++ öğretildi ve böylece insanlar tam üflemeli C ++ yazmaya başladı std :: vector gibi C ++ özellikleri ile C yazmaya başladı.
API-Beast

1
Peki, büyük bir uygulama geliştirirken C vs. C ++ ? OOP harika bir paradigma ve .. C ++ destekliyor. C'de bir oyun yazacaksanız, veri odaklı tasarımı düşünün . Aksi takdirde, mevcut tüm büyük endüstri oyuncularının neden C ++ kullandığını düşünelim. Finansal uygulamalar veya boş zaman etkinlikleri için olsun, yazılım mühendisliği OOP paradigmasının ve mimari ve tasarım modellerinin omuzlarını araştırır. Basitçe söylemek gerekirse, C, kapsüllemenin size sunduğu büyük resmi sunamaz. C ile yazılmış modern büyük yazılım parçaları var mı? Belki çekirdekler ve gömülü sistemler.
teodron

@teodron 1) İyi bir yürütülebilir dosya üretmek zorundayım, önemli bir varlığı önemsediğim gibi dili önemsiyorum, ama her şey değil ve sattığım şey değil 2) kapsülleme Birisi isterse performans için iyi değil beni C ++ dünyasından ayrılmaya ikna et, kapsülleme bunun için iyi konulardan biri.
user827992

3
" Benim için ilginç olan şey, bu kilometre taşından önce, oyun motorlarının ve oyunların çoğunun, tıpkı Quake döneminden beri olduğu gibi C'de yazılmış olması. " Bunun için bazı kanıtlar görmek istiyorum. Id-software'in açık kaynaklı motorlarının yanı sıra. Video oyunu endüstrisinin tamamı değiller.
Nicol Bolas

@NicolBolas i ID hakkında konuşmamın nedenini açıklıyordum, lütfen tüm sorunun anlamını alın.
user827992

Yanıtlar:


28

C ++, C'nin yaptığı her şeyi yapar. C'nin avantajlarının C ++ avantajlarından ağır bastığı durumlarda C ve C ++ 'ı önemsiz bir şekilde karıştırabilirsiniz. Bu, C ++ 'ın çok kasıtlı bir tasarım kararıdır.

C ++, C'nin yapmadığı şeyleri yapar. Bu kolay polimorfizm, aynı zamanda şablonlar aracılığıyla kolay derleme kodu oluşturma içerir. Bu, C'nin en büyük zayıflığı olan kaplar gibi şeyler için gerçekten kullanışlıdır. Ayrıca, çok fazla zaman kazandıran kullanıcı tanımlı işaretçi türlerine (akıllı tutamaçlar) ve operatör destekli vektörler ve matrisler gibi kullanıcı tanımlı ilkel benzeri türlere de izin verir (ayrıca çok fazla zaman kazandırır).

Sanal işlevler, sanal olmayan işlevlerden daha yavaştır. Bununla birlikte, sanal işlevleri seçmelisiniz ve yetkili bir programcı bunu ancak yararlı olduklarında yapar. C programcılarının işlev işaretçileri vardır ve bunların koleksiyonlarını genellikle diğer yapılar tarafından başvurulan yapıda saklar; başka bir deyişle, sanal işlev tabloları ile aynı şeyi yeniden oluşturmak için fazladan çalışma yaparlar. Yalnızca tek bir işlev işaretçisinin gerekli olduğu ve tablo gerekmediği durumlarda, C ++ buna tam olarak izin verir ve C'ye eşdeğerdir. Modern bir derleyici ile C ++, programcının bir özelliği seçtiği belirli durumlarda yalnızca C'den daha yavaştır . Ayrıca, uygulamadaki sanal işlev yükü modem CPU'larında çok küçüktür. Donanım bugün C ++ 'ın kullanım alışkanlıkları için tasarlanmıştır ve hatta yüksek seviyede yorumlanmış diller için de giderek daha fazla tasarlanmıştır.

C ++ istisnaları, geçmişte çok fazla yük uygular ve bunları kullanmasanız bile C ++ 'ı yavaşlatır. İstisnalar için güvenli kod yazmada karmaşıklıktaki muazzam artıştan başka bir nedenden ötürü istisnalar C ++ 'a eklemek için korkunç bir şeydi ve aslında bazı konteyner tasarımlarının istisnayı güvenli hale getirmesi tam anlamıyla imkansız. Oyun programcıları genellikle istisnaların varlığını görmezden gelir ve hatta derleyicide devre dışı bırakır. Modern derleyiciler sıfır ek yük istisnalarına sahiptir (yani, yalnızca bunları kullandığınızda bunlar için yalnızca maliyet ödersiniz).

C'nin tüm kurallarını öğrenmesi daha kolaydır. C ++ çok büyük ve karmaşık bir dildir. C ++, daha kolay ve basit API'ler üreterek daha üst düzey kodların yazılmasına izin verir. Bazı insanlar dili daha kolay anlamak isterken, bazıları gelişmiş kodu daha kolay yazmak isterler. Bu, derleyicinin belirli bir kod parçasıyla ne yaptığını anlamanın basitliği ile büyük karmaşık birbirine bağlı uygulamalar yazmanın basitliği arasında bir takastır. Bazı insanlar çeşitli nedenlerden ötürü diğerinden çok daha değerlidir.

Sonunda, C ++, C'nin bir üst kümesidir. Benim düşünceme göre, aynı zamanda geçilebilir bir C programcısı olmayan son derece yetkin bir C ++ programcısı diye bir şey yoktur (ancak, çubuğumun altına düşen bir çok C ++ programcısı olsa da, saf C'de kaybolmak). C ++, programcıyı C'nin çoğundan yalıtmak için olanaklar eklerken, önemsiz C ++ kodunun genellikle işleri yapmak için C'yi kullanması gerekir. Bu, C ++ ve Java ve C # arasındaki birincil farklardan biridir. Sonuçta, "C / C ++" nin birlikte toplandığını görmenizin bir nedeni var.

Etkileşimde bulunduğum diğer oyun endüstrisi profesyonellerinin çoğu ile paylaşılan kişisel inancım, C ++ 'ın gelişmiş ifade ve yüksek düzey programlama olanaklarının C üzerinde dilin artan karmaşıklığına ve diğer sık ​​sık yapılan anti-C ++ iddiaları günümüz teknolojisiyle güncelliğini yitirmiştir.


19
"Yetkili bir C programcısı olmayan böyle bir C ++ programcısı diye bir şey yoktur." Bu ifadeye kesinlikle katılmıyorum. Deyimsel C , deyimsel C ++ 'dan çok farklıdır. İki stil birbirinden ayrılmıştır, bir stil opak işaretçileri ve statik işlevi vurgularken, diğeri dil tabanlı kapsülleme vb. Sadece deyimsel C ++ bilen biri C ++ konusunda yetkin olur, ancak yine de deyimsel C tarafından karıştırılır.
Nicol Bolas

C ++ konusunda yetkin olabileceğinizi ve yalnızca "idiomatic C ++" bildiğinizi kabul etmiyorum. C ++ 'nın sert parçaları, C'nin (artı şablonlar) aynı sert parçalarıdır. Bir C ++ programcısı bağımsız işlevler, düz yapılar ve ham veya opak işaretçilerle karıştırılırsa, gerçek dünyadaki akademik olmayan herhangi bir senaryoda henüz önemsiz C ++ kodu yazmamıştır. Şimdiye kadar "deyimsel" bir şeyde yetkin olanların henüz yetkinlik kazanmadığını iddia edecek kadar ileri gideceğim .
Sean Middleditch

3
"Deyimsel", "rahat" demenin başka bir yoludur - bu, göreceli olmanın yanı sıra, aynı zamanda, başka türlü yetkin bir C ++ programcısının özellikle yeterli olmayacağı dilin rahatsız edici bir bölgesinin olduğu anlamına da gelir. (Bunun, bu unsurlar tarafından "karıştırıldıkları" anlamına gelmediğini, sadece onlardan rahatsız oldukları veya onlarla akıcı olmadıkları anlamına gelmediğini düşünmüyorum.) Ve bir dereceye kadar, deyimsel C ++ öğrenen insanlara sadece ham bir işaretçi görüyorum. Bu yüzden yetkili bir C ++ programcısının yetkili bir C programcısı anlamına geldiğini düşünmüyorum.
John Calsbeek

Başka bir deyişle, kesinlikle herhangi bir ciddi C kodu yazmak için gerekli olabilecek herhangi bir alt düzey özelliği kullanmaktan tamamen kaçınabileceğiniz daha üst düzey bir C ++ alanı vardır. Çoğu gerçek dünyadaki akademik olmayan kod tabanlarının tamamen bu alanda kalmadığından eminim, ancak sadece bu alanla rahat olan ve hala "yetkin" diyen bir kişi bulabileceğinizden şüpheleniyorum. Tabii ki, böyle bir kişiyi bir C programcısıyla karşılaştırmazsınız - onları herhangi bir başka üst düzey dilde programlama yapan biriyle karşılaştırırsınız.
John Calsbeek

1
@DanielCarlsson: Yeterince adil, sadece bilgiçlik yapıyorum. Afedersiniz. Bu bağlamda olsa da ... C ++, optimizasyonları C'den daha zor yapan hiçbir şey yapmaz. C # veya Java yerine C ++ kullanıyoruz, çünkü tüm STL'yi yeniden uygulayabiliriz veya ham dizileri kullanabilir veya hatta satır içi montajcı veya dil uzantılarında (SSE intrinsics gibi) krank yapabiliriz
Sean Middleditch

12

Neden belli bir zamanda endüstri kitlesel olarak C ++ 'a geçti? Kimlik seçiminin nedenleri nelerdir?

Kimliği Yazılım olduğu değil "sanayi". Onlar bir şirket. Etkili olmalarına rağmen herkes değiller.

1999 yılına dayanan birkaç oyun motoru üzerinde çalıştım ve C ++ kullandılar.

C ++ 'ın "bu süre zarfında" benimsenmesinin temel nedenleri şunlardır:

  1. O edildi standardize . C ++ 98, 1998'de bir ISO standardı olarak piyasaya sürüldüğü için adlandırılmıştır. O zamana kadar, "gerçek" veya "doğru" olan net bir fikri olmayan birden fazla C ++ lehçesi vardı. Standart hale geldikten ve derleyiciler standardı uygulamaya başladığında, oyun geliştiricileri gerçek standarda güvenebilirler.

  2. Eski şakayı hatırlayın: Bir adam bir doktorun ofisine girer ve "Kolumu böyle kaldırdığımda acıyor" diyor. Doktor şöyle diyor, "Kolunu böyle kaldırmayın."

    Sanal fonksiyonlar ihtiyaçlarınız için yavaş ise, C ++ değil zorlamak bunları kullanmak için size. C ++ 'da her şey kaydolmaktadır. Sen seçmek her bir özelliği kullanmak için. Kritik performans kodundaysanız ve sanal ek yük istemiyorsanız, sanal işlevleri kullanmazsınız. Tıpkı C'de performans açısından kritik bir koddaysanız, işlev işaretçileri kullanmazsınız.

    Gerçekten de, bu birçok C ++ oyununun deyimsel C ++ (en azından modern deyimsel C ++ değil) değil, sadece "sınıflarla C" olmasına yol açtı . Ve bu C ++ programlamak için mükemmel bir işlevsel yoldur. Cehennem, sadece typedef structyeni bir tür oluştururken yazmak zorunda kalmamak bir avantajdır.

    C ++, büyük bir özellik torbasıdır ve hangilerini istediğinizi seçebilirsiniz.

Örneğin, Android için NDK hala en yeni ve en iyi özelliklerle iyi bir C ++ desteğine (r8b sürümü ile) sahip değildir ve dünyadaki en popüler mobil işletim sistemi için yerel araç takımıdır!

Ne demek istiyorsun? Google , NDK kullanan insanları zorlukla tolere eder ; herkesin Java kullanmasını istedikleri açıktır. NDK'nın var olmasının tek nedeni, platformu onsuz kullanamayacak bazı önemli geliştiricilerin olmasıdır. Böylece, NDK onlara ve özelliklerine hizmet etmek için var olur.

Evet, C ++ uygulaması daha büyük, daha karmaşık bir özelliktir. Java da öyle. Yani olan herhangi C. hariç dil

Ayrıca, "en yeni ve en iyi özellikler" ne demek? C ++ 11 hakkında konuşuyorsanız, bunu henüz kimse tam olarak uygulamıyor. Spec olduğunu ancak şimdi bir yaşında. Ayrıca, NDK'nın C11'i de destekleyip desteklemediğini bilmiyorum; evet, C ayrıca her yerde desteklenmeyen "en yeni ve en iyi özelliklere" sahiptir.

Bu da önemli bir nokta getiriyor: Pure-C uygulamanızın Visual Studio'da derlenmesini istiyorsanız, C89'a uyması ve bundan daha yüksek bir şey olmaması gerekir. Yani C ile parçalanma zaten var. Bazı platformlar yalnızca C89'u destekler. Bazıları C99'u destekler. Bazıları C11'i değişen derecelerde destekler. Vb.

C'yi kullanmak istiyorsanız, C'yi kullanın . Diğer insanların bu seçimi yapmadığı, seçiminizin yanlış olduğu veya seçimlerinin yanlış olduğu anlamına gelmez. Onlara kendini savunmaya gerek yoktur ve onlar size kendilerini haklı çıkarmak için gerek yoktur.


2
Google'ın NDK kullananları zar zor tolere ettiğini düşünmüyorum, çünkü NDK'nın gelişimi devam ediyor ve Android için birkaç sürüm var, Google C / C ++ 'dan nefret etse bile, başarabileceğimi düşünmüyorum Java'daki oyunum veya pazardaki en önemli oyuncular için iyi bir performans seviyesi kodlarını sadece java ve Android için yeniden yazabilir, Muhtemelen Google için gerekli bir kötülüktür, bilmiyorum, amacım geniş bir C ve C ++ vs Java vs dünya hakkında bir topal soru değil, dil devam
user827992

derleyiciye tüm dil özelliklerini göz önünde bulundurarak, cevabınız aynı zamanda piyasadaki C derleyicilerinin kullanılabilirliği hakkındaki ilk noktamı vurgulamama izin veriyor, Windows'ta kendi derleyicisiyle bir derleyici üreten neredeyse tüm yazılım evine sahibim, ayrıca MinGW gibi diğer ücretsiz seçenekler. C ile bulduğum gerçek sorun veri yapıları için yerel destek eksikliği, kaplar, C + + size belirli bir konteyner veya belirli bir ifade ne kadar maliyet hakkında bir fikir edinebilirsiniz,
user827992

C muhtemelen aynı şeyi yapan kod sadece 1'den fazla uygulama vardır, ayrıca C ++ derleyici bunun bir sonucu olarak daha optimize edebilirsiniz. Muhtemelen C ++ daha fazla çalışmalıyım ama dilin kendisi için değil, sadece bazı belirli özellikler için iyi bir destek için C ++ 'a geçeceğini düşünüyorum.
user827992

7

Kimlik yazılımının, C ++ 'da IdTech 4 için kod tabanını tamamen yeniden yazmaya karar vermesi de ilginçtir, gerçekten iyi bir neden listesi olmadan anlayamayacağım büyük miktarda çalışma.

Her sürüm için tüm motoru hemen hemen yeniden yazmaları yaygındı (en azından son zamanlara kadar - son birkaç oyun hakkında çok şey bilmiyorum) ve C ++ popülaritesinde büyüdüğü için bunu sopa yerine kullanmak mantıklı Zamanla C ile daha az insan yetecek.

Neden belli bir zamanda endüstri kitlesel olarak C ++ 'a geçti?

Çünkü C kodu ile neredeyse tamamen geriye dönük olarak uyumluyken size birçok üst düzey işlevsellik kazandırır.

Kimlik seçiminin nedenleri nelerdir?

Google bunu sizin için cevaplardı: http://fabiensanglard.net/doom3/interviews.php

"... programcıların yarısı gerçekten C ++ arka plana sahipti. C ve Objective-C arka planım vardı ve sadece C ++ adamlarının yazdığı koda bakarak" C ++ 'a kaydırıldım "türünü gördüm. Keşke dili kullanmaya başlamadan önce iyice araştırmak ve keşfetmek için zaman ayırmış olsaydım.

Oluşturucu kodunun büyük ölçüde C'de geliştirildiğini, sonra da bir çeşit C ++ ile kaplandığını söyleyebilirsiniz.

Bugün, C ++ 'ın kritik performans gereksinimleri olan büyük, çok geliştirici projeleri için doğru dil olduğuna ve Tech 5'in Doom 3 deneyimi için çok daha iyi olduğuna inanıyorum. "

Kodumu modern bir C ++ ile yazsaydım, şimdi muhtemelen acı çekerdim çünkü dünyanın en popüler işletim sistemlerinden biri benim için sınır dışı olurdu.

  1. Programcılar geleceği göremez. Kötü C ++ desteğine sahip yeni bir platform olacağını bilmiyorlardı. Android, 2009 yılına kadar düzgün bir şekilde mevcut değildi. Doom 3, 2004'teydi.
  2. Bilgisayarlar ve konsollar için en yeni 3D oyunları yazan programcıların kodlarının telefonlarda da çalışmasını beklediğini düşünüyor musunuz? Bu taşınabilirlik derecesini hedeflemek, mevcut güçteki büyük farktan dolayı çok nadirdir ve genellikle anlamsızdır.

Ben 2-3 sürümü eski bir C ++ sürümüne atıfta bulunan C ++ kodu yazmalı?

Bunu neden önemsiyorsun? En yeni şeyi kovalarken tuzağa düşmeyin. 5 yıl önce yeterince iyiyse, aniden kötüleşmeyecek.


3

C ++, 80'lerden beri çıktı, bu yüzden bir derleyici desteklemiyorsa, belki de farklı bir derleyici kullanmalısınız. Ve ayrıca, C ++ C'den çok daha yavaş değildir. Sadece sanal işlevler ve diğer soyutlamalar ile yüklerseniz gerçekten daha yavaştır. Bununla birlikte, C ++, esnekliği ve C'nin sahip olmadığı daha yeni özellikleri nedeniyle bugün unix olmayan dünyada çok kullanılmaktadır. C ++ ile modüler kod yazmak, C ile yapmaktan çok daha kolaydır ve daha taşınabilir kod yazmanıza yardımcı olur. Derleyiciler konusuna dönersek, C ++ 'ı desteklemeyen herhangi bir derleyici bilmiyorum (belki C ++ 11'i tam olarak değil, ancak iyi bir derleyici C ++' ı desteklemelidir).

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.