¿Por qué la industria ha cambiado de C a C ++? [cerrado]

19

En primer lugar, me gustaría tener una respuesta real, siempre estoy tratando de obtener más de varias fuentes y artículos, y cuando leo cosas como C ++ es lento porque tiene funciones virtuales y debido a esto C es mejor , realmente No sé qué decir y pensar como un ser humano con cerebro. Por lo tanto, evite alcanzar este nivel en sus respuestas.

Mi pregunta es sobre un cambio masivo a C ++ que se completó, más o menos, con Doom 3.

Lo interesante para mí es que antes de este hito, la mayoría de los motores de juego y los juegos en sí estaban escritos en C, al igual que desde la era Quake . También es interesante notar que el software de identificación decide reescribir completamente la base de código para IdTech 4 en C ++, una gran cantidad de trabajo que honestamente no puedo entender sin una lista realmente buena de razones.

Me estoy centrando en Doom 3 porque estoy principalmente interesado en el mundo OpenGL y en mi viaje trato de mantenerme enfocado en este tema, así que leí mucho sobre esto, pero creo que una pregunta como esa puede ser render-API -gnóstico sin demasiados problemas.

¿Por qué en cierto momento la industria cambió masivamente a C ++? ¿Cuáles son los motivos de la elección que hizo esa identificación?

Lo último que me gustaría decir es que el lenguaje C es mucho más simple de implementar y proporciona una menor cantidad de características, debido a esto tiene muchas menos posibilidades de ser "fragmentado" en partes, a diferencia de lo que realmente hace C ++. En términos más simples, tengo muchas más posibilidades de encontrar un compilador de C realmente bueno en lugar de un buen compilador de C ++ con todas las características implementadas de una buena manera.

Por ejemplo, el NDK para Android todavía no tiene un buen soporte de C ++ (con la versión r8b) con todas las características más recientes y excelentes, ¡y es el kit de herramientas nativo para el sistema operativo móvil más popular del mundo!

Si hubiera escrito mi código en un C ++ moderno, probablemente me dolería ahora porque uno de los sistemas operativos más populares del mundo estaría fuera de mi alcance. Y como Android, muchos otros compiladores no son tan buenos.

¿Debo escribir código C ++ que se refiera a una versión C ++ que tenga una versión 2-3?

usuario827992
fuente
1
Sospecho que es solo que C ++ es una extensión cuasi de C. La gente comenzó a escribir C con características de C ++ como std :: vector, a partir de ahí se enseñó C ++ en lugar de C y, por lo tanto, la gente comenzó a escribir C ++ completo.
API-Beast
1
Bueno, ¿C vs. C ++ al desarrollar una aplicación grande ? OOP es un gran paradigma y ... C ++ lo admite. Si vas a escribir un juego en C, entonces considera el diseño orientado a datos . De lo contrario, reflexionemos sobre por qué todos los principales actores actuales de la industria usan C ++. La ingeniería de software, ya sea para aplicaciones financieras o de ocio, profundiza en el paradigma OOP y en el de los patrones arquitectónicos y de diseño. En pocas palabras, C no puede ofrecer el panorama general que le ofrece la encapsulación. ¿Hay algún gran software moderno escrito en C? Quizás kernels y sistemas embebidos.
teodron
@teodron 1) Tengo que producir un buen ejecutable, me importa el lenguaje como si me importara un activo importante, pero no es todo y no es lo que vendo 2) la encapsulación no es tan buena para el rendimiento, si alguien quiere convencerme de dejar el mundo C ++, la encapsulación es uno de los mejores temas para esto.
user827992
3
" Lo interesante para mí es que antes de este hito, la mayoría de los motores de juego y los juegos en sí estaban escritos en C, al igual que desde la era Quake " . Me gustaría ver alguna evidencia de eso. Además de los motores de código abierto de Id-software. No son toda la industria de los videojuegos.
Nicol Bolas
@NicolBolas Estaba explicando la razón por la que estaba hablando de ID, por favor, entienda el significado de toda la pregunta.
user827992

Respuestas:

28

C ++ hace todo lo que C hace. Puede mezclar trivialmente C y C ++ en los casos en que las ventajas de C superan a las de C ++. Esta es una decisión de diseño muy intencional de C ++.

C ++ hace cosas que C no hace. Esto incluye un polimorfismo fácil, pero también una generación fácil de código de tiempo de compilación a través de plantillas. Esto es realmente útil para cosas como los contenedores, que son fácilmente la mayor debilidad de C. También permite tipos similares a punteros definidos por el usuario (asas inteligentes) que ahorran mucho tiempo, así como tipos primitivos definidos por el usuario, como vectores y matrices con soporte del operador (también ahorra mucho tiempo).

