Dlaczego branża przeszła z C na C ++? [Zamknięte]


19

Przede wszystkim chciałbym mieć prawdziwą odpowiedź, zawsze staram się uzyskać więcej z różnych źródeł i artykułów, a kiedy czytam rzeczy takie jak C ++ jest powolny, ponieważ ma funkcje wirtualne i z tego powodu C jest lepsze , naprawdę nie wiem, co powiedzieć i myśleć jak człowiek z mózgiem. Dlatego unikaj osiągania tego poziomu w swoich odpowiedziach.

Moje pytanie dotyczy ogromnego przejścia na C ++, które zostało ukończone mniej więcej w Doom 3.

Interesujące jest dla mnie to, że przed tym kamieniem milowym większość silników gier i same gry były napisane w C, tak jak to było od czasów Quake'a . Warto również zauważyć, że oprogramowanie ID decyduje się całkowicie przepisać bazę kodu dla IdTech 4 w C ++, ogromną ilość pracy, której szczerze mówiąc, nie rozumiem bez naprawdę dobrej listy powodów.

Skupiam się na Doom 3, ponieważ interesuję się przede wszystkim światem OpenGL. W swojej podróży staram się skupić na tym temacie, więc dużo o tym czytam, ale myślę, że takie pytanie może być renderowane API -agnostyka bez większych problemów.

Dlaczego w pewnym momencie branża masowo przeszła na C ++? Jakie są przyczyny wyboru dokonanego przez siebie dokumentu tożsamości?

Ostatnią rzeczą, którą chciałbym powiedzieć, jest to, że język C jest o wiele prostszy do wdrożenia i zapewnia mniejszą liczbę funkcji, ponieważ ma to znacznie mniejsze szanse na „fragmentację” na części, w przeciwieństwie do tego, co naprawdę często robi C ++. Mówiąc najprościej, mam znacznie większe szanse na znalezienie naprawdę dobrego kompilatora C niż dobrego kompilatora C ++ ze wszystkimi funkcjami zaimplementowanymi w dobry sposób.

Na przykład NDK dla Androida wciąż nie ma dobrej obsługi C ++ (z wydaniem r8b) ze wszystkimi najnowszymi i najlepszymi funkcjami, a jest to natywny zestaw narzędzi dla najpopularniejszego mobilnego systemu operacyjnego na świecie!

Gdybym napisał mój kod w nowoczesnym C ++, prawdopodobnie bolełbym teraz, ponieważ jeden z najpopularniejszych systemów operacyjnych na świecie byłby dla mnie niedostępny. I podobnie jak Android, wiele innych kompilatorów nie jest tak świetnych.

Powinienem napisać kod C ++ odnoszący się do wersji C ++, która ma starą wersję 2-3?


1
Podejrzewam, że po prostu C ++ jest quasi rozszerzeniem C. Ludzie zaczęli pisać C z funkcjami C ++, takimi jak std :: vector, stamtąd nauczono C ++ zamiast C, a zatem ludzie zaczęli pisać pełnowymiarowe C ++.
API-Beast,

1
C, C czy C ++ podczas tworzenia dużej aplikacji? OOP to świetny paradygmat i .. C ++ go obsługuje. Jeśli chcesz napisać grę w C, zastanów się nad projektowaniem zorientowanym na dane . W przeciwnym razie zastanówmy się, dlaczego wszyscy główni obecni gracze w branży używają C ++. Inżynieria oprogramowania, zarówno w zastosowaniach finansowych, jak i rekreacyjnych, zagłębia się w paradygmat OOP oraz wzorców architektonicznych i projektowych. Mówiąc najprościej, C nie może zaoferować dużego obrazu, jaki oferuje enkapsulacja. Czy są jakieś nowoczesne duże programy napisane w C? Może jądra i systemy wbudowane.
teodron

@teodron 1) Muszę stworzyć dobry plik wykonywalny, dbam o język, tak jak dbam o ważny zasób, ale to nie wszystko i nie to, co sprzedaję 2) kapsułkowanie nie jest tak dobre dla wydajności, jeśli ktoś chce przekonaj mnie do opuszczenia świata C ++, kapsułkowanie jest jednym z dobrych tematów do tego.
user827992,

