Чому галузь перейшла з C на C ++? [зачинено]


19

Перш за все, я хотів би отримати справжню відповідь, я завжди намагаюся отримати більше з різних джерел і статей, і коли я читаю такі речі, як C ++ повільно, тому що він має віртуальні функції, і через це C краще , я дійсно не знаю, що сказати і думати, як людина з мозком. Тому, будь ласка, уникайте цього рівня у своїх відповідях.

Моє запитання стосується масштабного переходу на C ++, яке було завершено більш-менш за допомогою Doom 3.

Цікавим для мене є те, що до цього рубежу більшість ігрових двигунів і самих ігор були написані на мові С, як це було ще з епохи Quake . Також цікаво відзначити, що програмне забезпечення ID вирішує повністю переписати базу коду для IdTech 4 в C ++, це величезна кількість роботи, яку, чесно кажучи, я не можу зрозуміти без дуже хорошого переліку причин.

Я зосереджуюсь на Doom 3, тому що мене в основному цікавить світ OpenGL і в моїй подорожі я намагаюся залишатися зосередженою на цій темі, тому я багато читаю про це, але думаю, що таке питання може бути рендерінг-API -агностичний без зайвих проблем.

Чому в певний момент часу галузь масово перейшла на C ++? Які причини вибору, який зробив ідентифікатор?

Останнє, що я хотів би сказати, - це те, що мова С набагато простіша у виконанні та надає меншу кількість функцій, тому що це набагато менше шансів бути «фрагментованим» на шматки, на відміну від С ++. Найпростіше кажучи, у мене набагато більше шансів знайти справді хороший компілятор C, а не хороший компілятор C ++ з усіма можливостями, реалізованими в хороший спосіб.

Наприклад, NDK для Android все ще не має гарної підтримки C ++ (з випуском r8b) з усіма останніми та найкращими можливостями, і це рідний інструментарій для найпопулярнішої мобільної ОС у світі!

Якби я написав свій код на сучасному C ++, я б, мабуть, зараз болів, бо одна з найпопулярніших ОС у світі була б для мене поза межами. І як Android, багато інших компіляторів не такі великі.

Я мушу написати код C ++ з посиланням на версію C ++, яка має 2-3 версії?


1
Я підозрюю, що C ++ - це квазі розширення C. Люди почали писати C з особливостями C ++, такими як std :: vector, звідти на C ++ навчали замість C, і таким чином люди почали писати повноцінний C ++.
API-Beast

1
Що ж, C проти C ++ при розробці великого додатка? OOP - чудова парадигма, і .. C ++ підтримує її. Якщо ви збираєтеся написати гру на C, то розгляньте дизайн, орієнтований на дані . В іншому випадку давайте поміркуємо над тим, чому всі основні поточні гравці галузі використовують C ++. Інженерія програмного забезпечення, будь то для фінансових додатків або дозвілля, покладається на плечі парадигми ООП та архітектурних та дизайнерських моделей. Простіше кажучи, C не може запропонувати велику картину, яку пропонує вам інкапсуляція. Чи є якісь сучасні великі фрагменти програмного забезпечення, написані на С? Можливо, ядра та вбудовані системи.
теодрон

@teodron 1) Я повинен створити хороший виконуваний файл, я дбаю про мову, як я дбаю про важливий актив, але це не все, і це не те, що я продаю 2) інкапсуляція - це не так добре для продуктивності, якщо хтось хоче переконайте мене покинути світ C ++, інкапсуляція - одна з хороших тем для цього.
користувач827992

3
" Цікавим для мене є те, що до цього рубежу більшість ігрових двигунів і самих ігор були написані на мові С, як це було ще з епохи Quake ". Крім двигунів з відкритим кодом Id-software. Вони не у всій галузі відеоігор.
Ніколь Болас

@NicolBolas я пояснював причину, чому я говорив про посвідчення особи, будь ласка, знайдіть сенс усього питання.
user827992

Відповіді:


28

C ++ робить все, що робить C. Можна тривіально змішувати C і C ++ у випадках, коли переваги C переважають за переваги C ++. Це дуже навмисне дизайнерське рішення C ++.

C ++ робить те, що C не робить. Сюди входить легкий поліморфізм, але також і легко складати генерацію часового коду за допомогою шаблонів. Це дуже зручно для таких речей, як контейнери, які легко є найбільшою слабкістю C. Він також дозволяє визначати користувачеві типи вказівника (розумні ручки), які економлять багато часу, а також визначені користувачем примітивні типи типу векторів та матриць із підтримкою оператора (також економить багато часу).

