Me confundo cuando la gente trata de hacer una distinción entre idiomas compilados e idiomas administrados. Por experiencia, entiendo que la mayoría considera que los lenguajes compilados son C, C ++, mientras que los lenguajes administrados son Java, C # (obviamente, hay más, pero estos son solo algunos ejemplos). Pero, ¿cuál es exactamente la diferencia central entre los dos tipos de idiomas?
Según tengo entendido, cualquier programa, independientemente del idioma que utilice, se "compila" esencialmente en un código de máquina de bajo nivel que luego se interpreta, así que eso hace que los idiomas administrados sean un subconjunto de idiomas compilados (es decir, todos los idiomas administrados son idiomas compilados pero no al revés)?
Respuestas:
La diferencia no está en "compilado" vs. "administrado", estos son dos ejes ortogonales. Por "administrado" normalmente se refieren a la presencia de una administración de memoria recolectada de basura y / o la presencia de una infraestructura de máquina virtual. Ambos no tienen absolutamente nada que ver con la compilación y con lo que la gente considere opuesta.
Todas estas "diferencias" son bastante borrosas, artificiales e irrelevantes, ya que siempre es posible mezclar memoria administrada y no administrada en un solo tiempo de ejecución, y la diferencia entre compilación e interpretación también es muy vaga.
fuente
Para citar Wikipedia:
El código administrado necesita un tiempo de ejecución (como .NET CLT) para ejecutarse.
fuente
Creo que hay que hacer una distinción, sin embargo, no es necesariamente entre "Compilado" y "Administrado". Estos no son opuestos; un lenguaje puede compilarse y no administrarse, o interpretarse (no compilarse) y administrarse, o ambos, o incluso ninguno.
Un lenguaje "compilado" es simplemente uno en el que hay un paso que transforma el código fuente escrito por el desarrollador en un "código de bytes" más regular, que es lo que ejecuta la máquina. La "máquina" puede ser el procesador real o una "máquina virtual" que realiza operaciones adicionales en los códigos de bytes para traducirlos a instrucciones de máquina "nativas". El antónimo de un lenguaje "compilado" es un lenguaje "interpretado", en el que el código fuente se transforma en instrucciones de código de bytes en tiempo de ejecución, línea por línea a medida que se ejecutan, sin un paso de compilación. Un híbrido entre ellos es "jit", de "JIT" (Just In Time), que generalmente es interpretado como un paso único por parte de la máquina ejecutora;
Un lenguaje "administrado" es un lenguaje diseñado para producir programas que se consumen dentro de un entorno de tiempo de ejecución específico, que casi siempre incluye un intérprete de código de bytes; una "máquina virtual" que toma el código del programa y realiza alguna máquina adicional o transformación específica del entorno. El entorno también puede incluir la administración de memoria, como un "recolector de basura" y otras características de "seguridad" destinadas a mantener el programa operando dentro de su "caja de arena" de espacio y herramientas, sin embargo, tales características no son el dominio exclusivo de los tiempos de ejecución "administrados" . Prácticamente todos los idiomas interpretados podrían considerarse administrados, ya que requieren que el intérprete se ejecute debajo de las líneas del código de "usuario" que se está ejecutando. Además, los lenguajes JVM y .NET (Java, Scala, C #, VB, F #, IronWhatever) se compilan en un lenguaje intermedio o IL, que es superficialmente similar en forma y función a un lenguaje ensamblador binario, pero no se adhiere al 100% a ningún conjunto de instrucciones "nativo". Estas instrucciones son ejecutadas por la JVM o por el CLR de .NET, que las traduce efectivamente a instrucciones binarias nativas específicas de la arquitectura de la CPU y / o el sistema operativo de la máquina.
Por lo tanto, los idiomas generalmente se pueden describir como "compilados" o "interpretados", y como "no administrados" (o "nativos") y "administrados". Hay lenguajes que pueden describirse como cualquier combinación de estos, excepto los posibles "nativos interpretados" (que solo sería cierto para los códigos hexadecimales escritos a mano, donde lo que el desarrollador escribe es lo que se ejecuta); Si considera que la capa de interpretación es un "tiempo de ejecución" (que es fácil de argumentar y difícil de argumentar), todos los lenguajes interpretados se "administran".
Si desea obtener conocimientos técnicos, casi todos los programas dirigidos a un sistema operativo multitarea en la actualidad están "administrados"; el SO creará una "máquina virtual" para cada programa que se esté ejecutando, en el que el programa piense (o al menos no tenga que saber lo contrario) que es lo único que se está ejecutando. El código puede hacer llamadas dentro de sí mismo y a otras bibliotecas referenciadas como si ese programa fuera lo único cargado en la memoria; de manera similar, las llamadas para asignar RAM y otra memoria superior para almacenar y manipular datos y dispositivos de control se codifican como si toda la arquitectura de la memoria estuviera disponible. La VM (y el sistema operativo detrás de ella) luego traduce varios punteros de memoria a la ubicación real del programa, sus datos y enlaces a los controladores de dispositivos, etc. Esto se realiza con mayor frecuencia aplicando un desplazamiento de memoria (cada VM obtiene un bloque de 2 GB o lo que sea de memoria, comenzando en la dirección X, que el programa puede tratar como si esa X fuera la dirección 0) y, como tal, es muy barato de hacer, pero hay otras cosas de las que es responsable el núcleo del sistema operativo, como la programación de procesos y la comunicación entre procesos, que son más difícil de manejar. Sin embargo, este patrón básico generalmente no se considera "administrado", ya que el programa no tiene que saber que lo está ejecutando una máquina virtual y, a menudo, es responsable de mantener "limpia" la memoria asignada. Un programa diseñado para ejecutarse en la línea de comandos de MS-DOS puede ejecutarse en sistemas operativos Windows más nuevos que ya ni siquiera tienen el entorno de MS-DOS debajo de ellos; en cambio, el programa recibe un entorno de "consola virtual", y siempre que no intente salir de este "entorno limitado"
fuente
El lenguaje administrado en términos simples es un lenguaje de alto nivel que depende de los servicios proporcionados por un entorno de tiempo de ejecución para ejecutarse, como el servicio de recolección de basura, por eso se llama administrado en general, pero ese no es el único servicio que utiliza , y algunos de estos servicios son
security services, exception handling, standard types
, se utilizanCommon Language Run-time CLR
para ejecutar, como en lenguajes .Net o un entorno virtual como Java que usa Java Virtual Machine JVM.El lenguaje no administrado es un lenguaje de bajo nivel ejecutable directamente por el sistema operativo sin la necesidad de servicios virtuales de tiempo de ejecución o lenguaje intermedio, tales como el
C, C++
código no administrado producido por dichos idiomas utiliza rutinas de biblioteca que están dinámicamente vinculadas al sistema operativo para obtener el código para ejecutar llamadas DLL (Bibliotecas de enlaces dinámicos), el código no administrado accede directamente a la memoria, por eso es más rápido que el código administrado, pero a menos que esté construyendo un controlador de hardware o un videojuego sofisticado, realmente no desea usar lenguajes no administrados como puede ser peligroso trabajar especialmente con desarrolladores inexpertos como el estado del rolwith great power comes great responsibility
, y es por eso que existen lenguajes administrados para ayudar a los desarrolladores a producir código extensible sin sumergirse en la parte inferior del sistema, pero aún así puede crear código mixto si lo necesita, estos artículos lo explican todo:Una descripción general de la interoperabilidad de código administrado / no administrado
Ejemplo: Mezcla de código C ++, C ++ / CLI y C # no administrado
fuente