3
Interesujące jest dla mnie to, że przed tym kamieniem milowym większość silników gier i same gry były napisane w języku C, tak jak to było od czasów Quake'a. ” Chciałbym zobaczyć na to dowody. Oprócz silników open-source Id-software. To nie jest cały przemysł gier wideo.
Nicol Bolas,

@NicolBolas wyjaśniłem powód, dla którego mówiłem o ID, proszę o zrozumienie znaczenia całego pytania.
user827992,

Odpowiedzi:


28

C ++ robi wszystko, co robi C. Możesz w prosty sposób mieszać C i C ++ w przypadkach, w których zalety C przewyższają zalety C ++. Jest to bardzo celowa decyzja projektowa C ++.

C ++ robi rzeczy, których nie robi C. Obejmuje to łatwy polimorfizm, ale także łatwe generowanie kodu czasowego za pomocą szablonów. Jest to bardzo przydatne w przypadku takich pojemników, które są największą słabością C. Pozwala także na zdefiniowanie przez użytkownika typów podobnych do wskaźników (inteligentne uchwyty), które oszczędzają dużo czasu, a także zdefiniowanych przez użytkownika typów podobnych do prymitywów, takich jak wektory i macierze ze wsparciem operatora (również oszczędza dużo czasu).

Funkcje wirtualne są wolniejsze niż funkcje inne niż wirtualne. Musisz jednak wybrać funkcje wirtualne, a kompetentny programista robi to tylko wtedy, gdy są one korzystne. Programiści C mają wskaźniki funkcji i często przechowują kolekcje w strukturze, do której odwołują się inne struktury; innymi słowy, wykonują dodatkową pracę, aby odtworzyć dokładnie to samo, co tabele funkcji wirtualnych. W przypadkach, gdy potrzebny jest tylko jeden wskaźnik funkcji i nie jest wymagana tabela, C ++ nadal w pełni na to pozwala i jest równoważny C. W nowoczesnym kompilatorze C ++ jest tylko wolniejszy niż C w określonych przypadkach, w których programista wybiera opcję . Ponadto narzut funkcji wirtualnych w praktyce jest bardzo mały na procesorach modemowych. Dzisiejszy sprzęt jest zaprojektowany pod kątem wzorców użytkowania C ++, a nawet w coraz większym stopniu dostosowany do potrzeb interpretowanych języków wysokiego poziomu.

Wyjątki w C ++ historycznie narzucają dużo narzutów, co spowalnia C ++, nawet jeśli ich nie używasz. Wyjątki były okropną rzeczą do dodania do C ++, jeśli z innego powodu niż ogromny wzrost złożoności związany z pisaniem kodu bezpiecznego dla wyjątków, a w rzeczywistości niektóre projekty kontenerów są dosłownie niemożliwe, aby uczynić wyjątek bezpiecznym. Programiści gier często ignorują istnienie wyjątków, a nawet wyłączają je w kompilatorze. Nowoczesne kompilatory mają zerowe wyjątki od kosztów ogólnych (tzn. Płacisz za nie tylko wtedy, gdy faktycznie z nich korzystasz).

C jest łatwiejszy do nauczenia się wszystkich reguł. C ++ to bardzo duży, złożony język. C ++ pozwala pisać kod wyższego poziomu, tworząc łatwiejsze i prostsze interfejsy API. Niektórzy chcą łatwiej zrozumieć język, inni chcą łatwiej pisać zaawansowany kod. Jest to kompromis między prostotą zrozumienia, co robi kompilator z konkretnym fragmentem kodu, a prostotą pisania dużych, złożonych, wzajemnie połączonych aplikacji. Niektórzy ludzie cenią jednego znacznie bardziej niż drugiego z różnych powodów.

Ostatecznie C ++ jest nadzbiorem C. Moim zdaniem nie ma takiego, jak wysoce kompetentny programista C ++, który nie jest również znośnym programistą C (chociaż jest wielu programistów C ++, którzy spadają poniżej mojego paska, którzy by zgubić się w czystym C). Podczas gdy C ++ dodaje funkcje izolujące programistę od większości C, nietradycyjny kod C ++ często wymaga użycia C do wykonania zadań. Jest to jedna z głównych różnic między C ++ a Javą i C #. W końcu często widuje się „C / C ++” w jednym kawałku.