Віртуальні функції повільніше, ніж невіртуальні функції. Однак ви повинні увімкнути віртуальні функції, і грамотний програміст робить це лише тоді, коли вони приносять користь. Програмісти на C мають функціональні покажчики і часто зберігають колекції тих, які є у структурі, на яку посилаються інші структури; Іншими словами, вони проходять додаткову роботу, щоб відтворити абсолютно те саме, що і віртуальні таблиці функцій. У випадках, коли потрібен лише один покажчик функції, а таблиця не потрібна, C ++ все-таки повністю дозволяє це і еквівалентно C. З сучасним компілятором C ++ є лише повільніше, ніж C у конкретних випадках, коли програміст вмикає функцію . Крім того, віртуальних функцій на практиці дуже мало на модемних процесорах. Сьогодні обладнання призначене для моделей використання C ++ і ще більше розробляється для потреб інтерпретованих мов високого рівня.

Винятки C ++ історично накладають багато накладних витрат, роблячи C ++ повільніше, навіть якщо ви їх не використовуєте. Винятки було жахливо додати до C ++, якщо з будь-якої іншої причини, крім величезного збільшення складності, пов’язаної з написанням коду, безпечного для винятків, і фактично деякі конструкції контейнерів буквально неможливо зробити виняток безпечним. Ігрові програмісти часто ігнорують існування виключень і навіть відключають їх у компіляторі. Сучасні компілятори мають нульові накладні винятки (тобто ви оплачуєте їх лише тоді, коли фактично ними користуєтесь).

C простіше вивчити всі правила. C ++ - дуже велика, складна мова. C ++ дозволяє писати код вищого рівня, створюючи більш прості та прості API. Деякі хочуть зрозуміти мову простіше, інші хочуть легше писати розширений код. Це компроміс між простотою розуміння того, що робить компілятор із певним фрагментом коду, та простотою написання великих складних взаємопов'язаних додатків. Деякі люди цінують одного набагато більше, ніж інші, з різних причин.

Зрештою, C ++ - це суперкомплект C. На мою думку, такого високомовірного програміста на C ++, який також не є прохідним програмістом на C, не існує (хоча є багато програмістів на C ++, які падають нижче моєї смуги, хто б загубитися в чистому С). У той час як C ++ додає засоби для ізоляції програміста від більшої частини C, нетривіальний код C ++ часто потребує використання C для того, щоб зробити завдання. Це одна з головних відмінностей між C ++ та Java та C #. Існує причина, що ви часто бачите "C / C ++", зібрані разом.

Моє особисте переконання - яке ділиться з більшістю інших професіоналів ігрової індустрії, з якими я спілкувався - полягає в тому, що підвищена виразність та засоби програмування на високому рівні C ++ переважають над підвищеною складністю мови на C, і більшість інших частих Заявки щодо анти-С ++ просто застаріли із сучасними технологіями.


19
"Немає такого, як грамотний програміст на C ++, який також не є компетентним програмістом на C" Я категорично не згоден з цим твердженням. Ідіоматичний С дуже відрізняється від ідіоматичного С ++. Два стилі розходяться, один стиль підкреслює непрозорі покажчики та статичну функцію, другий використовує інкапсуляцію на основі мови тощо. Хтось, хто знає лише ідіоматичний C ++, був би компетентний на C ++, але все ще досить збентежений ідіоматичним С.
Ніколь Болас

Я не згоден з тим, що ви можете бути компетентними на C ++ і знаєте лише "ідіоматичний C ++". Жорсткі частини C ++ - це ті самі тверді частини C (плюс шаблони). Якщо програміст на C ++ плутається через окремі функції, прості структури та непрозорі або непрозорі покажчики, він ще не написав жодного нетривіального коду С ++ у жодному не-академічному сценарії реального світу. Я б пішов так далеко, щоб стверджувати, що кожен, хто є лише досвідченим "ідіоматичним" чим-небудь , ще повинен досягти компетентності.
Шон Міддлічч

