Rywalizacja z C ++ w zakresie programowania gier

21

Jestem ciekawy, dlaczego C ++ jest tak popularny do tworzenia gier, a nie innych języków. Wiem, że możesz stworzyć z niego bardzo szybki kod, ale co dokładnie sprawia, że ​​jest popularny?

Czy to tylko dlatego, że jest szybki? Czy jest to jakaś inna funkcja w języku, taka jak paradygmat OO lub przenośność? Czy to z powodu wszystkich bibliotek, które powstały z czasem? Czy jakaś kombinacja tych (i innych) powodów?

Gdyby ktoś mógł mi to powiedzieć, byłbym bardzo szczęśliwy. :-)

KasMA1990
źródło
7
Szybkość jest dla mnie wystarczającym powodem, zwłaszcza że skargi wszystkich na język nie mają dla mnie sensu.
Benjamin Lindley,
Szybkie zgadywanie: większość gier jest napisana dla systemu Windows. Języki C i C ++ są mocno wspierane przez Microsoft. I wreszcie C ++ jest preferowany ze względu na OOP i metaprogramowanie szablonów.
@ Matt Dzięki, nie wiedziałem, że istnieje. Czy mogę przenieść temat tam, czy powinienem go usunąć i odtworzyć tam?
To pytanie zostało już zadane kilka razy.
Zan Lynx,
1
@Benjamin: Więc twierdzę, że nie napisałeś wystarczająco dużo w C ++ lub nigdy nie używałeś bardziej ekspresyjnego języka, takiego jak Python (lub nawet C # z LINQ). Jednak nawet jeśli z jakiegoś szalonego powodu wolisz pisać 20-liniowy kod dla tego, co wiele innych języków może zrobić w 1, bardzo słaba gramatyka C ++ oznacza, że kompilacja programów zajmuje znacznie więcej czasu niż powinny, a także odpowiednie narzędzia IDE (refaktoryzacja itp.) są trudniejsze, jeśli nie niemożliwe, do stworzenia.
BlueRaja - Danny Pflughoeft

Odpowiedzi:

29

Liczne powody:

  • Duży, który przegapiłeś: jest przenośny, upraszczając porty silnika gry na iOS, XBOX, PS3, cokolwiek
  • To jest szybkie
  • Wszystkie zestawy SDK obsługują go natywnie
  • Wiele dostępnych bibliotek
  • Każdy, kto pisze gry, wie o tym, więc łatwo jest zatrudnić doświadczonych twórców gier dla swojego zespołu
  • Osadzanie języka skryptowego silnika gry, takiego jak Lua, jest banalne

źródło
W porządku, dziękuję wszystkim za odpowiedzi, wszystko, czego potrzebuję, myślę. :-)
KasMA1990,
14

