Java es a menudo elogiado por su increíble portabilidad, que supongo que se debe a la JVM. Mi pregunta es qué impide que C se compile / interprete / JITE ..., si es así, C también se puede escribir una vez y hacer que funcione en cualquier dispositivo que tenga. pero este no es un mecanismo popular para procesar un programa en C.
¿Cuáles son las desventajas de procesar C de esta manera, y también cuáles son las ventajas de procesar Java de esta manera y no compilar en código máquina, aparte de la portabilidad, por supuesto?
Respuestas:
C es lo que yo llamaría un lenguaje de nivel medio. Su propósito es servir como un "ensamblador de muy alto nivel", por lo que funciona tan bien como un compilador de destino, y por qué abarca tan bien la portabilidad.
Históricamente, los intérpretes se han utilizado típicamente con lenguajes de alto nivel, en el contexto de llamadas a métodos. En su forma más simple, un intérprete simplemente analiza cada palabra clave en el idioma fuente junto con sus tokens asociados, y los convierte en llamadas a métodos y parámetros. En la práctica, lo que hacen la mayoría de los intérpretes es convertir el lenguaje fuente en alguna representación intermedia, y es esa representación la que se interpreta.
¿Qué impide que C sea interpretado o sacudido? Nada. Pero esa no es la razón de ser de C.
fuente
En primer lugar, vale la pena señalar que JVM de Sun fue escrito en C. C es un lenguaje muy popular cuando se necesita portabilidad.
El lenguaje C es portátil a pesar de que muchos programas C no lo son. Esto se debe a que C no impone tantas restricciones al programador ni hace tantas suposiciones. Si un programador C quiere que sus programas sean portátiles, debe imponerse esas restricciones.
En la práctica, eso realmente no es mucho más difícil que vivir con las restricciones que Java te impone. Es principalmente una cuestión de ser consciente de su endianness y tamaños primitivos, y usar bibliotecas portátiles como GTK + en lugar de bibliotecas específicas de la plataforma.
Podría hacer un compilador de GTK + y C que admitiera una máquina virtual, incluso probablemente la JVM, y obtener el código existente para trabajar con muy pocos cambios. De hecho, sin la recolección de basura, una máquina virtual en C probablemente sería mucho más simple. ¿Pero por qué querrías hacerlo?
Lo contrario, compilar Java en código nativo, también es factible. Eso es básicamente lo que hace el JIT. ¿Pero por qué querrías hacerlo? Estoy seguro de que hay proyectos favoritos para hacerlo "solo porque", pero no están en uso serio.
fuente
Tu dijiste:
Y allí, dentro de la primera oración, estás equivocado. Java no es portátil debido a la JVM. Java es portátil, porque el lenguaje Java se define de una manera que no deja al implementador ningún margen de maniobra sobre cómo puede comportarse un programa.
Como ejemplo, Java tiene dos tipos "int" (entero de 32 bits con signo) y "largo" (entero de 64 bits con signo). C y C ++ tienen "int" (firmado al menos 16 bits), "largo" (firmado al menos 32 bits) y "largo largo" (firmado al menos 64 bits). Esto se debe a que se supone que C se ejecuta en muchos procesadores diferentes y les permite comportarse de manera diferente.
C podría haber definido tamaños fijos para estos tipos. Si lo hubiera hecho, los procesadores de 36 bits no podrían haber implementado el lenguaje C. ¡Y de hecho no pueden implementar Java! Entonces, C permitió que el lenguaje funcionara con una variedad de computadoras diferentes. Es inevitable que esto permita la creación de código que no sea portátil. Es una cuestión de idioma.
fuente
Java es altamente portátil específicamente porque el lenguaje se dirige a la Máquina Virtual Java, que, como su nombre lo indica, no es una máquina real . Como puede implementar una máquina virtual en la arquitectura de muchos tipos diferentes de máquinas reales, un programa basado en JVM es altamente portátil.
C, por otro lado, está específicamente diseñado para ejecutarse contra hardware real, porque fue creado con el propósito específico de implementar un sistema operativo, que necesita acceso completo al hardware. Esto significa que el código C no es particularmente portátil por diseño , y al portar un programa C de una plataforma a otra, varias partes que son específicas de la arquitectura de destino deberán reescribirse en un grado u otro.
fuente
En realidad, hay versiones interpretadas de C , pero en su mayoría están destinadas a ser utilizadas para la experimentación rápida en lugar del sistema de producción.
No son comunes, porque después de todo, ¿por qué sufrirías todas las idiosincrasias de C si no es para obtener un ejecutable pequeño, rápido y estático?
fuente
Teóricamente, tanto C como Java pueden compilarse en código nativo, interpretarse o compilarse en una máquina virtual.
La razón técnica de que C no se compila en una máquina virtual es que simplemente no hay una máquina virtual C estándar .
Y nadie parece querer definir una máquina virtual en C, o incluso compilar en la máquina virtual Java (que es perfectamente posible). Probablemente porque nadie que usa C quiere perder su velocidad inigualable. Probablemente también porque C es más fuerte en la comunidad de código abierto que puede realizar fácilmente la portabilidad mediante compilación (distribuir y recompilar la fuente y ejecutar), por lo que no sienten la necesidad de la portabilidad de ejecución (distribuir y ejecutar un binario) como cerrado desarrollador de origen hacer.
fuente
En realidad, esto está hecho. Hay compiladores importantes que admiten la compilación de LLVM (sé que clang lo hace, y creo que gcc también). Ese LLVM puede ser JIT'd tal como el código Java se compila en bytecode que es JIT'd.
Sin embargo, lo que hace que Java sea "multiplataforma" en comparación con C es que Java tiene una gran biblioteca de tiempo de ejecución que se ha portado a muchas plataformas. C explícitamente no sigue este paradigma.
fuente
Hay algunas diferencias importantes entre Java y C. Java está aislado del sistema operativo a través de la máquina virtual Java (JVM). La JVM abstrae el sistema operativo del programa. Una aplicación de Java puede pedirle a la JVM un trozo de memoria, y la JVM le pide al sistema operativo esa memoria. Hay muchas JVM para diferentes plataformas / sistemas operativos. El JVM es lo que permite que el mismo programa Java se ejecute en diferentes plataformas.
Con C, no hay aislamiento del sistema operativo. Los programas C (generalmente) se ejecutan directamente sobre el sistema operativo, haciendo llamadas directas al sistema operativo. Esto vincula ese programa C a un sistema operativo / plataforma específico. Cualquier programa no trivial hará llamadas al sistema operativo. Además, los programas C se compilan en código máquina, que es específico del hardware. Un programa C compilado para x86 no se puede ejecutar directamente en un procesador ARM.
fuente