Las funciones virtuales son más lentas que las no virtuales. Sin embargo, debe optar por las funciones virtuales, y un programador competente lo hace solo cuando son beneficiosas. Los programadores de C tienen punteros de función y a menudo almacenan colecciones de aquellos en estructuras a las que hacen referencia otras estructuras; en otras palabras, realizan un trabajo adicional para recrear exactamente lo mismo que las tablas de funciones virtuales. En los casos en que solo se necesita un puntero de función y no se requiere una tabla, C ++ todavía lo permite completamente y es equivalente a C. Con un compilador moderno, C ++ es solo más lento que C en los casos específicos en que el programador está optando por una función . Además, la sobrecarga de la función virtual en la práctica es muy pequeña en las CPU de módem. El hardware actual está diseñado para los patrones de uso de C ++, y está cada vez más diseñado para las necesidades de idiomas interpretados de alto nivel.

Las excepciones de C ++ históricamente imponen una gran sobrecarga, haciendo que C ++ sea más lento incluso si no las está utilizando. Las excepciones fueron algo terrible para agregar a C ++, si no por otra razón que el inmenso aumento en la complejidad involucrada en la escritura de código seguro de excepción, y de hecho, algunos diseños de contenedores son literalmente imposibles de hacer que la excepción sea segura. Los programadores de juegos a menudo ignoran la existencia de excepciones e incluso las deshabilitan en el compilador. Los compiladores modernos tienen excepciones de gastos generales cero (es decir, solo paga el costo cuando realmente los usa).

C es más simple de aprender todas las reglas de. C ++ es un lenguaje muy grande y complejo. C ++ permite escribir código de nivel superior, produciendo API más fáciles y simples. Algunas personas quieren entender el idioma más fácilmente, algunas personas quieren escribir código avanzado más fácilmente. Es una compensación entre la simplicidad de comprender lo que el compilador está haciendo con un código específico frente a la simplicidad de escribir grandes aplicaciones complejas interconectadas. Algunas personas valoran una mucho más que la otra, por varias razones.

Al final, C ++ es un superconjunto de C. En mi opinión, no existe un programador de C ++ altamente competente que no sea también un programador de C pasable (aunque hay muchos programadores de C ++ que caen por debajo de mi barra que lo harían). perderse en puro C). Si bien C ++ agrega funciones para aislar al programador de gran parte de C, el código C ++ no trivial a menudo necesita usar C para hacer las cosas. Esta es una de las principales diferencias entre C ++ y Java y C #. Hay una razón por la que a menudo ves "C / C ++" agrupados, después de todo.

Mi creencia personal, que se comparte con la mayoría de los otros profesionales de la industria de los juegos con los que he interactuado, es que la mayor expresividad y las instalaciones de programación de alto nivel de C ++ superan la mayor complejidad del lenguaje sobre C, y la mayoría de los otros frecuentes Las afirmaciones anti-C ++ realizadas simplemente están desactualizadas con la tecnología actual.

Sean Middleditch
fuente
19
"No existe un programador de C ++ competente que no sea también un programador de C competente". Estoy totalmente en desacuerdo con esta afirmación. Idiomatic C es muy diferente de Idiomatic C ++. Los dos estilos han divergido, uno enfatiza los punteros opacos y la función estática, el otro utiliza la encapsulación basada en el lenguaje, etc. Alguien que solo conoce C ++ idiomático sería competente en C ++, pero aún confundido por C idiomático.
Nicol Bolas
No estoy de acuerdo en que pueda ser competente en C ++ y solo conocer "C ++ idiomático". Las partes duras de C ++ son las mismas partes duras de C (más plantillas). Si un programador de C ++ se confunde con funciones independientes, estructuras simples y punteros sin formato u opacos, todavía no ha escrito ningún código de C ++ no trivial en ningún escenario no académico del mundo real. Me gustaría ir tan lejos como para argumentar que cualquier persona que sólo es competente en "idiomática" nada todavía tiene que lograr la competencia.
Sean Middleditch
3
"Idiomático" es otra forma de decir "cómodo" que, además de ser relativo, también significa que hay, casi por definición, una región incómoda del lenguaje en la que un programador de C ++ competente no sería particularmente competente. (No creo necesariamente que eso signifique que están "confundidos" por esos elementos, simplemente que se sienten incómodos con ellos o no los dominan). Y, hasta cierto punto, a las personas que aprenden C ++ idiomática se les enseña a sentirse incómodos con ellos. simplemente vislumbrando un puntero en bruto. Por lo tanto, no creo que un programador de C ++ competente implique un programador de C competente.
John Calsbeek
Dicho de otra manera, definitivamente hay un reino C ++ de nivel superior en el que puedes evitar por completo el uso de cualquier característica de nivel inferior que se requeriría para escribir cualquier código C serio. Estoy seguro de que la mayoría de las bases de código no académicas del mundo real no se quedan completamente dentro de este reino, pero sospecho que podrías encontrar a una persona que solo se sienta cómoda con este reino y aún así llamarla "competente". Por supuesto, no compararías a esa persona con un programador en C, sino que la compararías con alguien que programe en cualquier cantidad de otros lenguajes de alto nivel.
John Calsbeek
1
@DanielCarlsson: Bastante justo, solo estoy siendo pedante. Lo siento. En ese sentido, sin embargo ... C ++ no hace nada que haga que las optimizaciones sean más difíciles que C. :) Quiero decir, claro, si usas el STL, entonces estás limitado a lo que hace el STL, pero una gran parte de por qué usamos C ++ en lugar de C # o Java es porque simplemente podemos reimplementar todo el STL o usar matrices sin formato o incluso arrancar en ensamblador en línea o extensiones de lenguaje (como intrínsecos SSE), etc.
Sean Middleditch
12

