Por que o setor mudou de C para C ++? [fechadas]

19

Antes de mais, gostaria de ter uma resposta real, estou sempre tentando obter mais informações de várias fontes e artigos, e quando leio coisas como C ++ é lento porque possui funções virtuais e, por isso, C é melhor , realmente não sei o que dizer e pensar como um ser humano com um cérebro. Portanto, evite atingir esse nível em suas respostas.

Minha pergunta é sobre uma grande mudança para C ++ que foi concluída, mais ou menos, com o Doom 3.

O interessante para mim é que, antes desse marco, a maioria dos mecanismos de jogos e os jogos em si eram escritos em C, exatamente como era desde a era do Quake . Também é interessante notar que o software de ID decide reescrever completamente a base de código do IdTech 4 em C ++, uma quantidade enorme de trabalho que honestamente não consigo entender sem uma lista muito boa de razões.

Estou focado no Doom 3 porque estou interessado principalmente no mundo OpenGL e, em minha jornada, tento me manter focado nesse tópico, por isso leio muito sobre isso, mas acho que uma pergunta como essa pode ser render-API -agnóstico sem muitos problemas.

Por que, em determinado momento, o setor mudou massivamente para C ++? Quais são os motivos da escolha que o ID fez?

A última coisa que eu gostaria de dizer é que a linguagem C é muito mais simples de implementar e fornece um número menor de recursos, porque isso tem muito menos chance de ser "fragmentado" em pedaços, como o C ++ realmente costuma fazer. Em termos mais simples, tenho muito mais chances de encontrar um compilador C realmente bom do que um bom compilador C ++ com todos os recursos implementados de uma maneira boa.

Por exemplo, o NDK para Android ainda não possui um bom suporte a C ++ (com a versão r8b) com todos os recursos melhores e mais recentes, e é o kit de ferramentas nativo para o sistema operacional móvel mais popular do mundo!

Se eu tivesse escrito meu código em um C ++ moderno, provavelmente estaria sofrendo agora porque um dos sistemas operacionais mais populares do mundo estaria fora dos limites para mim. E, como o Android, muitos outros compiladores não são tão bons assim.

Devo escrever código C ++ referindo-se a uma versão C ++ com 2-3 anos de idade?

user827992
fonte
1
Eu suspeito que o C ++ seja uma quase extensão do C. As pessoas começaram a escrever C com recursos do C ++, como std :: vector, a partir daí o C ++ foi ensinado em vez do C e, assim, as pessoas começaram a escrever o C ++ completo.
API-Beast
1
Bem, C vs. C ++ ao desenvolver um aplicativo grande ? OOP é um ótimo paradigma e .. C ++ suporta. Se você vai escrever um jogo em C, considere o design orientado a dados . Caso contrário, vamos refletir sobre por que todos os principais players atuais do setor usam C ++. A engenharia de software, seja para aplicações financeiras ou de lazer, mergulha nos ombros do paradigma OOP e dos padrões de arquitetura e design. Simplificando, C não pode oferecer o panorama geral que o encapsulamento oferece. Existe algum software grande e moderno escrito em C? Talvez kernels e sistemas embarcados.
Teodron
@teodron 1) Eu tenho que produzir um bom executável, me preocupo com a linguagem, como me preocupo com um ativo importante, mas não é tudo e não é o que eu vendo 2) encapsulamento não é bom para o desempenho, se alguém quiser me convencer a deixar o mundo C ++, o encapsulamento é um dos bons tópicos para isso.
user827992
3
" O mais interessante para mim é que, antes desse marco, a maioria dos mecanismos de jogos e os jogos em si eram escritos em C, exatamente como era desde a era do Quake " . Gostaria de ver algumas evidências disso. Além dos mecanismos de código aberto do Id-software. Eles não são toda a indústria de videogames.
Nicol Bolas
@ NicolBolas eu estava explicando a razão pela qual eu estava falando sobre identificação, por favor, entenda o significado de toda a pergunta.
user827992

Respostas:

28

C ++ faz tudo que C faz. Você pode mesclar trivialmente C e C ++ nos casos em que as vantagens do C superam as do C ++. Essa é uma decisão de design muito intencional do C ++.

C ++ faz coisas que C não faz. Isso inclui polimorfismo fácil, mas também geração fácil de código de tempo de compilação por meio de modelos. Isso é realmente útil para coisas como contêineres, que são facilmente a maior fraqueza do C. Também permite tipos do tipo ponteiro definidos pelo usuário (identificadores inteligentes) que economizam muito tempo, bem como tipos primitivos definidos pelo usuário, como vetores e matrizes com suporte do operador (também economizam muito tempo).

