¿Por qué las bibliotecas modernas no usan OOP?

20

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?

Saage
fuente
1
Creo que Timo respondió bien a tu pregunta. Otras razones (para otras bibliotecas) podrían ser una biblioteca creada en C y luego portada. O los desarrolladores de C lo escribieron.
Jeanne Boyarsky
55
Aparte de eso, ni OpenGL ni son "modernos" en el sentido de que son jóvenes, o al menos capaces de adoptar nuevas facciones elegantes. Ambos tienen una larga historia (OpenGL 1.1: 1997; SDL: 1998) y restricciones de compatibilidad con versiones anteriores.
1
Solo así se dice: DirectX es mucho más objetivo (aunque también es un poco más de bajo nivel).
cHao
1
Las bibliotecas nativas de C ++, como stl y Boost, tampoco usan los conceptos OOP malos, obsoletos e inútiles.
SK-logic
55
Creo que su idea errónea aquí es que SDL y OpenGL son representativos de muchas "bibliotecas modernas". La muy popular biblioteca Qt, por ejemplo, está totalmente orientada a objetos. El título de su pregunta debería ser "¿Por qué SDL y OpenGL no usan OOP"?
Doc Brown

Respuestas:

31

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.

Timo Geusch
fuente
Oh ya veo. Bueno, la siguiente pregunta es: ¿hay, por ejemplo, una biblioteca de gráficos para C ++ tan efectiva como OpenGL? ¿O tal vez un contenedor sobre OpenGL que utiliza todas las ventajas de C ++ y proporciona una buena gestión de los recursos? Las API se verían mucho más limpias, y no creo que la sobrecarga de memoria / CPU sea demasiado alta.
Saage
¿Efectivo o eficiente? De cualquier manera, debería ser bastante fácil encontrar un contenedor de C ++ para SDL u OpenGL. Un rápido Google trajo este contenedor para OpenGL: oglplus.org : no tengo idea de lo bueno que es, no lo he usado.
Timo Geusch
1
Sí, hay bastantes proyectos que intentan envolver OpenGL con más interfaces C ++ ish (incluso tengo uno yo mismo, aunque me abstengo de muchas características y sobre todo agrego sobrecarga y tal). Mi impresión es que la mayoría agrega mucho equipaje, lo que hace que sea más difícil traducir fragmentos de OpenGL puros y más difícil aplicar optimizaciones estándar (busque Diseño orientado a datos; algunos desarrolladores de juegos lo juran). Pero, por supuesto, no dejes que eso te detenga. Alternativamente, puede tener más suerte usando un motor de juego completo (como Irrlicht u Ogre) en lugar de solo una API de gráficos básica.
Muy bien, creo que tengo todas las respuestas que estaba buscando. ¡Gracias a todos!
Saage
También se debe tener en cuenta que el hardware de gráficos no comprende ni realiza cálculos en las clases. Tienes float3s 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.
David Cowden
10

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.

  1. C y C ++ no son sistemas completamente diferentes. C ++ se creó sobre C y a) puede consumir fácilmente el código C yb) es totalmente capaz de proporcionar apis de estilo C.
  2. La ventaja de la interfaz C es que es fácilmente consumible por el resto del mundo. Hay capas de interoperabilidad que permiten que se consuma C API desde casi cualquier lenguaje (python, java, c #, php ...), donde la interfaz C ++ es consumible desde ... bueno, tal vez C ++ y aún no siempre ( diferentes compiladores, diferentes versiones del mismo compilador causarán problemas)

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.

DXM
fuente
7

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
3

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.

jimwise
fuente
-2

Esas bibliotecas no son remotamente modernas en absoluto. Son API C, y malas en eso. Tu premisa es defectuosa.

DeadMG
fuente
¿Cómo es que OpenGL no es moderno?
James
1
De hecho, tendría que estar de acuerdo con esto. OpenGL no es moderno en el sentido de que su modelo para acceder y manipular el estado que administra se basa en hardware de principios de la década de 1990. Tener que hacer cosas como unir una textura a un objetivo en particular en una unidad en particular, y solo tener un número limitado de esos disponibles independientemente de cuántas texturas tenga en VRAM no es muy moderno.
user1118321