Soy un programador C ++ de nivel principiante, pero entiendo bastante bien los conceptos del lenguaje. Cuando comencé a aprender bibliotecas externas de C ++, como SDL, OpenGL (tal vez algo más también), para mi gran sorpresa, descubrí que no usan conceptos de C ++ en absoluto.
Por ejemplo, ni SDL ni OpenGL usan clases o excepciones, prefiriendo funciones y códigos de error. En OpenGL he visto funciones como glVertex2f, que toma 2 variables flotantes como entrada y probablemente sería mejor como plantilla. Además, estas bibliotecas a veces usan marcos, aunque parece ser un acuerdo común que el uso de macroses es malo.
En general, parecen estar escritos más en estilo C que en estilo C ++. Pero son idiomas incompatibles completamente diferentes, ¿no?
La pregunta es: ¿por qué las bibliotecas modernas no utilizan las ventajas del lenguaje en el que están escritas?
fuente
Respuestas:
Tanto OpenGL como SDL son bibliotecas C y exponen una interfaz C al resto del mundo (ya que casi todos los lenguajes pueden interactuar con C pero no necesariamente con C ++). Por lo tanto, están restringidos a la interfaz de procedimiento que C le brinda y la forma en que C declara y utiliza estructuras de datos.
Más allá del aspecto de "interactuar con otros lenguajes" que le ofrece una interfaz C, C en general tiende a ser un poco más portátil que C ++, lo que a su vez hace que sea más fácil obtener la parte no dependiente de la plataforma del código de las bibliotecas como estos trabajando en otro sistema operativo o arquitectura de hardware. Casi todas las plataformas tienen un compilador de C decente, pero todavía hay algunas que tienen compiladores de C ++ restringidos o que simplemente no son muy buenas.
Si bien C y C ++ son lenguajes muy diferentes, no son "incompatibles", de hecho, en gran medida C ++ es un superconjunto de C. Hay algunas incompatibilidades pero no muchas, por lo que es muy fácil usar una interfaz C de C ++. que hacer.
fuente
float3
s porque todo el hardware está relacionado con las matrices de flotadores. La estructura de "clase" (la noción de que un vector es 2, 3 o 4 flotantes) está implícita en cómo se le dice a la tarjeta que acceda a su montón de memoria. Puede ser bueno tratar de pensar en clases al programar gráficos, pero en mi opinión, ese tipo de trabajo está lo suficientemente cerca del hardware como para que sea más complicado que ayudar a abstraer los detalles sucios de la implementación.Creo que está confundiendo "escribir una biblioteca" frente a "exponer API al exterior". No sé mucho específicamente sobre las bibliotecas que ha mencionado (pueden estar escritas internamente en C), pero sé que muchas otras, incluido yo mismo, han escrito bibliotecas / marcos de C ++ que utilizaron completamente todo tipo de prácticas / patrones de OOP elegantes. , pero aún expuso la API de estilo C al mundo exterior.
En el pasado, como experimento en uno de los proyectos en el trabajo, decidí exponer la interfaz "OO" desde una DLL de C ++. Para ocultar detalles internos y evitar un montón de otras cosas, casi terminé reinventando Windows COM (modelo de objetos componentes). Después de ese proyecto, me di cuenta de que COM no es tan malo como la gente cree que es porque a) expone las interfaces OOP, b) se ocupa de todos los problemas que encontré yc) es lo suficientemente estándar como para ser consumible de una serie de otros idiomas.
Pero COM todavía no está exento de equipaje. En muchos casos, la API regular de estilo C de plan sigue siendo una alternativa mucho mejor.
fuente
Tanto OpenGL como SDL son bibliotecas C, no bibliotecas C ++. Puede usarlos desde C ++, pero están escritos en C y tienen una API C (que también es accesible desde otros lenguajes; es difícil acceder a C ++ a través de un FFI). Eche un vistazo a Boost para una gran variedad de bibliotecas C ++ de propósito general (y algunas especializadas) y SFML para una biblioteca multimedia C ++.
fuente
Hablando específicamente con OpenGL, OpenGL fue originalmente parte de una pila de API: OpenGL proporcionó una API orientada al rendimiento de bajo nivel, accesible desde C (o incluso Fortran), mientras que OpenInventor proporciona una API orientada a objetos de alto nivel, diseñada para ser utilizado desde C ++ y proporcionar tanto una API de gráficos de escena de alto nivel como abstracciones para guardar / leer escenas en / desde archivos e integración de GUI.
OpenGL terminó yendo mucho más lejos que OpenInventor (llenó una necesidad más apremiante, brindando a los fabricantes de hardware de video algo para optimizar y proporcionando una API común de bajo nivel que las personas podrían apuntar en lugar de tratar directamente con el hardware de aceleración 3D). Pero OpenInventor todavía está disponible, y hay una buena implementación de código abierto, Coin3D, con soporte para Unix / X11, Windows y MacOS X / Cocoa.
fuente
Esas bibliotecas no son remotamente modernas en absoluto. Son API C, y malas en eso. Tu premisa es defectuosa.
fuente