¿Por qué en cierto momento la industria cambió masivamente a C ++? ¿Cuáles son los motivos de la elección que hizo esa identificación?

Id Software no es "la industria". Son una sola compañía. Si bien pueden ser influyentes, no son todos.

He trabajado en un par de motores de juegos que datan de 1999, y usaron C ++.

Las razones principales para la adopción de C ++ "en ese momento" son:

  1. Fue estandarizado . C ++ 98 se llama así porque fue lanzado como un estándar ISO en 1998. Hasta entonces, había múltiples dialectos de C ++ sin una idea clara de cuál era "real" o "correcto". Una vez que se estandarizó, y los compiladores comenzaron a implementar el estándar, los desarrolladores de juegos podían confiar en el estándar real.

  2. Recuerde el viejo chiste: un tipo entra en el consultorio de un médico y dice: "Me duele cuando levanto el brazo así". Entonces el médico dice: "Así que no levantes el brazo así".

    Si las funciones virtuales son lentas para sus necesidades, C ++ no lo obliga a usarlas. Todo en C ++ es opcional. Usted elige usar cada característica particular. Si tiene un código de rendimiento crítico y no desea una sobrecarga virtual, no use funciones virtuales. Al igual que si está en código de rendimiento crítico en C, no utiliza punteros de función.

    De hecho, esto llevó a que muchos juegos de C ++ no fueran C ++ idiomáticos (al menos, no C ++ idiomáticos modernos ), sino simplemente "C con clases". Y esta es una forma perfectamente funcional de programar C ++. Demonios, solo poder no tener que escribir typedef structcuando creas un nuevo tipo es un beneficio.

    C ++ es una gran bolsa de características, y puedes elegir cuáles quieres.

Por ejemplo, el NDK para Android todavía no tiene un buen soporte de C ++ (con la versión r8b) con todas las características más recientes y excelentes, ¡y es el kit de herramientas nativo para el sistema operativo móvil más popular del mundo!

¿Tu punto es? Google apenas tolera a las personas que usan NDK; Está claro que quieren que todos usen Java. La única razón por la que existe NDK es porque hay ciertos desarrolladores importantes que simplemente no usarán la plataforma sin ella. Por lo tanto, NDK existe para atenderlos y sus necesidades de características.

Sí, C ++ es una especificación más grande y complicada de implementar. Así es Java. Así es cualquier idioma, excepto C.

Además, ¿a qué te refieres con "todas las últimas y mejores características"? Si estás hablando de cosas de C ++ 11, bueno, nadie lo implementa completamente todavía. La especificación apenas tiene un año. Además, tampoco sé si NDK admite C11; sí, C también tiene "las mejores y más recientes funciones" que no son compatibles en todas partes.

Lo que trae a colación un punto importante: si desea que su aplicación Pure-C se compile en Visual Studio, entonces debe ajustarse a C89, y nada más que eso. Entonces la fragmentación con C ya existe. Algunas plataformas solo admiten C89. Algunos admiten C99. Algunos admiten C11, en diversos grados. Etc.

Si desea utilizar C, a continuación, utilizar C . El hecho de que otras personas no hayan hecho esa elección no significa que su elección sea incorrecta o que su elección sea incorrecta. No necesitas justificarte ante ellos, y ellos no necesitan justificarse ante ti.