Jest kilka powodów, o których chciałbym wspomnieć oprócz tego, co poruszał @Graham.

  • Legacy Code - wiele studiów ma dużo kodu C ++, wspomina o bibliotekach.
  • C ++ jest naprawdę asemblerem wysokiego poziomu i ma bezpośredni dostęp do sprzętu (przynajmniej tak bezpośredni, jak można uruchomić na systemie operacyjnym) i jest dość szybki. Jeśli chcesz, w C ++ możesz przejść bezpośrednio do języka asemblera do kontroli poziomu instrukcji (nie to, że zawsze jest to mądre, po prostu nie jest możliwe w Javie, C #, Python itp.)
  • DirectX i OpenGL natywnie obsługują C ++, większość innych języków ma „powiązania” z podstawowymi bibliotekami poprzez warstwy pośrednie, co nie znaczy, że nie są szybkie lub nie mogą zrobić wielu takich samych rzeczy, ale dodaje warstwę oprogramowania pomiędzy Twoja gra i sprzęt.
  • Jak wspomina @Graham, wielu programistów wie o tym, więc łatwo jest znaleźć doświadczonych programistów, a także jest dość przenośny, w porównaniu do C #, który utknął w .NET Framework (istnieje Mono, ale generalnie opóźnia się o pokolenie za implementacją Microsoftu .)
Nate
źródło
Nie masz na myśli niskiego poziomu?
jhocking 13.04.11
5
C ++ jest low-leveljęzykiem; ale high-levelasembler, IMO.
Nate
3
Nie zgadzam się. C ++ jest językiem wysokiego poziomu, z wbudowanym narzędziem do powrotu do C (który jest językiem niskiego poziomu).
foo
7
C ++ jest językiem wysokiego poziomu, podobnie jak C. Asembler jest poziomem niskim. Teraz C ++ jest wyższy niż C, podobnie jak C # jest wyższy niż C ++, a Ruby / Python są wyższe niż C #.
AA Grapsas,
4
Dlaczego starszy kod powinien być przestarzały (a nie amortyzowany)? „Stary kod” oznacza po prostu, że jest stary, a nie zły.
8

Szybkość pierwotna jest głównym powodem, ale tak naprawdę nie jest to decyzja ani, więc wiele firm produkujących gry zaczyna używać innych języków w niektórych częściach gry. Niektóre zadania wymagają, aby komputer działał tak szybko, jak to możliwe (np. Podstawowe funkcje renderowania), ale wiele zadań w kodzie gry nie musi działać tak szybko (np. Otwieranie drzwi, gdy gracz je kliknie), co oznacza, że jest mądry w użyciu dla tych części znacznie prostszego (a przez to szybszego do pisania programów) języka. Dlatego wiele silników gier jest napisanych w C ++, ale zawierają język skryptowy, taki jak Lua, do pisania kodu gry.

Trudną rzeczą do zrozumienia jest to, że przy wyborze języków programowania istnieje ogólny kompromis między wydajnością komputera i wydajnością programisty. To znaczy, co jest dla Ciebie ważniejsze, jak szybko komputer uruchamia kod lub jak szybko programista pisze kod?

jhocking
źródło
3

W C ++ można przydzielić zmienne lokalne, które znikają po zakończeniu funkcji. Zazwyczaj są one przydzielane na stosie.

Zmienne stosu nie przyczyniają się do problemów związanych z dynamiczną alokacją pamięci związaną z fragmentacją i narzutem. Przydzielanie pokoju na stosie jest szybkie i łatwe (wystarczy dopasować wskaźnik). Dynamiczny przydział pamięci zwykle polega na przeszukaniu kontenera pod kątem odpowiedniego bloku pamięci, oznaczeniu pamięci, a następnie oznaczeniu jej jako zajętej. Dealokacja obejmuje dodanie bloku pamięci do kontenera i ewentualnie połączenie go z istniejącymi blokami. O wiele więcej narzutów niż tylko zmiana wskaźnika.

Java i C # przydzielają pamięć dynamicznie, z wyjątkiem typów pierwotnych. Języki te zależą od środowiska wykonawczego, które oznaczy zmienną do usunięcia, a następnie uruchom moduł wyrzucający elementy bezużyteczne w losowych (niezaplanowanych) odstępach czasu, aby odzyskać pamięć. Zasadniczo programista nie ma kontroli nad tym, kiedy zmienna zostanie oznaczona do usunięcia, ani kiedy zostanie odzyskana (odzyskiwanie zużytej pamięci jest zaawansowanym tematem, którego nie doświadcza większość programistów C ++ i Java).

Szybkość C ++ wynika przede wszystkim z jego bezpośredniego tłumaczenia na kod wykonywalny. Java i C # są kompilowane do kodu pośredniego, który jest następnie interpretowany przez maszynę wirtualną. Zasadniczo języki interpretacyjne działają wolniej niż języki tłumaczone bezpośrednio.

Thomas Matthews
źródło
1
-1 (gdybym mógł) - lokalne operacje podstawowe są przydzielane na stosie zarówno w języku Java, jak i C #, aw języku C # można utworzyć alokację stosu structs. Więcej do punktu, niezwykle wyjątkowo niewielki wzrost prędkości to sieci nie jest prawie tyle, aby uzasadnić jednego języka nad drugim. Prawdziwy powód jest podany przez @Graham Perks: to jest to, co powinni wiedzieć twórcy gier, więc tego się uczą nowi twórcy gier i jakie są nowe pakiety SDK. Istnieje wiele języków (np. Go), które są tak szybkie lub szybsze, i nie prawie tak niewygodne dla pisania.
BlueRaja - Danny Pflughoeft
C ++ nie jest zbyt dobry w alokacji stosów; w rzeczywistości bardzo trudno jest alokować na stosie obiekty zgodne ze STL. np. ostatni duży silnik, nad którym pracowałem, był w C, a my mieliśmy ciąg, który można uruchomić na stosie o ustalonym rozmiarze (zwykle 1K). Jeśli minęło, przezroczyście przeniósł się na stos. Możesz zrobić podobne rzeczy z niestandardowymi alokatorami std :: string w C ++, ale kod jest o wiele trudniejszy do poprawnego wykonania.
1
@Joe Wreschnig: C ++ doskonale nadaje się do alokacji stosów, wystarczy zrzucić listę asemblera. Jednak większość dostawców kompilatorów nie przydziela dużej ilości pamięci do stosu. Powszechnym zrozumieniem doświadczonych programistów C ++ jest to, że Ogromne obiekty są dynamicznie przydzielane (sterty), a nie pamięci lokalnej (stosu). Ogromne obiekty na stosie mogą wbiegać na stos na niektórych platformach, gdy stos i stos rosną ku sobie.
Thomas Matthews,
1
Powszechnym zrozumieniem dla bardziej doświadczonych programistów C ++, szczególnie tych na konsolach do gier, jest to, że wszystko, co nie przepełni stosu, jest przydzielane lub wstępnie przydzielane. C ułatwia to, ponieważ alokator nie jest częścią typu strukturalnego obiektu. Umożliwia to również nieprawidłowe zwolnienie czegoś, ale z mojego doświadczenia jest to rzadki problem w porównaniu z tym, że ktoś popsuł implementacje / kompatybilność alokatora zgodnego ze standardem stdlib. Są też pewne sztuczki z umieszczaniem nowych, ale znowu, jest to bardziej skomplikowane niż odpowiednik w C.
2
Nie. Korzyści płynące z szybkości C ++ wynikają z możliwości użycia własnego, niestandardowego menedżera pamięci do przydzielania sterty . Każdy rozsądny język przydziela miejscowych na stos.
Nevermind,
3

Gry były kiedyś pisane w języku maszynowym, ponieważ miały egzotyczny sprzęt, dla którego nie było kompilatora. Sprzętowi brakowało również funkcji, które programiści C biorą za pewnik, takich jak wydajna matematyka na 16-bitowych liczbach całkowitych.

Gdy gry osiadły na znanym sprzęcie, kompilatory C stały się dostępne iw krótkim czasie wszystkie gry zostały napisane w C.

C ++ wydawało się kiedyś dobrym pomysłem, a większość gier jest dzisiaj C ++, ale inżynierowie mamroczą o powrocie do C, a to może się zdarzyć. Chciałbym pracować nad grą w C, podobnie jak wielu współpracowników. W C ++ nie ma żadnej nowej funkcji, która moim zdaniem poprawia gry.

Wydawałoby się teraz, że komputery są 1000 razy szybsze niż kilka lat temu, język wysokiego poziomu skróciłby czas programowania ($), czyniąc C przestarzałym.

Tak się nie stało, ponieważ kupujący gry wiedzą, że sprzęt jest 1000 razy lepszy, i chcą wymienić swoje pieniądze na grę, która wygląda i brzmi 1000 razy lepiej. Usuwa to z systemu luz, który zużywałby język wysokiego poziomu.

Wymagania dotyczące wydajności w grach są brutalne. Nowa ramka grafiki musi zostać zrenderowana w czasie poniżej 33ms (lub 16ms!). Należy uwzględnić wszystko, co robi sprzęt, aby ten budżet mógł zostać zrealizowany. Każdy język, który zadziała i robi coś ze sprzętem, którego programista nie rozumie lub nie spodziewa się, bardzo utrudni realizację tego budżetu. Jest to automatyczny minus w stosunku do czegokolwiek wysokiego poziomu.

Programiści gier nie tylko pracują w języku niskiego poziomu, ale także unikają struktur danych i algorytmów wysokiego poziomu. Gry zazwyczaj nie mają połączonych list i rzadko mają drzewa. W miarę możliwości występuje ruch w kierunku unikania wskaźników *. Każdy algorytm z czasem większym niż O (N) lub przestrzenią O (1) zwykle nie znajduje szerokiego zastosowania.

* Jeśli wskaźnik nie powoduje braku pamięci podręcznej, to po co wydawać 32 bity, aby go zapisać? Jeśli wskaźnik powoduje brak pamięci podręcznej, najlepiej się go pozbyć.

bmcnett
źródło
1
„W C ++ nie ma żadnej nowej funkcji, która moim zdaniem ulepsza gry.” LOL? OOP? Klasa humanz pochodnymi playeri enemy?
orlp
2
@nightcracker: Basic is-a dziedziczenie działa dobrze w C; relacja, którą opisujesz, lepiej jest wdrożyć za pomocą has-a ze względu na wydajność i czystość.
3
Istnieje coraz większa zgoda co do tego, że funkcje OOP w C ++ nie są odpowiednie dla gier, ponieważ działają one na założeniach, które są wrogo nastawione do wydajności pamięci podręcznej.
bmcnett,
Nawet jeśli uważasz, że C ++ nie oferuje żadnych korzyści w stosunku do C, powinieneś z pewnością zauważyć, że powrót do C nie oferuje również żadnych korzyści w stosunku do C ++.
Dan Olson,
@Dan Powrót do C ma tę zaletę, że „najlepsze praktyki”, takie jak nieużywanie szablonów lub OOP, są wymuszane przez błędy czasu kompilacji, zamiast ścigania młodszych programistów kijem. Również dlatego, że język jest prostszy, prawdopodobnie kompilator, a konserwacja debuggera jest również tańsza.
bmcnett,
3

Każdy język programowania ma swoje mocne i słabe strony w wielu różnych czynnikach. Przykładami tych czynników są:

  • Prędkość na konkretnej platformie
  • Zużycie pamięci na konkretnej platformie
  • Jaką funkcjonalność udostępnia łatwiej
  • Na jakich platformach istnieje
  • Jakie uwagi musi wziąć programista na pokład

Jednym z najważniejszych czynników, na których dba programista, jest wydajność. Chcą stworzyć interaktywne doświadczenie, co oznacza, że ​​musi być reaktywny i być w stanie wygenerować jak najwięcej użytecznych (lub interesujących) danych, jak to możliwe. Chcesz wiedzieć, ile masz zdrowia w dowolnym momencie i nie chcesz na to czekać. A jeśli klikniesz przycisk, oczekujesz, że wystrzeli broń lub Twoja postać podskoczy, kiedy to powiesz. Niewielkie opóźnienie może zakłócać tę interaktywność, dlatego potrzebujesz wydajności.

Innym ważnym czynnikiem jest preferowanie programowania w języku problemu, a nie w języku implementacji. Programista gier chce zajmować się ludźmi, orkami i samochodami wyścigowymi, a nie rejestrem pamięci ED0. Nadal chcą opcji nurkowania w szczegółach implementacji, jeśli potrzebują wydajności, ale byłoby świetnie, gdyby w przeważającej części potrafili radzić sobie na poziomie bytów w swoim świecie gry. Mają dość zmartwień o symulowanie świata gry bez konieczności dbania o to, jak działa połączona lista.

C ++ bardzo dobrze pasuje do tych dwóch głównych czynników. Możesz zyskać na wydajności wynikającej z asemblera lub kodu C z wyrazistością obiektów. Aby zobaczyć, dlaczego jest to naturalne dopasowanie do gier, porównaj z innymi opcjami językowymi:

  • Montaż: To jest surowa moc. To, co piszesz, jest w zasadzie tym, co robi procesor. Ale na każdym etapie musisz wiedzieć, co się dzieje z rejestrami i ich skutkami, i nigdy nie wygląda to na byty w twoim świecie gry. Programista musi dokonać mentalnej zgodności tego, co robi ich kod, z tym, co dzieje się w grze. To może być dość mentalne obciążenie.
  • C: Tutaj mamy dobrą wydajność, ale możemy wykorzystać doświadczenie guru, aby wykonać standardowe rzeczy (takie jak przydzielanie pamięci, operowanie na ciągach znaków i używanie standardowych funkcji matematycznych). Zbliżamy się tutaj do ekspresji, ale język mniej więcej zmusza cię do skupienia się na implementacji, ponieważ tak naprawdę możesz operować tylko na normalnych typach danych. Wszystko jest naprawdę char, int lub tym podobne. Struktury, wskaźniki i tablice mogą trzymać wszystko razem, ale nadal muszą myśleć o elementach wewnętrznych.
  • Java: Przeskakujemy przez C ++ i przechodzimy do Java. Java odsuwa się od szczegółów implementacji. W rzeczywistości przez większość czasu nie masz dostępu do niższych poziomów. Java wyodrębnia wiele szczegółów implementacji (np. Jakiego procesora lub systemu operacyjnego używasz) z tego powodu, że chce być wieloplatformowy. Nie możesz uzyskać dostępu do szczegółów, ponieważ ich tam nie ma. Nie programujesz na komputer, programujesz na platformę (platformę Java, która tak naprawdę istnieje na większości komputerów). Co więcej, Java ma prawdopodobnie lepszy język do radzenia sobie w języku problemu niż C ++. Kompromis polega na tym, że nie można zoptymalizować dla konkretnego komputera. To, czy stanowi to praktyczną różnicę, sprowadza się do specyfiki programu i komputera.
  • Język skryptowy gry: mam na myśli coś takiego jak UnrealScript lub niestandardowe języki skryptowe powiązane z silnikiem gry. W nich nie masz dostępu do silnika bazowego. Przekazujesz względy wydajności silnikowi, pozostawiając sobie swobodę martwienia się tworzeniem gry. Łatwiej jest napisać grę, trudniej samemu zoptymalizować jej wydajność.
  • Haskell (lub twój ulubiony niejasny język): każdy język programowania Turing-zupełny jest równoważny każdemu innemu. Tak więc, podczas gdy można napisać dowolny program w dowolnym języku, zrobić kompromisów, jakiś cel, niektóre subiektywne. Język taki jak Haskell jest bardziej skoncentrowany na pracy w duchu matematycznym. Problemy, do których jest przeznaczony, są nieco inne niż problemy w grach. Nie oznacza to, że nie może lub nie powinien być używany do gier, po prostu nie jest łatwo do niego przystosowany.

Ostatnią kwestią jest to, że niektóre z nich mają charakter historyczny i polityczny. Wiele wojen płomiennych toczyło się między różnymi językami programowania. Na przykład C # może być równie odpowiedni do tworzenia gier, ale pojawił się po C ++. Lub ludziom się to nie podoba. Niektóre osoby przeprowadziły się do C #, niektóre nie. Niektóre osoby nadal programują gry w języku BASIC, Pascal i C. Bez względu na to, z czego programiści czują się komfortowo, będą się trzymać. Programiści gier byli w większości zadowoleni z C ++, być może dlatego, że dorastali z C i C ++ i spełnił ich potrzeby. Jeśli przemysł komputerowy znajduje się w stanie, w którym wydajność i upodobanie Javy satysfakcjonuje wystarczającą liczbę osób, być może Java byłaby de facto standardowym językiem programowania gier.

BrettW
źródło
2

Dziedzictwo i pęd.

Dawno, dawno temu został napisany kod w asemblerze dla najwyższej wydajności. Wraz ze wzrostem mocy obliczeniowej, języki kompilowane stały się bardziej opłacalne, a C oferował najlepszy kompromis między mocą a produktywnością, na bardzo podstawowym poziomie niewiele więcej niż makro asembler.

C ++ był naturalnym następcą C. Nie wyrzucasz wcześniejszego kodu ani wiedzy, ale masz potencjał, by rozwinąć się w nowe metodologie. C ++ jest ostatecznie bardzo elastyczny i jeszcze nie widziałem paradygmatu projektowania, którego nie można przynajmniej symulować w C ++, a jednocześnie być w stanie utrzymać prawie całkowitą kontrolę nad wydajnością.

Simon Lacey
źródło
2

Jeśli tworzysz konsole, nie masz wyboru: profesjonalne zestawy SDK są dostępne tylko w wersjach C ++. Zwykle mają również dostęp do C dla większości rzeczy.

Ponieważ wielu programistów to konsole + PC, sensowne jest, aby cała ich praca na PC odbywała się w tym samym języku i bezpośrednio współdzieliła technologię.

Ponieważ tam mieszka profesjonalna branża i większość z nich chce być tego częścią, większość programistów gier to programiści C ++.

Ponieważ wszystko to się dzieje, większość programistów silników jest również programistami C ++, więc podczas oceny silników klasy profesjonalnej prawie wszystkie wybory to C ++.

To wszystko duży samopodtrzymujący się silnik. Zakłócenie tego wymagałoby więcej niż tylko postępu technicznego.

Chris Subagio
źródło
2

FWIW: C # zyskuje na popularności w tworzeniu gier. Zobacz post na blogu Miguela de Icazy . Bardzo ciekawa lektura, IMHO.


źródło
2
Jak zwykle Miguel popiera swoje ulubione (zwykle marginalne) technologie, ignorując sposoby, w jakie C # stał się dużym graczem w branży, np. XNA.
2

Chociaż jestem dość mocno przeciwny C, C i C ++, jedyną rzeczą, jaką mają, że niewiele innych języków ma, jest pełna kontrola nad platformą, na której działa, możesz być pewien, co dokładnie będzie się działo przez cały czas, nie GC, żadnych błędów.

W dzisiejszych czasach nie jest to tak ważne, ale może być w przypadku słabych platform.

Na PC / Mac / Linux jest to prawdopodobnie najmniej przenośny język, z którym się obecnie spotkasz, a premia do prędkości nie jest już tak istotną różnicą - Minecraft (Java) jest płynny i działa na dość minimalnych platformach (i dowolnym systemie operacyjnym) z jednym plikiem wykonywalnym - jeszcze nie widziałem aplikacji C / C ++ indi o niskiej sile roboczej z taką samą funkcjonalnością i tak małą liczbą błędów, nie mówiąc już o pracy na trzech platformach.

W tym momencie powiedziałbym, że większość z nich to bezwładność i koncepcja, że ​​prawdziwe gry są zawsze wykonywane w C / C ++, chociaż zdolność do „portowania” na iPhone'a i konsole jest znacząca (chociaż jestem całkiem pewny, że większość interfejsu użytkownika gier wymaga dużo wysiłku, aby przenieść je z wyjątkiem Windowsa i XBoxa.

Bill K.
źródło
1
Och, nie wiem, czy to ważne tylko dla „słabych” platform. Innym sposobem spojrzenia na to jest to, że gry są zawsze w czołówce wydajności na dowolnej platformie: każda nowa moc jest natychmiast pochłaniana. Jeśli mówimy o profesjonalnym tworzeniu gier, wydajność jest w zasadzie najważniejsza: nie piszesz Unreal bez maksymalizacji każdego ostatniego cyklu, jaki ma do zaoferowania maszyna. Każdy; pojedynczy; cykl. Na każdym poziomie, od silnika graficznego i dostępu do dysku po pętlę interfejsu użytkownika.
Chris Subagio
@Chris: Najlepszym sposobem, w jaki udało mi się opisać to programistom spoza gier, jest to, że gry są domeną, w której szybkość jest przewagą konkurencyjną. Jeśli edytor tekstu uruchomi się w ciągu 5 sekund, gdy MS Word zajmuje 10, lub ponownie w ciągu 0,1 sekundy, gdy Word zajmuje 0,2, jest to bezwartościowe. Ale jeśli Twoja gra może wypompować nawet 10% więcej fragmentów lub pokazać jeszcze jedną bardziej szczegółową postać, może to być ogromną przewagą konkurencyjną.
Czy nie byłoby głupotą kodowanie w żadnym innym miejscu niż w asemblerze? Z pewnością byłoby to co najmniej 10% szybciej. Istnieje punkt, w którym wzywasz do rezygnacji z wydajności w zakresie konserwacji i szybkości rozwoju. Ogólnie rzecz biorąc, obecnie chodzi o C ++. Byłoby miło, gdyby zdolność przejścia na wiele platform, takich jak Minecraft, miała większą wagę.
Bill K
Ach, ale błędem jest, że kodowanie w asemblerze jest szybsze: obecne układy scalone są na tyle złożone, że programiście trudno jest konsekwentnie przewyższyć kompilator. Jedynie w bardziej ograniczonych domenach, takich jak SPU na PS3, wewnętrzne pętle fizyki i shadery na GPU mają nadal wyraźne zalety. C ++ jest obecnie najsłodszym miejscem, z zastrzeżeniem, że OOP nie zawsze jest najlepszym wyborem: trwająca dyskusja Struct of Arrays vs. Array of Structs nie jest dokładnie dyskusją językową, ale C ++ wyraźnie prowadzi cię do AoS; Czasami ... naprawdę chcesz po prostu C.
Chris Subagio
Krok w wydajności programisty między asemblerem i C / C ++ jest również o rząd wielkości większy niż krok w wydajności programisty między C i C ++ lub C ++ i C # / Java. Fred Brooks zwrócił na to uwagę 25 lat temu.