Moje osobiste przekonanie - które podzielam z większością innych profesjonalistów branży gier, z którymi współpracowałem - jest takie, że zwiększona ekspresja i możliwości programowania na wysokim poziomie w C ++ przewyższają zwiększoną złożoność języka w stosunku do C, i większość innych częstych Stwierdzenia anty-C ++ są po prostu nieaktualne w dzisiejszej technologii.


19
„Nie ma czegoś takiego jak kompetentny programista C ++, który nie jest również kompetentnym programistą C” Zdecydowanie nie zgadzam się z tym stwierdzeniem. Idiomatic C różni się bardzo od idiomatic C ++. Te dwa style są rozbieżne, jeden styl podkreśla nieprzezroczyste wskaźniki i funkcję statyczną, drugi używa enkapsulacji opartej na języku i tak dalej. Ktoś, kto zna tylko idiomatyczny C ++, byłby kompetentny w C ++, ale nadal byłby zdezorientowany przez idiomatic C.
Nicol Bolas,

Nie zgadzam się, że możesz być biegły w C ++ i znasz tylko „idiomatic C ++”. Twarde części C ++ to te same twarde części C (plus szablony). Jeśli programista C ++ jest zdezorientowany samodzielnymi funkcjami, prostymi strukturami i surowymi lub nieprzejrzystymi wskaźnikami, nie napisał jeszcze żadnego trywialnego kodu C ++ w żadnym nieakademickim scenariuszu w świecie rzeczywistym. Posunąłbym się nawet do twierdzenia, że ​​każdy, kto jest biegły w „idiomatycznym” czymkolwiek, musi jeszcze zdobyć kompetencje.
Sean Middleditch,

3
„Idiomatic” jest innym sposobem na powiedzenie „komfortowy”, co - oprócz bycia względnym - oznacza również, że prawie z definicji istnieje niewygodny region języka, w którym kompetentny programista C ++ nie będzie szczególnie biegły. (Niekoniecznie uważam, że oznacza to, że są „zdezorientowani” tymi elementami, po prostu że czują się niekomfortowo lub nie posługują się nimi płynnie.) I do pewnego stopnia ludzie uczący się idiomatycznego języka C ++ są uczeni, aby czuć się niekomfortowo jedynie migocze surowym wskaźnikiem. Więc nie sądzę, że kompetentny programista C ++ oznacza kompetentnego programistę C.
John Calsbeek,

Innymi słowy, zdecydowanie istnieje dziedzina C ++ wyższego poziomu, na której można całkowicie uniknąć używania funkcji niższego poziomu, które byłyby wymagane do napisania jakiegokolwiek poważnego kodu C. Jestem pewien, że większość rzeczywistych nie-akademickich baz kodowych nie mieści się całkowicie w tym królestwie, ale podejrzewam, że można znaleźć osobę, która czuje się komfortowo w tym królestwie i nadal nazywać ją „kompetentną”. Oczywiście nie porównałbyś takiej osoby do programisty C - porównałbyś ją z kimś programującym w dowolnej liczbie innych języków wysokiego poziomu.
John Calsbeek,

1
@DanielCarlsson: W porządku, jestem po prostu pedantyczny. Przepraszam. W tym jednak sensie ... C ++ nie robi niczego, co utrudnia optymalizacje bardziej niż C. :) To znaczy, jasne, że jeśli używasz STL, to jesteś ograniczony do tego, co robi STL, ale duża część dlaczego używamy zamiast C ++ C # lub Java, ponieważ możemy tylko reimplement całą STL lub użyć surowych tablic lub nawet korby w inline assemblera lub rozszerzeń języka (jak intrinsics SSE), itd
Sean Middleditch

12

Dlaczego w pewnym momencie branża masowo przeszła na C ++? Jakie są przyczyny wyboru dokonanego przez siebie dokumentu tożsamości?

Id Software nie jest „branżą”. To jedna firma. Chociaż mogą mieć wpływ, nie są wszyscy.

Pracowałem nad kilkoma silnikami gier z 1999 roku, które używały C ++.