Nicol Bolas
fuente
2
No creo que Google apenas tolere quién usa el NDK porque el desarrollo del NDK está en curso y hay varias versiones disponibles para Android, incluso si Google odia el C / C ++, no creo que pueda lograrlo un buen nivel de rendimiento para mi juego en Java o los jugadores más importantes del mercado pueden reescribir su código solo para Java y Android. Probablemente sea un mal necesario para Google, no sé, mi punto es preguntar acerca de un amplio ver y no una pregunta sobre cojos C vs C ++ Java vs vs el mundo, yo estaba buscando una respuesta más generalizada de la lengua continúo
user827992
para el compilador considerando todas las características del lenguaje, su respuesta también me permite enfatizar mi punto inicial sobre la disponibilidad de compiladores C en el mercado, en Windows tengo casi todo el software que produce un compilador con su propio compilador, también tengo Otras opciones gratuitas como MinGW. El verdadero problema que encontré con el C es la falta de soporte nativo para las estructuras de datos, los contenedores, en C ++ puede tener una idea de cuánto le cuesta un contenedor en particular o una declaración particular,
user827992
en C probablemente el código que hace lo mismo tiene más de una implementación, también en C ++ el compilador puede optimizar más como consecuencia de esto. Probablemente debería estudiar C ++ más, pero creo que cambiaré a C ++ solo para un buen soporte para algunas características particulares, no para el lenguaje en sí.
user827992
7

También es interesante notar que el software de identificación decide reescribir completamente la base de código para IdTech 4 en C ++, una gran cantidad de trabajo que honestamente no puedo entender sin una lista realmente buena de razones.

Ha sido común que reescriban prácticamente todo el motor para cada lanzamiento (al menos hasta hace poco, no sé mucho sobre los últimos juegos), y dado que C ++ está creciendo en popularidad, tiene sentido usar eso en lugar de pegarse con C. Con el tiempo, cada vez menos personas serán competentes con C.

¿Por qué en cierto momento la industria cambió masivamente a C ++?

Porque le brinda una gran cantidad de funcionalidades de alto nivel y es casi totalmente compatible con el código C.

¿Cuáles son los motivos de la elección que hizo esa identificación?

Google habría respondido esto por usted: http://fabiensanglard.net/doom3/interviews.php

"... la mitad de los programadores realmente tenían antecedentes de C ++ al principio. Tenía antecedentes de C y Objective-C, y me" deslice en C ++ "simplemente mirando el código que escribían los chicos de C ++. En retrospectiva, yo Ojalá hubiera presupuestado el tiempo para investigar y explorar a fondo el lenguaje antes de comenzar a usarlo.

Es posible que aún pueda darse cuenta de que el código de renderizador se desarrolló en gran medida en C, y luego se desarrolló en C ++.

Hoy, creo firmemente que C ++ es el lenguaje adecuado para proyectos grandes de múltiples desarrolladores con requisitos críticos de rendimiento, y Tech 5 está mucho mejor para la experiencia de Doom 3 ".

Si hubiera escrito mi código en un C ++ moderno, probablemente me dolería ahora porque uno de los sistemas operativos más populares del mundo estaría fuera de mi alcance.

  1. Los programadores no pueden ver el futuro. No sabrían que habría una nueva plataforma con poca compatibilidad con C ++. Android no existía correctamente hasta 2009. Doom 3 era de 2004.
  2. ¿Crees que los programadores que escriben juegos 3D de vanguardia para PC y consolas esperan que su código también se ejecute en los teléfonos? Apuntar a ese grado de portabilidad es muy raro y, a menudo, no tiene sentido debido a la gran diferencia de potencia disponible.

¿Debo escribir código C ++ que se refiera a una versión C ++ que tenga una versión 2-3?

¿Por qué te importa esto? No te quedes atrapado persiguiendo lo más nuevo. Si fue lo suficientemente bueno hace 5 años, no habrá empeorado de repente ahora.

Kylotan
fuente
3

Bueno, C ++ ha estado fuera desde los años 80, por lo que si un compilador no lo admite, tal vez debería usar un compilador diferente. Y también, C ++ no es realmente mucho más lento que C. Realmente es más lento si lo carga con funciones virtuales y otras abstracciones. Sin embargo, C ++ se usa mucho hoy en día en el mundo no Unix debido a su flexibilidad y nuevas características que C no tiene. Escribir código modular en C ++ es mucho más fácil que hacerlo en C y le ayuda a escribir más código portátil. Volviendo al tema de los compiladores, no conozco ningún compilador que no admita C ++ (tal vez no C ++ 11 por completo, pero cualquier compilador medio decente debería admitir C ++).

CobaltHex
fuente