As funções virtuais são mais lentas que as funções não virtuais. No entanto, você deve optar por funções virtuais, e um programador competente faz isso apenas quando é benéfico. Os programadores C têm ponteiros de função e geralmente armazenam coleções daqueles em struct referenciados por outras estruturas; em outras palavras, eles passam por um trabalho extra para recriar exatamente a mesma coisa que as tabelas de funções virtuais. Nos casos em que apenas um ponteiro de função é necessário e nenhuma tabela é necessária, o C ++ ainda permite isso e é equivalente a C. Com um compilador moderno, o C ++ é mais lento que C nos casos específicos em que o programador está optando por um recurso. . Além disso, a sobrecarga da função virtual na prática é muito pequena nas CPUs de modem. Atualmente, o hardware é projetado para os padrões de uso do C ++ e é cada vez mais projetado para atender às necessidades de alto nível dos idiomas interpretados.

As exceções do C ++ historicamente impõem muita sobrecarga, tornando o C ++ mais lento, mesmo que você não as esteja usando. Exceções eram uma coisa terrível a acrescentar ao C ++, se por nenhum outro motivo a não ser o imenso aumento na complexidade envolvida na escrita de códigos com exceção de segurança, e de fato alguns designs de contêineres são literalmente impossíveis de tornar a exceção segura. Os programadores de jogos geralmente ignoram a existência de exceções e até as desabilitam no compilador. Compiladores modernos têm exceções de zero sobrecarga (ou seja, você paga apenas o custo por elas quando realmente as usa).

C é mais simples de aprender todas as regras de. C ++ é uma linguagem muito grande e complexa. O C ++ permite escrever código de nível superior, produzindo APIs mais fáceis e simples. Algumas pessoas querem entender o idioma mais facilmente, outras querem escrever código avançado com mais facilidade. É uma troca entre a simplicidade de entender o que o compilador está fazendo com um pedaço de código específico versus a simplicidade de escrever grandes aplicativos interconectados complexos. Algumas pessoas valorizam uma muito mais que a outra, por várias razões.

No final, C ++ é um superconjunto de C. Na minha opinião, não existe um programador C ++ altamente competente que também não seja um programador C aceitável (embora existam muitos programadores de C ++ que caem abaixo da minha barra, ser perdido em C puro). Enquanto o C ++ adiciona facilidades para isolar o programador de grande parte do C, o código C ++ não trivial geralmente precisa usar o C para fazer as coisas. Essa é uma das principais diferenças entre C ++, Java e C #. Há uma razão pela qual você costuma ver "C / C ++" agrupados, afinal.

Minha crença pessoal - que é compartilhada com a maioria dos outros profissionais da indústria de jogos com os quais interagi - é que a expressividade aprimorada e os recursos de programação de alto nível do C ++ superam a maior complexidade da linguagem em relação ao C e a maioria dos outros as reivindicações anti-C ++ feitas estão simplesmente desatualizadas com a tecnologia atual.

Sean Middleditch
fonte
19
"Não existe um programador C ++ competente que também não seja um programador C competente" Eu discordo totalmente desta afirmação. O Idiomatic C é muito diferente do C ++ idiomático. Os dois estilos divergiram, um estilo enfatizando ponteiros opacos e função estática, o outro usando encapsulamento baseado em linguagem e assim por diante. Alguém que só sabe idiomática C ++ seria competente em C ++, mas ainda bastante confuso por C. idiomática
Nicol Bolas
Não concordo que você possa ser competente em C ++ e conhecer apenas "C ++ idiomático". As partes mais difíceis do C ++ são as mesmas partes do C (mais modelos). Se um programador de C ++ fica confuso com funções independentes, estruturas simples e ponteiros brutos ou opacos, ele ainda não escreveu nenhum código C ++ não trivial em nenhum cenário não acadêmico do mundo real. Eu iria tão longe para argumentar que qualquer um que apenas proficiente em "idiomático" nada ainda tem de alcançar competência.
Sean Middleditch
3
"Idiomatic" é outra maneira de dizer "confortável", que - além de relativo - também significa que existe, quase por definição, uma região desconfortável da linguagem na qual um programador C ++ competente de outra forma não será particularmente proficiente. (Eu não acho necessariamente que isso significa que eles estão "confusos" com esses elementos, apenas que se sentem desconfortáveis ​​ou não fluentes com eles.) E, até certo ponto, as pessoas que aprendem C ++ idiomático são ensinadas a se sentir desconfortáveis apenas vislumbrando um ponteiro bruto. Portanto, não acho que um programador C ++ competente implique um programador C competente.
precisa saber é o seguinte
Em outras palavras, existe definitivamente uma região C ++ de nível superior, na qual é possível evitar completamente o uso de qualquer recurso de nível inferior necessário para escrever qualquer código C sério. Tenho certeza de que a maioria das bases de código não acadêmicas do mundo real não fica totalmente dentro desse domínio, mas suspeito que você possa encontrar uma pessoa que só se sinta confortável com esse domínio e ainda chamá-lo de "competente". Obviamente, você não compararia essa pessoa a um programador C - você a compararia a alguém programando em qualquer número de outras linguagens de alto nível.
precisa saber é o seguinte
1
@DanielCarlsson: Justo, estou apenas sendo pedante. Desculpe. Nesse sentido, porém ... O C ++ não faz nada que dificulte as otimizações que C. :) Quero dizer, claro, se você usar o STL, ficará limitado ao que o STL faz, mas uma grande parte do porquê usamos C ++ em vez de C # ou Java é porque nós podemos apenas reimplementar todo o STL ou usar matrizes matérias ou mesmo manivela em inline assembler ou extensões de linguagem (como intrínsecos SSE), etc.
Sean Middleditch
12

