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"