¿Idiomas administrados versus diferencia de idioma compilado?

18

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)?

l46kok
fuente
2
este término es acuñado por Microsoft, en sentido estricto Java también es administrado. Casi en todos los casos podemos pensar en lenguajes administrados como de un subconjunto de aquel que compiles.Also, esto, creo que se relaciona - programmers.stackexchange.com/questions/72446/...
shabunc
Tenga en cuenta que hay una gran diferencia entre un lenguaje que compila (estáticamente) el código en algo más manejable por la máquina antes del tiempo de ejecución (como Java) y uno que lo hace en tiempo de ejecución (como Python). Una diferencia importante es que compilarlo estáticamente antes del tiempo de ejecución le da al comiler la oportunidad de hacer algunas optimizaciones que pueden resultar en mejoras de velocidad considerable (como el JIT de Java, reorganizar el código para la predicción de bifurcación, etc.).
Shivan Dragon
66
@ShivanDragon, un "lenguaje" no compila nada. Su implementación lo hace. Y puede compilar Python estáticamente (vea PyPy o IronPython por ejemplo). OTOH, es realmente difícil hacerlo de manera eficiente con un lenguaje escrito dinámicamente (busque "JIT de rastreo", "interpretación abstracta", etc.)
SK-logic
@ SK-logic: de acuerdo, he dicho un malo. Quería referirme a la plataforma, no al idioma.
Shivan Dragon
@shabunc En realidad, diría que Compiled es un subconjunto de Managed. Un lenguaje administrado puede hacer cualquier cosa que un lenguaje compilado puede hacer (prácticamente a la misma velocidad), y más aún, ya que se puede compilar un lenguaje administrado. Para darle a C las características de un lenguaje administrado, necesitaría construir una "VM" y convertirlo en un lenguaje administrado.
Bill K

Respuestas:

47

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.

SK-logic
fuente
2
Esto es lo que básicamente tenía en mente, pero me he encontrado con muchas personas que siguen haciendo esta distinción. Gracias por la respuesta clara.
l46kok
El código administrado significa tener un lenguaje intermedio para cuidar del entorno de ejecución en el que se ejecuta, ¿verdad? De modo que el lenguaje intermedio (digamos bytecode) debe ser producido por un compilador. OMI, que combina el código "administrado" y el concepto de "compilación" un poco. Sin embargo, si el lenguaje está "compilado", eso no muestra que produce un código administrado (es decir, C ++ vs Java)
zgulser
@zgulser, no, los idiomas intermedios son ortogonales. Gestionado significa tener un GC integrado con el lenguaje de ejecución. Por ejemplo, el tiempo de ejecución OCaml se "administra", aunque se compila directamente en nativo.
SK-logic
8

Para citar Wikipedia:

Código administrado es un término acuñado por Microsoft para identificar el código fuente de un programa de computadora que requiere y solo se ejecutará bajo la administración de una máquina virtual Common Language Runtime (que resulta en bytecode).

El código administrado necesita un tiempo de ejecución (como .NET CLT) para ejecutarse.

janvdl
fuente
55
El código administrado no tiene nada que ver con un marco. Necesita un tiempo de ejecución que gestione la memoria.
Finalizado el
Quizás mi redacción está un poco apagada, pero ¿no es el marco .NET realmente un "tiempo de ejecución de lenguaje común"?
janvdl
3
No. In incluye el CLR, pero también incluye las bibliotecas de clase base, la especificación IL y más.
Finalizado el
4

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"

KeithS
fuente
"los idiomas generalmente se pueden describir como" compilados "o" interpretados "" - No, no pueden. La compilación y la interpretación son rasgos de, bueno, compiladores e intérpretes, no idiomas. El término "lenguaje compilado" ni siquiera tiene sentido. Si el inglés fuera un idioma escrito, sería un error de tipo.
Jörg W Mittag
2
Los compiladores e intérpretes generalmente se encuentran compilando e interpretando dialectos muy específicos de idiomas diseñados para someterse a compilación o interpretación. Nadie está compilando el código fuente de JavaScript que conozco, y nadie está interpretando C #. Los idiomas están diseñados para ser consumidos de una forma u otra. Como tal, generalmente es aceptable referirse al lenguaje en sí mismo como "compilado" o "interpretado" porque el entorno completo en el que se utiliza el idioma implica uno de esos dos pasos.
KeithS
en.wikipedia.org/wiki/Interpreted_language - "Teóricamente, cualquier lenguaje puede compilarse o interpretarse, por lo que esta designación se aplica únicamente debido a la práctica común de implementación y no a alguna propiedad esencial de un lenguaje".
KeithS
@KeithS, wikipedia no es casi perfecta. El hecho de que exista un artículo para un determinado término no válido no hace que este término sea más válido. Sí, los idiomas siempre se diseñan con un cierto modo de ejecución en mente, pero sigue siendo contraproducente calificarlos como "compilados" o "interpretados" únicamente en función de la intención de sus diseñadores. Y, en cuanto a una interpretación, es realmente difícil encontrar un "intérprete" adecuado de cualquier manera. Tcl es probablemente el último de su tipo. Todos los demás llamados "intérpretes" son, de hecho, compiladores.
SK-logic
2

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 utilizan Common Language Run-time CLRpara 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

Ashraf Abusada
fuente