3
"Ідіоматичний" - це інший спосіб сказати "комфортно", який, окрім того, що є відносним, також означає, що майже за визначенням існує незручна область мови, в якій інакше компетентний програміст на C ++ не буде особливо добре володіти. (Я не обов'язково думаю, що це означає, що їх "плутають" ті елементи, просто те, що їм незручно або не вільно володіє ними.) І, до певної міри, людей, які навчаються ідіоматичному С ++, навчають бути незручними лише проглядаючи сирий покажчик. Тому я не думаю, що грамотний програміст на C ++ має на увазі компетентного програміста на C.
Джон Калсбек

Іншим способом, безумовно, існує сфера С ++ вищого рівня, в якій ви можете повністю уникнути використання будь-якої функції нижчого рівня, яка була б необхідна для написання будь-якого серйозного коду С. Я впевнений, що більшість реальних неакадемічних кодових баз не залишаються повністю в цій царині, але я підозрюю, що ви можете знайти людину, яка лише комфортна з цією сферою, і все ще називати їх "компетентними". Звичайно, ви б не порівнювали таку людину з програмістом на С - ви порівнювали б її з кимось, хто програмує на будь-якій кількості інших мов високого рівня.
Джон Калсбек

1
@DanielCarlsson: Досить справедливо, я просто педантичний. Вибачте. Однак у цьому ключі C ++ не робить нічого, що робить оптимізацію важче, ніж C. :) Я маю на увазі, звичайно, якщо ви використовуєте STL, то ви обмежуєтесь тим, що робить STL, але великою частиною того, чому ми використовуємо C ++ замість C # або Java. Це тому, що ми можемо просто повторно реалізувати весь STL або використовувати необроблені масиви або навіть прокрутити вбудований асемблер або розширення мови (наприклад, SSE intrinsics) тощо.
Шон Міддледіч

12

Чому в певний момент часу галузь масово перейшла на C ++? Які причини вибору, який зробив ідентифікатор?

Id Software - це не "галузь". Вони - одна компанія. Хоча вони можуть бути впливовими, вони не всі.

Я працював над парою ігрових двигунів, які датуються 1999 роком, і вони використовували C ++.

Принциповими причинами прийняття C ++ "приблизно в цей час" є:

  1. Це було стандартизовано . C ++ 98 названий так, тому що він був випущений як стандарт ISO в 1998 році. До цього існувало кілька діалектів C ++, не маючи чіткого уявлення про те, що було "реальним" чи "правильним". Після його стандартизації і компілятори почали впроваджувати стандарт, розробники ігор могли покластися на фактичний стандарт.

  2. Згадайте старий анекдот: Хлопець заходить у лікарню і каже: "Боляче, коли я так піднімаю руку". Тож лікар каже: "Тому не піднімайте руку так".

    Якщо віртуальні функції повільні для ваших потреб, C ++ не змушує вас їх використовувати. У C ++ все включено. Ви вирішили використовувати кожну конкретну функцію. Якщо ви маєте критичний для продуктивності код і не хочете віртуальних накладних витрат, ви не використовуєте віртуальні функції. Так само, як якщо ви маєте критичний для продуктивності код на C, ви не використовуєте покажчики функцій.

    Дійсно, це призвело до того, що багато C ++ ігор не ідіоматичні C ++ (принаймні, не сучасні ідіоматичні C ++), а просто "C з класами". І це ідеально функціональний спосіб програмування на C ++. Пекло, просто можливість не набирати текст typedef structпід час створення нового типу - це користь.

    C ++ - це велика сумка функцій, і ви можете вибрати, які саме ви хочете.

Наприклад, NDK для Android все ще не має гарної підтримки C ++ (з випуском r8b) з усіма останніми та найкращими можливостями, і це рідний інструментарій для найпопулярнішої мобільної ОС у світі!

Ваша думка бути? Google ледве переносить людей, які використовують NDK; зрозуміло, що вони хочуть, щоб усі користувалися Java. Єдина причина, що існує NDK - це те, що є певні важливі розробники, які просто не використовуватимуть платформу без неї. Таким чином, NDK існує, щоб обслуговувати їх та їхні функції.

Так, C ++ - це більша, складніша специфікація. Так само і Java. Так є будь-яка мова, крім C.

Крім того, що ви маєте на увазі "всі найновіші та найкращі функції"? Якщо ви говорите про речі C ++ 11, ну ще ніхто цього не реалізує повністю. Спекуляції зараз майже рік. Крім того, я не знаю, чи підтримує також NDK C11; так, C також має "новітні та найкращі функції", які підтримуються не скрізь.

Звідси випливає важливий момент: якщо ви хочете, щоб ваш додаток pure-C збирався на Visual Studio, він повинен відповідати C89, і нічого вище за це. Тож фрагментація з C вже існує. Деякі платформи підтримують лише C89. Деякі підтримують C99. Деякі підтримують C11 в різній мірі. І т.д.

Якщо ви хочете використовувати C, а потім використовувати C . Той факт, що інші люди не зробили цього вибору, не означає, що ваш вибір неправильний або що їх вибір неправильний. Вам не потрібно виправдовувати себе перед ними, і їм не потрібно виправдовувати себе перед вами.