Głównymi przyczynami przyjęcia C ++ „w tym czasie” są:

  1. To było znormalizowane . C ++ 98 nazywa się tak, ponieważ został wydany jako standard ISO w 1998 roku. Do tego czasu istniało wiele dialektów C ++ bez wyraźnego pojęcia, które było „prawdziwe” lub „poprawne”. Po standaryzacji i rozpoczęciu implementacji kompilatorów twórcy gier mogli polegać na faktycznym standardzie.

  2. Przypomnij sobie stary żart: facet wchodzi do gabinetu lekarskiego i mówi: „Boli mnie, gdy tak podnoszę rękę”. Lekarz mówi: „Więc nie podnoś tak ręki”.

    Jeśli funkcje wirtualne są wolne dla twoich potrzeb, C ++ nie zmusza cię do korzystania z nich. Wszystko w C ++ jest opcjonalne. Państwo wybrać do korzystania z każdego szczególną cechę. Jeśli masz kod krytyczny dla wydajności i nie chcesz wirtualnego obciążenia, nie używasz funkcji wirtualnych. Podobnie jak w przypadku kodu krytycznego dla wydajności w C, nie używasz wskaźników funkcji.

    Rzeczywiście, doprowadziło to do tego, że wiele gier w C ++ nie było idiomatycznym C ++ (przynajmniej nie współczesnym idiomatycznym C ++), a jedynie „C z klasami”. Jest to doskonale funkcjonalny sposób programowania C ++. Do diabła, po prostu brak możliwości pisania typedef structpo utworzeniu nowego typu jest zaletą.

    C ++ to duża torba funkcji i możesz wybrać, które z nich chcesz.

Na przykład NDK dla Androida wciąż nie ma dobrej obsługi C ++ (z wydaniem r8b) ze wszystkimi najnowszymi i najlepszymi funkcjami, a jest to natywny zestaw narzędzi dla najpopularniejszego mobilnego systemu operacyjnego na świecie!

Twoim celem jest? Google ledwo toleruje osoby korzystające z NDK; jasne jest, że chcą, aby wszyscy używali Javy. Jedynym powodem, dla którego istnieje NDK, jest to, że istnieją niektórzy ważni programiści, którzy po prostu nie będą korzystać z platformy bez niego. Dlatego NDK istnieje, aby je obsłużyć i zaspokoić ich potrzeby w zakresie funkcji.

Tak, C ++ to większa, bardziej skomplikowana specyfikacja do wdrożenia. Podobnie jak Java. Podobnie jak każdy język oprócz C.

Co masz na myśli mówiąc „wszystkie najnowsze i najlepsze funkcje”? Jeśli mówisz o C ++ 11, cóż, nikt jeszcze tego nie implementuje. Specyfikacja ma teraz zaledwie rok. Nie wiem też, czy NDK obsługuje C11; tak, C ma również „najnowsze i najlepsze funkcje”, które nie są obsługiwane wszędzie.

Co nasuwa ważną kwestię: jeśli chcesz, aby twoja aplikacja czysto C kompilowała się w Visual Studio, musi ona być zgodna z C89 i niczym więcej. Fragmentacja za pomocą C już istnieje. Niektóre platformy obsługują tylko C89. Niektóre obsługują C99. Niektóre obsługują C11 w różnym stopniu. Itp.

Jeśli chcesz użyć C, a następnie użyć C . Fakt, że inni ludzie nie dokonali takiego wyboru, nie oznacza, że ​​twój wybór jest zły lub że ich wybór jest zły. Nie musicie się im usprawiedliwiać, a oni nie muszą się wam usprawiedliwiać.


2
Nie sądzę, że Google ledwo toleruje osoby korzystające z NDK, ponieważ trwa opracowywanie NDK i istnieje kilka wersji dla Androida, nawet jeśli Google nienawidzi C / C ++, nie sądzę, że mogę to osiągnąć dobry poziom wydajności mojej gry w Javie lub najważniejsi gracze na rynku mogą przepisać swój kod tylko na Javę i Androida, Prawdopodobnie jest to zło konieczne dla Google'a, nie wiem, moim celem jest zapytać o szeroki przeglądać, a nie kiepskie pytanie o C vs C ++ vs Java vs świat, szukałem bardziej ogólnej odpowiedzi z języka kontynuuj
user827992,

do kompilatora, biorąc pod uwagę wszystkie funkcje językowe, twoja odpowiedź pozwala mi również podkreślić mój pierwszy punkt na temat dostępności kompilatorów C na rynku, w systemie Windows mam prawie cały program, który produkuje kompilator z własnym kompilatorem, mam również inne bezpłatne opcje, takie jak MinGW. Prawdziwym problemem, który znalazłem w C, jest brak natywnej obsługi struktur danych, kontenerów, w C ++ możesz dowiedzieć się, ile kosztuje cię dany kontener lub określona instrukcja,
user827992

