Tendría que estar en desacuerdo con las respuestas hasta ahora.
El principal problema para entender es que un compilador C++ crea código que es adecuado para un entorno muy tonto. Incluso una CPU moderna no sabe acerca de las funciones virtuales, infierno, incluso las funciones son un tramo. A una CPU realmente no le importa que el código de manejo de excepciones para desenrollar la pila esté fuera de cualquier función, por ejemplo. Trato de CPU en secuencias de instrucciones, con saltos y retornos. Las funciones ciertamente no tienen nombres en lo que respecta a la CPU.
Por lo tanto, todo lo que se necesita para respaldar el concepto de una función lo pone el compilador. P.ej. Los vtables son solo arreglos del tamaño correcto, con los valores correctos desde el punto de vista de la CPU. __func__
termina como una secuencia de bytes en la tabla de cadenas, el último de los cuales es 00.
Ahora, no hay nada que diga que el entorno de destino tiene que ser tonto. Definitivamente podría apuntar a la JVM. Una vez más, el compilador tiene que completar lo que no se ofrece de forma nativa. No hay memoria en bruto? A continuación, asigne una matriz de bytes grandes y úsela en su lugar. ¿Sin punteros crudos? Simplemente use índices enteros en esa gran matriz de bytes.
El problema principal es que el programa C++ parece bastante irreconocible del entorno de alojamiento. La JVM no es tonta, conoce las funciones, pero espera que sean miembros de la clase. No espera que tengan <
y >
en su nombre. Puedes eludir esto, pero con lo que terminas es básicamente cambiar de nombre. Y a diferencia de la creación de nombres hoy en día, este tipo de manipulación de nombres no está destinado a enlazadores en C, sino a entornos inteligentes. Por lo tanto, su motor de reflexión puede convencerse de que existe una clase c__plus__plus
con la función de miembro __namespace_std__for_each__arguments_int_pointer_int_pointer_function_address
, y ese sigue siendo un buen ejemplo. No quiero saber qué pasa si tienes un std::map
de cadenas para invertir iteradores.
A la inversa, en realidad, es mucho más fácil. Prácticamente todas las abstracciones de otros idiomas se pueden eliminar en C++. ¿Recolección de basura? Eso ya está permitido en C++ hoy en día, por lo que podría soportarlo incluso para void*
.
Una cosa que aún no he abordado es el rendimiento. ¿Emulando la memoria en bruto en una gran matriz de bytes? Eso no va a ser rápido, especialmente si pones dobles en ellos. Puedes jugar un montón de trucos para hacerlo más rápido, pero ¿a qué precio? Probablemente no va a obtener un producto comercialmente viable. De hecho, es posible que tenga un lenguaje que combine las peores partes de C++ (muchos comportamientos inusuales que dependen de la implementación) con las peores partes de una VM (lenta).
Las plantillas son puramente una construcción en tiempo de compilación. A diferencia de los genéricos, no necesitan ningún soporte en tiempo de ejecución. – Ferruccio