2
Я не думаю, що Google ледве переносить тих, хто використовує NDK, оскільки розвиток NDK триває, і для Android є кілька версій, навіть якщо Google ненавидить C / C ++, я не думаю, що я можу досягти хороший рівень продуктивності для моєї гри на Java або найважливіші гравці на ринку можуть переписати свій код лише для Java та Android. Можливо, це є необхідним злом для Google, я не знаю, моя суть полягає в питанні про широкий перегляньте і не кульгаве питання про C vs C ++ проти Java проти світу, я шукав більш узагальнену відповідь з мови продовжувати
user827992

до компілятора, враховуючи всі мовні особливості, ваша відповідь також дозволяє мені наголосити на моєму початковому пункті щодо наявності компіляторів С на ринку, у Windows я майже весь програмний дім, який виробляє компілятор із власним компілятором, у мене також є інші безкоштовні варіанти, такі як MinGW. Справжня проблема, яку я виявив у програмі C, - це відсутність вбудованої підтримки структур даних, контейнерів, в C ++ ви можете отримати уявлення про те, скільки вам коштує конкретний контейнер або конкретний вислів,
user827992

у C, мабуть, код, який робить те саме, має більше ніж 1 реалізацію, також у C ++ компілятор може оптимізувати більше як наслідок цього. Я, мабуть, повинен вивчити C ++ більше, але я думаю, що я перейду на C ++ лише для гарної підтримки деяких особливостей, а не для самої мови.
user827992

7

Цікаво також зазначити, що програмне забезпечення ID вирішує повністю переписати базу коду для IdTech 4 в C ++, це велика кількість роботи, яку, чесно кажучи, я не можу зрозуміти без дуже хорошого переліку причин.

Їм прийнято переписувати весь двигун для кожного випуску (принаймні, донедавна - я не знаю багато про останні кілька ігор), а оскільки C ++ зростає у популярності, має сенс використовувати це, а не дотримуватися з C. З плином часу все менше і менше людей будуть компетентні на C.

Чому в певний момент часу галузь масово перейшла на C ++?

Тому що він дає вам багато функцій вищого рівня, одночасно майже повністю сумісний із кодом С.

Які причини вибору, який зробив ідентифікатор?

Google відповів би на це за вас: http://fabiensanglard.net/doom3/interviews.php

"... половина програмістів справді мала C ++ фон на початку. У мене був C і Objective-C, і я начебто" ковзав у C ++ ", просто дивлячись на код, який писали хлопці C ++. хотілося б, щоб я запланував бюджет на час, щоб ретельно вивчити та вивчити мову, перш ніж тільки почати її використовувати.

Можливо, ви все ще зможете сказати, що код візуалізації був значною мірою розроблений на C, а потім начебто перетворений на C ++.

Сьогодні я твердо вірю, що C ++ - це правильна мова для великих проектів для багатьох розробників з критичними вимогами до продуктивності, а Tech 5 набагато краще для досвіду Doom 3 ".

Якби я написав свій код на сучасному C ++, я б, мабуть, зараз болів, бо одна з найпопулярніших ОС у світі була б для мене поза межами.

  1. Програмісти не бачать майбутнього. Вони не знають, що з'явиться нова платформа з поганою підтримкою C ++. Android існував належним чином до 2009 року. Doom 3 був з 2004 року.
  2. Як ви вважаєте, програмісти, які пишуть передові 3D-ігри для ПК та консолей, очікують, що їхній код також запуститься на телефони? Прагнення до цього ступеня переносимості дуже рідкісне і часто безглуздо через велику різницю у потужності, що наявна.

Я мушу написати код C ++ з посиланням на версію C ++, яка має 2-3 версії?

Чому ти переймаєшся цим? Не потрапляйте в пастку, переслідуючи найновішу річ. Якби 5 років тому це було досить добре, зараз воно раптом не погіршиться.


3

Що ж, C ++ існує з 80-х років, тому якщо компілятор не підтримує його, можливо, ви повинні використовувати інший компілятор. Крім того, C ++ насправді не набагато повільніше, ніж C. Це насправді лише повільніше, якщо ви завантажуєте його віртуальними функціями та іншими абстракціями. Однак C ++ сьогодні використовується в світі, що не є Unix, завдяки своїй гнучкості та новішим можливостям, яких C не має. Писати модульний код на C ++ набагато простіше, ніж робити це на C та допомагає вам писати більше портативного коду. Повертаючись до теми компіляторів, я не знаю жодного компілятора, який не підтримує C ++ (можливо, не C ++ 11 повністю, але будь-який наполовину пристойний компілятор повинен підтримувати C ++).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.