Почему индустрия перешла с C на C ++? [закрыто]

19

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

Мой вопрос о массовом переходе на C ++, который был более или менее завершен с Doom 3.

Для меня интересно то, что до этого рубежа большинство игровых движков и сами игры были написаны на C, как это было со времен Quake . Также интересно отметить, что программное обеспечение ID решает полностью переписать кодовую базу для IdTech 4 в C ++, огромный объем работы, который, честно говоря, я не могу понять без действительно хорошего списка причин.

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

Почему в определенный момент индустрия массово переключилась на C ++? Каковы причины выбора, который сделал ID?

Последнее, что я хотел бы сказать, - это то, что язык C намного проще в реализации и обеспечивает меньшее количество функций, потому что у него гораздо меньше шансов быть «фрагментированным» по частям, в отличие от того, что C ++ действительно часто делает. Проще говоря, у меня гораздо больше шансов найти действительно хороший компилятор C, а не хороший компилятор C ++ со всеми хорошо реализованными функциями.

Например, NDK для Android до сих пор не имеет хорошей поддержки C ++ (с выпуском r8b) со всеми последними и лучшими функциями, и это родной набор инструментов для самой популярной мобильной ОС в мире!

Если бы я написал свой код на современном C ++, мне, наверное, сейчас было бы больно, потому что одна из самых популярных ОС в мире была бы для меня запрещенной. И, как и Android, многие другие компиляторы не так хороши.

Я должен написать код C ++, ссылаясь на версию C ++, которая 2-3 лет выпуска?

user827992
источник
1
Я подозреваю, что просто C ++ является квази-расширением C. Люди начали писать C с функциями C ++, такими как std :: vector, с тех пор на C ++ вместо C, и поэтому люди начали писать полноценный C ++.
API-Beast
1
Ну, C против C ++ при разработке большого приложения? ООП - отличная парадигма, и .. C ++ поддерживает ее. Если вы собираетесь написать игру на C, подумайте о дизайне, ориентированном на данные . В противном случае, давайте подумаем, почему все основные игроки отрасли используют C ++. Разработка программного обеспечения, будь то для финансовых или развлекательных приложений, лежит в основе парадигмы ООП и архитектурных и дизайнерских паттернов. Проще говоря, C не может предложить общую картину, которую предлагает вам инкапсуляция. Существуют ли какие-либо современные крупные программы, написанные на C? Может быть, ядра и встроенные системы.
Теодрон
@teodron 1) Я должен создать хороший исполняемый файл, я забочусь о языке, как и о важном активе, но это не все, и это не то, что я продаю 2) инкапсуляция не так хороша для производительности, если кто-то хочет убедите меня покинуть мир C ++, инкапсуляция - одна из хороших тем для этого.
user827992
3
« Интересно для меня то, что до этого этапа большинство игровых движков и сами игры были написаны на C, как это было в эпоху Quake ». Я хотел бы увидеть некоторые доказательства этого. Помимо движков с открытым исходным кодом Id-Software. Они не вся индустрия видеоигр.
Николь Болас
@NicolBolas Я объяснял причину, по которой я говорил об ID, пожалуйста, пойми смысл всего вопроса.
user827992

Ответы:

28

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 для достижения цели. Это одно из основных различий между C ++ и Java и C #. В конце концов, есть причина, по которой вы часто видите "C / C ++" вместе.

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

Шон Миддледич
источник
19
«Нет такого компетентного программиста на С ++, который также не является компетентным программистом на Си». Я категорически не согласен с этим утверждением. Идиоматический C очень отличается от идиоматического C ++. Два стиля разошлись, один стиль подчеркивает непрозрачные указатели и статические функции, другой использует языковую инкапсуляцию и так далее. Кто-то, кто знает только идиоматический C ++, будет компетентен в C ++, но все еще довольно смущен идиоматическим C.
Никол Болас
Я не согласен с тем, что вы можете быть компетентным в C ++ и знать только «идиоматический C ++». Жесткие части C ++ - это те же самые жесткие части C (плюс шаблоны). Если программиста на C ++ запутывают автономные функции, простые структуры и необработанные или непрозрачные указатели, он еще не написал ни одного нетривиального кода C ++ ни в одном реальном неакадемическом сценарии. Я бы зашел так далеко, что утверждал, что любой, кто имеет только опыт в «идиоматических» вещах, еще не достиг компетентности.
Шон Мидлдич
3
«Идиоматический» - это еще один способ сказать «удобный», который, помимо относительности, также означает, что существует почти по определению неудобная область языка, в которой компетентный в других отношениях программист C ++ не будет особенно опытным. (Я не обязательно думаю, что это означает, что они «смущены» этими элементами, просто им неудобно или они не владеют ими). ​​И, в некоторой степени, люди, изучающие идиоматический C ++, учатся чувствовать себя некомфортно просто мельком сырой указатель. Поэтому я не думаю, что компетентный программист C ++ подразумевает компетентного программиста C.
Джон Калсбек
Иными словами, определенно существует область C ++ более высокого уровня, на которой вы можете полностью избежать использования любых функций более низкого уровня, которые потребуются для написания любого серьезного кода на C. Я уверен, что большинство неакадемических кодовых баз в реальном мире не остаются полностью в этой области, но я подозреваю, что вы могли бы найти человека, который чувствует себя комфортно только в этой области и по-прежнему называть его «компетентным». Конечно, вы не сравнили бы такого человека с программистом на Си - вы бы сравнили его с кем-то, кто программирует на любом другом языке высокого уровня.
Джон Калсбек
1
@DanielCarlsson: Достаточно справедливо, я просто педантичен. Сожалею. В этом смысле, однако ... C ++ не делает ничего, что делает оптимизацию сложнее, чем C. :) Я имею в виду, конечно, если вы используете STL, то вы ограничены тем, что делает STL, но большая часть почему мы используем C ++ вместо C # или Java, потому что мы можем просто переопределить весь STL или использовать необработанные массивы или даже запустить встроенный ассемблер или расширения языка (например, встроенные функции SSE) и т. д.
Шон Миддледич
12