Por que, em determinado momento, o setor mudou massivamente para C ++? Quais são os motivos da escolha que o ID fez?

A Id Software não é "a indústria". Eles são uma empresa. Embora possam ser influentes, eles não são todos.

Eu trabalhei em alguns mecanismos de jogos que datam de 1999, e eles usavam C ++.

Os principais motivos para a adoção do C ++ "nessa época" são:

  1. Foi padronizado . O C ++ 98 recebeu esse nome porque foi lançado como um padrão ISO em 1998. Até então, havia vários dialetos do C ++ sem uma ideia clara de que era "real" ou "correto". Uma vez padronizado, e os compiladores começaram a implementar o padrão, os desenvolvedores de jogos puderam confiar no padrão real.

  2. Lembre-se da velha piada: um cara entra no consultório médico e diz: "Dói quando levanto o braço assim". Então o médico diz: "Então não levante o braço assim".

    Se as funções virtuais são lentas para suas necessidades, o C ++ não força você a usá-las. Tudo em C ++ é opcional. Você escolhe usar cada recurso específico. Se você usa código crítico de desempenho e não deseja sobrecarga virtual, não usa funções virtuais. Assim como se você usa código crítico de desempenho em C, não usa ponteiros de função.

    De fato, isso levou muitos jogos de C ++ a não serem C ++ idiomáticos (pelo menos, não C ++ idiomático moderno ), mas apenas "C com classes". E esta é uma maneira perfeitamente funcional de programar C ++. Inferno, apenas poder não precisar digitar typedef structquando você cria um novo tipo é um benefício.

    C ++ é um grande pacote de recursos, e você pode escolher quais deseja.

Por exemplo, o NDK para Android ainda não possui um bom suporte a C ++ (com a versão r8b) com todos os recursos melhores e mais recentes, e é o kit de ferramentas nativo para o sistema operacional móvel mais popular do mundo!

O que você quer dizer? O Google mal tolera pessoas que usam NDK; é claro que eles querem que todos usem Java. A única razão pela qual o NDK existe é porque existem certos desenvolvedores importantes que simplesmente não usarão a plataforma sem ela. Portanto, o NDK existe para atendê-los e suas necessidades de recursos.

Sim, C ++ é uma especificação maior e mais complicada de implementar. O mesmo acontece com Java. Assim como qualquer idioma, exceto C.

Além disso, o que você quer dizer com "todos os recursos melhores e mais recentes"? Se você está falando sobre coisas do C ++ 11, bem, ninguém as implementa completamente ainda. As especificações mal completam um ano. Além disso, também não sei se o NDK suporta C11; sim, C também possui "recursos melhores e mais recentes" que não são suportados em todos os lugares.

O que traz um ponto importante: se você deseja que seu aplicativo pure-C seja compilado no Visual Studio, ele precisa estar em conformidade com o C89, e nada além disso. Portanto, a fragmentação com C já existe. Algumas plataformas suportam apenas C89. Alguns suportam C99. Alguns suportam C11, em graus variados. Etc.

Se você quiser usar C, em seguida, usar C . O fato de outras pessoas não terem feito essa escolha não significa que sua escolha esteja errada ou que a escolha deles esteja errada. Você não precisa se justificar para eles, e eles não precisam se justificar para você.

