Todos los idiomas no deben tratar de incorporar todas las características de todos los demás idiomas.
C ++ es esencialmente un ensamblador de macros muy, muy sofisticado. NO es (en un sentido tradicional) un lenguaje de alto nivel como C #, Java, Objective-C, Smalltalk, etc.
Es bueno tener diferentes herramientas para diferentes trabajos. Si solo tenemos martillos, todas las cosas se verán como clavos, etc. Tener lenguajes de script es útil para algunos trabajos, y los lenguajes OO reflexivos (Java, Obj-C, C #) son útiles para otra clase de trabajos, y super los lenguajes básicos eficientes y cercanos a la máquina son útiles para otra clase de trabajos (C ++, C, Assembler).
C ++ hace un trabajo increíble al extender la tecnología Assembler a niveles increíbles de gestión de complejidad y abstracciones para hacer que la programación de tareas más grandes y complejas sea mucho más posible para los seres humanos. Pero no es necesariamente un lenguaje que sea el más adecuado para aquellos que están abordando su problema desde una perspectiva estrictamente de alto nivel (Lisp, Smalltalk, Java, C #). Si necesita un idioma con esas características para implementar mejor una solución a sus problemas, ¡agradezca a aquellos que han creado dichos idiomas para que todos los usemos!
Pero C ++ es para aquellos que, por cualquier razón, necesitan tener una fuerte correlación entre su código y la operación de la máquina subyacente. Ya sea su eficiencia, o la programación de controladores de dispositivos, o la interacción con los servicios del sistema operativo de nivel inferior, o lo que sea, C ++ se adapta mejor a esas tareas.
C #, Java, Objective-C requieren un sistema de tiempo de ejecución mucho más grande y rico para admitir su ejecución. Ese tiempo de ejecución debe entregarse al sistema en cuestión, preinstalado para admitir el funcionamiento de su software. Y esa capa tiene que mantenerse para varios sistemas de destino, personalizada por ALGUNO OTRO IDIOMA para que funcione en esa plataforma. Y esa capa intermedia, esa capa adaptativa entre el sistema operativo host y su código, el tiempo de ejecución, casi siempre se escribe en un lenguaje como C o C ++, donde la eficiencia es el número 1, donde la comprensión predecible de la interacción exacta entre software y hardware puede ser buena. entendido y manipulado para obtener la máxima ganancia.
Me encanta Smalltalk, Objective-C y tener un sistema de tiempo de ejecución rico con reflexión, metadatos, recolección de basura, etc. ¡Se puede escribir un código increíble para aprovechar estas instalaciones! Pero eso es simplemente una capa más alta en la pila, una capa que debe descansar en las capas más bajas, que finalmente deben sentarse sobre el sistema operativo y el hardware. Y siempre necesitaremos un lenguaje que sea más adecuado para construir esa capa: C ++ / C / Assembler.
Anexo: C ++ 11/14 continúa expandiendo la capacidad de C ++ para admitir abstracciones y sistemas de nivel superior. El subprocesamiento, la sincronización, los modelos de memoria precisos, las definiciones de máquina abstracta más precisas están permitiendo a los desarrolladores de C ++ lograr muchas de las abstracciones de alto nivel que algunos de estos lenguajes de alto nivel solían tener dominio exclusivo, mientras continuaban proporcionando rendimiento del metal y excelente previsibilidad (es decir, subsistemas de tiempo de ejecución mínimos). Quizás los recursos de reflexión se habilitarán selectivamente en una futura revisión de C ++, para aquellos que lo deseen, o tal vez una biblioteca proporcionará dichos servicios de tiempo de ejecución (¿tal vez haya uno ahora, o el comienzo de uno en impulso?).