languages - ¿C#se interpreta parcialmente o realmente se compila?
compiled and interpreted languages (12)
C # es un lenguaje compilable.
Probablemente, repito, probablemente, ya que conocí ese tipo de opiniones, el hecho de que alguien piense que hay un intérprete para el lenguaje C #, se debe al tipo de proyectos como
o, por ejemplo, famoso
donde puedes escribir solo líneas del código y ejecutarlas, lo que hace pensar que es un Python similar al de Python , lo cual no es cierto . Compila esas líneas y las ejecuta, como un lenguaje de programación común compilable (desde el punto de vista del flujo de trabajo).
Hay mucha información contradictoria sobre esto. Mientras que algunos dicen que C # está compilado (ya que está compilado en IL y luego en código nativo cuando se ejecuta), otros dicen que se interpreta como si necesitara .NET. EN Wiki dice:
Muchos lenguajes interpretados se compilan primero a algún tipo de código de máquina virtual, que luego se interpreta o compila en el tiempo de ejecución al código nativo.
Entonces estoy bastante confundido. ¿Alguien podría explicar esto claramente?
C # está compilado en IL, por el compilador c #.
Esta IL se compila justo a tiempo (JIT) según sea necesario, en el lenguaje ensamblador nativo de la máquina host. Sin embargo, sería posible escribir un tiempo de ejecución de .NET que interpretara el IL. Incluso si esto se hiciera, seguiría argumentando que c # es un lenguaje compilado.
C # se interpreta y compila en su tiempo de vida. C # se compila en un lenguaje virtual que es interpretado por una máquina virtual.
La confusión proviene del concepto difuso de un "lenguaje compilado".
"Compiled Language" es un nombre inapropiado, en cierto sentido, porque compilado o interpretado no es una propiedad del lenguaje sino del tiempo de ejecución.
Por ejemplo, podría escribir un intérprete C, pero las personas generalmente lo llaman "Lenguaje compilado", porque las implementaciones C se compilan en código máquina, y el lenguaje se diseñó con la compilación en mente.
C #, como Java, tiene un procesador de lenguaje híbrido. Los procesadores híbridos realizan trabajos de interpretación y compilación.
Creo que este es un tema bastante antiguo.
Desde mi punto de vista, el código interpretado pasará por un intérprete, se traducirá y ejecutará línea por línea al mismo tiempo. Al igual que el javascript de ejemplo, es un código interpretado, cuando una línea de javascript se ejecuta en un error, el script simplemente se rompe.
Mientras se compila el código, pasará por un compilador, traducirá todo el código a otra forma de código a la vez, sin ejecutarlo primero. La ejecución está en otro contexto.
Dado que una computadora solo puede ejecutar código binario, cualquier idioma dará lugar a la producción de código binario en un punto u otro. La pregunta es: ¿el idioma te permite producir un programa en código binario? Si es así, entonces es un lenguaje compilado: por definición "compilado" en "lenguaje compilado" se refiere a la compilación en código binario, no a la transformación en algún código intermediario. Si el lenguaje conduce a la producción de dicho código intermediario para un programa, necesitará un software adicional para realizar la compilación binaria a partir de este código: entonces es un lenguaje interpretado. ¿Es un programa "compilado" por C # directamente ejecutable en una máquina sin ningún otro software instalado en esta máquina? si no, entonces es un lenguaje interpretado. Para un lenguaje interpretado, es un intérprete que generará el código binario subyacente, la mayor parte del tiempo de una manera dinámica, ya que este mecanismo es la base de la flexibilidad de dichos idiomas. movimiento rápido del ojo. : a veces no parece obvio porque el intérprete está incluido en el sistema operativo
Demasiadas semánticas y declaraciones basadas en la opinión.
Primero: C # no es un lenguaje interpretado; CLR y JVM se consideran "tiempos de ejecución" o "middleware", pero el mismo nombre se aplica a cosas como Perl. Esto crea mucha confusión entre las personas preocupadas por los nombres.
El término "Intérprete" que hace referencia a un tiempo de ejecución generalmente significa que el código existente interpreta algún código no nativo. Existen dos grandes paradigmas: El análisis lee el código fuente sin procesar y toma acciones lógicas; la ejecución de código byte primero compila el código en una representación binaria no nativa, que requiere mucho menos ciclos de CPU para interpretar.
Java originalmente compilada a bytecode, luego pasó por un intérprete; ahora, la JVM lee el bytecode y just-in-time lo compila en código nativo. CIL hace lo mismo: CLR usa compilación justo a tiempo para el código nativo.
Tenga en cuenta todas las combinaciones de ejecutar el código fuente, ejecutar bytecode, compilar en compilación nativa, just-in-time, ejecutar el código fuente a través de un compilador para just-in-time nativo, y así sucesivamente. La semántica de si un lenguaje se compila o interpreta no tiene sentido.
Como ejemplo: muchos lenguajes interpretados usan compilación de bytecode just-in-time. C # compila a CIL, que JIT compila a nativo; por el contrario, Perl compila inmediatamente una secuencia de comandos a un bytecode, y luego ejecuta este bytecode a través de un intérprete. Solo puede ejecutar un ensamblado C # en formato de byte CIL; solo puede ejecutar una secuencia de comandos Perl en formato de código fuente sin formato.
Los compiladores Just-In-Time también ejecutan una gran cantidad de instrumentación externa e interna. El tiempo de ejecución rastrea la ejecución de diversas funciones y luego ajusta el diseño del código para optimizar las ramas y la organización del código para su flujo de ejecución particular. Eso significa que el código JIT puede ejecutarse más rápido que el código compilado nativamente (como C ++ típicamente, o como C # ejecutar a través de IL2CPP), porque el JIT ajusta su estrategia de optimización al caso de ejecución real del código mientras se ejecuta.
Bienvenido al mundo de la programación de computadoras. Decidimos hacerlo extremadamente complicado, luego adjuntar nombres no descriptivos a todo. El propósito es crear flamewars sobre la definición de palabras que no tienen ningún significado práctico.
Mira aquí: http://msdn.microsoft.com/library/z1zx9t92
El código fuente escrito en C # se compila en un lenguaje intermedio (IL) que se ajusta a la especificación CLI.
(...)
Cuando se ejecuta el programa C #, el ensamblaje se carga en el CLR, que puede tomar varias acciones basadas en la información en el manifiesto. Luego, si se cumplen los requisitos de seguridad, el CLR realiza la compilación justo a tiempo (JIT) para convertir el código IL en instrucciones nativas de la máquina.
Primero, comprendamos las definiciones de interpretado y compilado.
"Compilar" (cuando se refiere al código) significa traducir el código de un idioma a otro. Por lo general, desde el código fuente legible por el hombre hasta el código máquina que el procesador objetivo puede ... procesar.
"Interpretar" (cuando se refiere al código) TAMBIÉN significa traducir el código de un idioma a otro. Pero esta vez se usa normalmente para pasar de un código fuente legible por el ser humano a un código intermedio que es tomado por una máquina virtual que lo interpreta en código máquina.
Solo para aclarar
Código fuente -> Compilador -> Código máquina
Código fuente -> Compilador -> Código de byte -> Intérprete -> Código de máquina
Cualquier lenguaje puede, en teoría, ser interpreted o compiled . Normalmente, Java se compila en bytecode que la máquina virtual Java interpreta en código de máquina. C # normalmente se interpreta en bytecode compilado por CLR, el tiempo de ejecución de lenguaje común, otra máquina virtual.
Por mucho, todo es un truco de marketing. El término "interpretado" se agregó (o al menos, aumentó en el uso) para ayudar a mostrar cuán ordenada era la compilación justo a tiempo . Pero podrían haber usado "compilado". La distinción es más un estudio de la lengua inglesa y las tendencias comerciales más que cualquier cosa de naturaleza técnica.
Si estamos de acuerdo con la definición de intérprete « En informática, un intérprete es un programa informático que ejecuta directamente, es decir, ejecuta instrucciones escritas en un lenguaje de programación o guiones, sin necesidad de que se hayan compilado previamente en un programa de lenguaje de máquina. »No hay duda: C # no es un lenguaje interpretado.
Si se siente, se aprende o es de la vieja escuela, que un EXE compilado va del código fuente al código máquina, entonces se interpreta C #. Si crees que compilado significa convertir el código fuente en otro código como el código de bytes, entonces sí se convierte. Para mí, cualquier cosa que tome el procesamiento en tiempo de ejecución para funcionar en el sistema operativo para el que fue construida es interpretada.
Un lenguaje puramente compilado tiene algunas ventajas. Velocidad, por regla general, y a menudo el tamaño del conjunto de trabajo. Un lenguaje puramente interpretado tiene algunas ventajas. Flexibilidad de no necesitar una etapa de compilación explícita que nos permita editar en el lugar, y con frecuencia una portabilidad más fácil.
Un lenguaje jipe encaja en un punto medio en este caso.
Esa es una razón sola por la que podríamos pensar que un lenguaje jodido se compiló o interpretó dependiendo de qué posición métrica nos importa alcanzar y nuestros prejuicios a favor y en contra de uno u otro.
C # también se puede compilar en la primera ejecución, como ocurre en ASP.NET, lo que hace que sea casi interpretado en ese caso (aunque todavía está compilado en IL y luego jitted en este caso). Ciertamente, tiene prácticamente todas las ventajas de interpretar en este caso (comparar con VBScript o JScript utilizado en ASP clásico), junto con muchas de las ventajas de compilarse.
Estrictamente, ningún lenguaje se jodió, interpretó o compiló en qua idioma. Podemos NGen C # al código nativo (aunque si hace algo así como cargar dinámicamente un ensamblaje, seguirá usando IL y jitting). Podríamos escribir un intepretter para C o C ++ (varias personas lo han hecho). Sin embargo, en su caso de uso más común, C # se compila en IL, que luego se jit, que no es exactamente la definición clásica de interpretado ni de compilado.