Почему в определенный момент индустрия массово переключилась на C ++? Каковы причины выбора, который сделал ID?

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 также имеет «новейшие и лучшие функции», которые не поддерживаются повсеместно.

В связи с этим возникает важный момент: если вы хотите, чтобы ваше приложение на чистом C компилировалось в Visual Studio, то оно должно соответствовать C89, и ничего выше этого. Таким образом, фрагментация с C уже существует. Некоторые платформы поддерживают только C89. Некоторая поддержка С99. Некоторые поддерживают C11, в той или иной степени. И т.п.

Если вы хотите использовать C, а затем использовать C . Тот факт, что другие люди не сделали этот выбор, не означает, что ваш выбор неправильный или что их выбор неправильный. Вам не нужно оправдываться перед ними, и они не должны оправдываться перед вами.

Николь Болас
источник
2
Я не думаю, что Google едва терпит, кто использует NDK, потому что продолжается разработка NDK, и есть несколько выпусков, доступных для Android, даже если Google ненавидит C / C ++, я не думаю, что смогу достичь Хороший уровень производительности для моей игры на Java или для самых важных игроков на рынке может переписать свой код только для Java и Android. Вероятно, это необходимое зло для Google, я не знаю, моя цель - спросить о широком и не сомнительный вопрос о C против C ++ против Java против всего мира, я искал более обобщенный ответ из продолжения
user827992
для компилятора, учитывая все языковые возможности, ваш ответ также позволяет мне подчеркнуть мою начальную точку зрения о доступности компиляторов C на рынке, в Windows у меня есть почти все программное обеспечение, которое производит компилятор со своим собственным компилятором, у меня также есть другие бесплатные опции, такие как MinGW. Реальная проблема, которую я обнаружил в C, заключается в отсутствии собственной поддержки структур данных, контейнеров, в C ++ вы можете получить представление о том, сколько вам будет стоить конкретный контейнер или конкретный оператор,
user827992
в C, вероятно, код, который делает то же самое, имеет больше, чем 1 реализацию, также в C ++ компилятор может оптимизировать в результате этого больше. Я, вероятно, должен больше изучать C ++, но я думаю, что переключусь на C ++ только для хорошей поддержки некоторых конкретных функций, а не для самого языка.
user827992
7

Также интересно отметить, что программное обеспечение ID решает полностью переписать кодовую базу для IdTech 4 в C ++, огромный объем работы, который, честно говоря, я не могу понять без действительно хорошего списка причин.

Для них характерно переписывать практически весь движок для каждого выпуска (по крайней мере, до недавнего времени - я не знаю много о последних нескольких играх), и, поскольку популярность C ++ растет, имеет смысл использовать это, а не придерживаться с C. Со временем все меньше и меньше людей будут компетентны с C.

Почему в определенный момент индустрия массово переключилась на C ++?

Потому что он дает вам много функциональных возможностей более высокого уровня, будучи почти полностью обратно совместимым с C-кодом.

Каковы причины выбора, который сделал ID?

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 лет назад, сейчас не стало бы хуже.

Kylotan
источник
3

Что ж, C ++ существует с 80-х годов, поэтому, если компилятор его не поддерживает, возможно, вам следует использовать другой компилятор. Кроме того, C ++ на самом деле не намного медленнее, чем C. Он действительно медленнее, если вы загружаете его виртуальными функциями и другими абстракциями. Тем не менее, C ++ сегодня широко используется в не-Unix-мире из-за своей гибкости и новых функций, которых нет у C. Написание модульного кода на C ++ намного проще, чем на C, и помогает вам писать более переносимый код. Возвращаясь к теме компиляторов, я не знаю ни одного компилятора, который не поддерживает C ++ (может быть, не полностью C ++ 11, но любой наполовину приличный компилятор должен поддерживать C ++).

CobaltHex
источник