w C prawdopodobnie kod, który robi to samo, ma więcej niż jedną implementację, również w C ++ kompilator może w wyniku tego zoptymalizować więcej. Prawdopodobnie powinienem więcej uczyć się C ++, ale myślę, że przestawię się na C ++ tylko dla dobrego wsparcia dla niektórych konkretnych funkcji, a nie dla samego języka.
user827992,

7

Warto również zauważyć, że oprogramowanie ID decyduje się całkowicie przepisać bazę kodu dla IdTech 4 w C ++, ogromną ilość pracy, której szczerze mówiąc, nie rozumiem bez naprawdę dobrej listy powodów.

Często przepisują prawie cały silnik dla każdego wydania (przynajmniej do niedawna - niewiele wiem o kilku ostatnich grach), a ponieważ popularność C ++ zyskuje na popularności, warto go używać zamiast trzymać z C. Z czasem coraz mniej osób będzie kompetentnych w C.

Dlaczego w pewnym momencie branża masowo przeszła na C ++?

Ponieważ zapewnia wiele funkcji wyższego poziomu, a jednocześnie jest prawie całkowicie wstecznie kompatybilny z kodem C.

Jakie są przyczyny wyboru dokonanego przez siebie dokumentu tożsamości?

Google odpowiedziałby na to za Ciebie: http://fabiensanglard.net/doom3/interviews.php

„... połowa programistów naprawdę na początku miała doświadczenie w C ++. Miałem C i Objective-C, a ja w pewnym sensie„ wślizgnąłem się do C ++ ”, patrząc tylko na kod, który piszą faceci C ++. Z perspektywy czasu szkoda, że ​​nie poświęciłem czasu na dokładne zbadanie i poznanie języka, zanim zacznę go używać.

Nadal możesz być w stanie stwierdzić, że kod mechanizmu renderującego został w dużej mierze opracowany w języku C, a następnie zmieniony w C ++.

Dzisiaj głęboko wierzę, że C ++ jest właściwym językiem dla dużych projektów z wieloma programistami o krytycznych wymaganiach dotyczących wydajności, a Tech 5 jest znacznie lepszy dla Doom 3 ”.

Gdybym napisał mój kod w nowoczesnym C ++, prawdopodobnie bolełbym teraz, ponieważ jeden z najpopularniejszych systemów operacyjnych na świecie byłby dla mnie niedostępny.

  1. Programiści nie mogą patrzeć w przyszłość. Nie wiedzieliby, że będzie nowa platforma ze słabą obsługą C ++. Android nie istniał poprawnie do 2009 roku. Doom 3 był z 2004 roku.
  2. Czy uważasz, że programiści piszący najnowocześniejsze gry 3D na komputery PC i konsole oczekują, że ich kod będzie działał również na telefonach? Dążenie do tego stopnia przenośności jest bardzo rzadkie i często bezcelowe ze względu na ogromną różnicę w dostępnej mocy.

Powinienem napisać kod C ++ odnoszący się do wersji C ++, która ma starą wersję 2-3?

Dlaczego ci na tym zależy? Nie daj się uwięzić w pogoni za najnowszą rzeczą. Gdyby był wystarczająco dobry 5 lat temu, nie pogorszyłby się teraz nagle.


3

C ++ jest dostępny od lat 80., więc jeśli kompilator go nie obsługuje, być może powinieneś użyć innego kompilatora. A także C ++ nie jest tak naprawdę wolniejszy niż C. Jest tak naprawdę tylko wolniejszy, jeśli załadujesz go wirtualnymi funkcjami i innymi abstrakcjami. Jednak C ++ jest dziś często używany w świecie nie unixowym ze względu na jego elastyczność i nowsze funkcje, których C nie ma. Pisanie kodu modułowego w C ++ jest o wiele łatwiejsze niż w C i pomaga pisać bardziej przenośny kod. Wracając do tematu kompilatorów, nie znam żadnego kompilatora, który nie obsługuje C ++ (być może nie w pełni C ++ 11, ale każdy na wpół przyzwoity kompilator powinien obsługiwać C ++).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.