Hasta donde tengo entendido, los compiladores están destinados a desarrolladores que compilan su código en archivos ejecutables (código de máquina). Los compiladores no se extienden a la máquina de un cliente o al sistema de usuario final.
En cambio, los desarrolladores solo usan el compilador para convertir su código en código de máquina, que luego se transporta a las otras máquinas para su uso como aplicaciones.
¿Los compiladores tienen una función fuera de este proceso? Si es así, ¿cuándo se usan?
Respuestas:
Si y no. Sí, el escenario clásico es un desarrollador que utiliza un compilador para generar código de máquina a partir del código fuente, y el código de máquina se distribuye a los usuarios.
Allí embargo, hay algunas excepciones a esto. Primero, muchos proyectos de código abierto se distribuyen principalmente (o incluso exclusivamente) en forma de código fuente, y esperan que el usuario final los instale escribiendo un par de comandos como
make
y luegomake intall
. Esto invocará el compilador, el enlazador, etc., para generar el código de la máquina a partir del código fuente para la computadora de ese usuario. En estos casos, sin embargo, el proceso de construcción e instalación está (al menos destinado a ser) automatizado hasta el punto de que el usuario rara vez necesita mucho conocimiento más allá del hecho de que si nunca ha instalado un paquete de código fuente previamente , su administrador de paquetes generalmente incluirá algún paquete de "desarrollo" como requisito previo para instalar la aplicación que realmente les interesa (aunque algunos todavía ven esto como poco amigable para los usuarios finales).Otra excepción (a la que se ha aludido, pero que no se explica muy bien en las otras respuestas que he visto) son los compiladores justo a tiempo (JIT). Un par de ejemplos obvios de compiladores JIT son Microsoft Common Language Runtime (CLR) y Java Virtual Machine (JVM). En estos casos, normalmente hay dos compiladores completamente separados involucrados en la traducción del código fuente al código de máquina. Uno es usado por el desarrollador. Sin embargo, en lugar de generar código de máquina directamente, genera un código de bytes independiente de la máquina. El CLR / JVM luego incluye un segundo compilador, completamente separado del primero, que convierte esos códigos de bytes en código de máquina para la computadora de destino.
Debo agregar que el segundo compilador no es estrictamente necesario. Las primeras versiones de la JVM (por ejemplo) solo interpretaron los códigos de bytes en lugar de compilarlos. Sin embargo, esto a menudo conlleva una penalización de rendimiento bastante grave, por lo que la mayoría de las JVM razonablemente recientes destinadas a uso en producción incluyen un compilador JIT.
fuente
Sí, los compiladores son utilizados principalmente por los desarrolladores, con un par de excepciones notables. Los usuarios finales a veces usan compiladores para compilar e instalar el último software de código abierto, incluso si no realizan ningún cambio en el código. Además, algunos lenguajes de programación no tienen compiladores. En su lugar, utilizan intérpretes que "compilan" sobre la marcha. En ese caso, los usuarios finales deben tener el intérprete instalado en sus máquinas.
fuente
si
Un compilador se define como un programa que traduce el código de un idioma a otro (ver Wikipedia ). El uso más común de los compiladores es traducir el lenguaje fuente al código de la máquina, pero esto define la palabra "compilador".
Por ejemplo, Python genera un código de bytes cuando importa un módulo y, por lo tanto, se ajusta a la definición de un compilador (porque se convierte del idioma de origen, Python, en el idioma de destino, el código de bytes de Python).
Otro ejemplo es el motor V8 JavaScript. Se convierte JavaScript en código máquina x86 , y por lo tanto se ajusta a la definición de un compilador también. V8 no solo se ajusta a la definición de compilador, sino que se incluye en Chrome y se usa mucho en las máquinas cliente.
fuente
Un caso sería para una aplicación que genera dinámicamente código en tiempo de ejecución y luego ejecuta el código generado. Este código debería compilarse en tiempo de ejecución.
Editar: hay otras excepciones, pero ya se han mencionado en otras respuestas.
fuente
Yo diría que "los compiladores son los principales para los desarrolladores ...". Pero he visto ejemplos en los que los programas generan nuevos códigos de lenguaje de programación sobre la marcha y, por lo tanto, necesitan que se instale un compilador en la máquina de los usuarios finales. Eso no significa que el usuario final tenga que trabajar con el compilador por sí mismo.
Posibles razones para el diseño de este programa:
rendimiento: piense en una aplicación basada en reglas donde las reglas se almacenan en algún tipo de almacén de datos de usuario final y usted tiene algunos datos masivos para ser procesados por esas reglas. En lugar de interpretar las reglas una y otra vez, un programa genera primero el código de procesamiento, lo compila y lo ejecuta contra los datos a procesar
piense en un programa donde el usuario final pueda agregar algún tipo de fórmula matemática y el desarrollador del programa no quiera implementar su propio analizador / intérprete para esto. En cambio, el programa toma esta fórmula, hace algunas adiciones para transformarlo en un código de programa válido, deja que el compilador lo compile y lo ejecute después.
fuente
Así es: los compiladores compilan el código fuente en forma ejecutable, que luego se vincula a un archivo binario ejecutable mediante un vinculador. El código fuente también puede ser ejecutado directamente por un intérprete, como uno de los muchos shells de línea de comandos (C-shell, bash, zsh, etc.), awk, sed, etc.
Puede ser difícil trazar una línea clara entre "desarrollador" y "usuario final" a menos que limite su discusión a un producto específico. Los desarrolladores son todos "usuarios finales" de las herramientas que usan, y los "usuarios finales" pueden tener herramientas de desarrollo como compiladores e intérpretes instalados en sus máquinas.
fuente
Los administradores también pueden necesitar usar lenguajes de programación al escribir scripts para realizar varias tareas automatizadas. Por ejemplo, tener una secuencia de comandos que elimine los archivos de registro antiguos de un servidor después de 90 días para liberar espacio en el disco. El lenguaje utilizado para escribir el script debe interpretarse o compilarse para que pueda ejecutarse en el sistema.
fuente
Algunos programas son metaprogramas : mientras se ejecutan, pueden generar algún otro programa (o algún código fuente) y compilarlo y luego ejecutarlo de alguna manera. Lea también sobre programación de etapas múltiples .
Por lo tanto, para usar este tipo de programas, se necesitaría un compilador, incluso si el usuario no sabe cómo programarse a sí mismo (porque la computadora generaría algún código que debe compilarse).
Para ver un ejemplo, vea MELT (que genera código C ++ para extender GCC ) o el sistema de inteligencia artificial CAIA de J.Pitrat (que genera código C -notablemente su propio código- para resolver problemas combinatorios).
Además, algunos idiomas y algunas implementaciones casi requieren que un compilador esté presente en todas partes (en cada programa codificado en ese idioma e implementación). Primero, varios navegadores web contienen un motor JIT de Javascript (como V8 ). Además, la mayoría de las implementaciones de Common Lisp -eg SBCL- contienen un compilador (incluso útil para ejecutar aplicaciones, que podrían generar y evaluar expresiones). Lea también sobre lenguajes homoicónicos y programas Qine .
fuente