Sin utilizar una máquina virtual siempre se encuentra con el mismo problema: muchas características que puede utilizar en un sistema operativo son específicas para ese sistema operativo.
Esto porque nunca a nadie le importó seriamente definir solo una manera de hacer las mismas cosas, principalmente porque tener DirectX10, por ejemplo, es una ventaja sobre otros sistemas operativos.
Diría que es bastante fácil escribir una aplicación multiplataforma capaz de ejecutarse en MacosX y Linux solo porque puede aprovechar muchas cosas que pueden ejecutarse en ambas máquinas (piense en X11 o GTK) y ambos tienen Unix bajo el capó. Por lo general, con un poco de esfuerzo puede lograr que sus programas funcionen también bajo Windows (tal vez con MinGW o Cygwin) también si falta la compatibilidad de algunas características.
Además, los diferentes sistemas operativos tienen implementaciones efectivamente diferentes para las mismas cosas (piense en sockets, sistema, gráficos, audio, etc.) por lo que es imposible escribir solo una versión que funcione en todas partes: se le obliga a escribir versión diferente para cualquier sistema operativo para el que planea lanzar su programa.
La respuesta breve es: no, no se puede hacer sin un lenguaje VM a menos que restrinja las capacidades de su programa a un conjunto pequeño de funciones comunes.
(estoy asumiendo que estamos hablando de C/C++ sólo porque por lo general otros idiomas son manejados por un solo grupo de personas cada uno, que se encarga sobre la liberación de él tanto multiplataforma como sea posible)
I realmente no veo ningún punto realmente malo al confiar en una máquina virtual. La computadora hoy en día puede ejecutar máquinas virtuales sin grandes problemas de velocidad. Luego, tener algo que le importe al colocar una capa de abstracción entre usted y el sistema operativo le permitirá hacer cosas avanzadas simplemente conociendo una forma de hacerlo ... Creo que una compensación de velocidad de algo como Java es ampliamente aceptable ... simplemente lo hicieron qué tendrías que hacer cuando intentes escribir una aplicación multiplataforma compleja.
Solo un hecho: realmente me dolió cuando traté de portar una máquina virtual que escribí desde Unix (Linux/OSX) a Windows debido a la función freopen
... desafortunadamente Windows maneja las transmisiones de una manera diferente en comparación con otros sistemas operativos MinGW carecía de esa función y tuve que encontrar una forma de evitar ese problema.
¿Cómo se define multiplataforma? Por ejemplo, los programas ANSI C se pueden compilar en muchas plataformas. –
¿Qué tipo de características necesita su programa? ¿Qué plataformas quieres apoyar? Si confía en las características especificadas en POSIX, su programa será portátil para muchos equipos, pero puede no compilarse en Windows; al menos, probablemente no lo haga a menos que dependa del subconjunto de POSIX que admite Windows. Otra forma de hacer que su programa sea portátil es confiar en una capa de abstracción que se encargue de las cosas específicas de la plataforma, como la red de Qt y las funciones de subprocesos. El problema con este enfoque es que su programa, en el mejor de los casos, será portátil para los sistemas admitidos por su capa de abstracción. – George
Por ejemplo, un programa que usa un socket. Tiene diferentes implementaciones en Linux o Windows. – rigon