Nicol Bolas
fonte
2
Eu não acho que o Google mal tolera quem usa o NDK porque o desenvolvimento do NDK está em andamento e há vários lançamentos disponíveis para Android, mesmo que o Google odeie o C / C ++, acho que não consigo um bom nível de desempenho para o meu jogo em Java ou os jogadores mais importantes do mercado podem reescrever seu código apenas para java e Android. Provavelmente é um mal necessário para o Google, não sei, meu objetivo é perguntar sobre uma ampla ver e não uma pergunta lame sobre C vs C ++ vs Java vs o mundo, eu estava à procura de uma resposta mais generalizada da língua continuam
user827992
para o compilador, considerando todos os recursos de linguagem, sua resposta também me permite enfatizar meu ponto inicial sobre a disponibilidade de compiladores C no mercado. No Windows, tenho quase toda a casa de software que produz um compilador com seu próprio compilador. outras opções gratuitas como MinGW. O verdadeiro problema que eu encontrei com o C é a falta de suporte nativo para estruturas de dados, os contêineres, em C ++ você pode ter uma idéia de quanto custa um contêiner em particular ou uma declaração em particular,
#
em C, provavelmente, o código que faz a mesma coisa possui mais do que apenas 1 implementação; também, em C ++, o compilador pode otimizar mais como consequência disso. Eu provavelmente deveria estudar C ++ mais, mas acho que mudarei para C ++ apenas para um bom suporte para alguns recursos específicos, não para a própria linguagem.
user827992
7

Também é interessante notar que o software de ID decide reescrever completamente a base de código do IdTech 4 em C ++, uma quantidade enorme de trabalho que honestamente não consigo entender sem uma lista muito boa de razões.

É comum que eles reescrevam praticamente todo o mecanismo de cada versão (pelo menos até recentemente - não sei muito sobre os últimos jogos), e como o C ++ está crescendo em popularidade, faz sentido usá-lo em vez de colar com C. Com o tempo, menos e menos pessoas serão competentes com C.

Por que, em determinado momento, o setor mudou massivamente para C ++?

Porque oferece muitas funcionalidades de nível superior, sendo quase totalmente compatível com o código C.

Quais são os motivos da escolha que o ID fez?

O Google teria respondido isso para você: http://fabiensanglard.net/doom3/interviews.php

"... metade dos programadores realmente tinha experiência com C ++ no começo. Eu tinha experiência com C e Objective-C, e meio que" entrei em C ++ "apenas olhando o código que os caras de C ++ estavam escrevendo. Em retrospectiva, eu gostaria de ter orçado o tempo para pesquisar e explorar completamente o idioma antes de começar a usá-lo.

Você ainda pode dizer que o código do renderizador foi desenvolvido amplamente em C e, em seguida, apareceu em C ++.

Hoje, acredito firmemente que o C ++ é a linguagem certa para projetos grandes de vários desenvolvedores com requisitos críticos de desempenho, e a Tech 5 é muito melhor para a experiência do Doom 3. "

Se eu tivesse escrito meu código em um C ++ moderno, provavelmente estaria sofrendo agora porque um dos sistemas operacionais mais populares do mundo estaria fora dos limites para mim.

  1. Os programadores não podem ver o futuro. Eles não sabiam que haveria uma nova plataforma com pouco suporte a C ++. O Android não existia corretamente até 2009. Doom 3 era de 2004.
  2. Você acha que os programadores que estão criando jogos 3D de ponta para PCs e consoles esperam que seu código também seja executado em telefones? Apontar para esse grau de portabilidade é muito raro e muitas vezes inútil devido à enorme diferença de energia disponível.

Devo escrever código C ++ referindo-se a uma versão C ++ com 2-3 anos de idade?

Por que você se importa com isso? Não fique preso atrás da coisa mais nova. Se foi bom o suficiente há 5 anos, não terá subitamente piorado agora.

Kylotan
fonte
3

Bem, o C ++ está em funcionamento desde os anos 80, portanto, se um compilador não o suportar, talvez você deva usar um compilador diferente. E também, C ++ não é realmente muito mais lento que C. É realmente mais lento se você o carrega com funções virtuais e outras abstrações. No entanto, o C ++ é muito usado atualmente no mundo não-unix devido à sua flexibilidade e aos recursos mais recentes que o C não possui. Escrever código modular em C ++ é muito mais fácil do que fazê-lo em C e ajuda a escrever um código mais portátil. De volta ao assunto dos compiladores, não conheço nenhum compilador que não suporte C ++ (talvez não C ++ 11 completamente, mas qualquer compilador meio decente deve oferecer suporte a C ++).

CobaltHex
fonte