¿Se usan compiladores fuera del desarrollo?

14

En mi opinión, los compiladores están diseñados para que los desarrolladores compilen 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 del usuario final.

En su lugar, los desarrolladores simplemente 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 utilizan?

    
pregunta Pankaj Upadhyay 30.08.2011 - 16:33
fuente

8 respuestas

19

Sí y no. Sí, el escenario clásico es un desarrollador que usa un compilador para generar código de máquina a partir del código fuente, y luego el código de máquina se distribuye a los usuarios.

Hay hay algunas excepciones a esto, sin embargo. 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 luego make intall . Esto invocará al compilador, al vinculador, etc., para generar el código de máquina del código fuente para la computadora de ese usuario. Sin embargo, en estos casos, el proceso de construcción e instalación se automatiza (al menos se pretende que sea) hasta el punto de que el usuario rara vez necesita mucho conocimiento del mismo, más allá del hecho de que si nunca han instalado un paquete de código fuente solo anteriormente , su administrador de paquetes generalmente incluirá algún paquete de "desarrollo" como un requisito previo para instalar la aplicación que realmente les importa (aunque algunos aún lo ven como algo hostil para los usuarios finales).

Otra excepción (que se ha aludido, pero 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 el Common Language Runtime (CLR) de Microsoft y la Máquina Virtual de Java (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 el código de máquina directamente, genera un código de byte independiente de la máquina. El CLR / JVM luego incluye un compilador segundo , completamente separado del primero, que convierte esos códigos de bytes en código de máquina para la computadora de destino.

Debo añadir que el segundo compilador no es estrictamente necesario. Las primeras versiones de la JVM (por ejemplo,) solo interpretaban 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 las JVM más razonablemente recientes para uso en producción incluyen un compilador JIT.

    
respondido por el Jerry Coffin 30.08.2011 - 17:42
fuente
24

Sí, los compiladores son utilizados principalmente por los desarrolladores, con un par de notables excepciones. Los usuarios finales a veces usan compiladores para compilar e instalar el último software de código abierto, incluso si no hacen 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.

    
respondido por el Karl Bielefeldt 30.08.2011 - 16:41
fuente
10

Un compilador se define como un programa que traduce el código de un idioma a otro (consulte Wikipedia ). El uso más común de los compiladores es traducir el idioma de origen al código de 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, al idioma de destino, el código de bytes de Python).

Otro ejemplo es el motor V8 JavaScript. convierte JavaScript en código de máquina x86 y, por lo tanto, también encaja en la definición de compilador. V8 no solo se ajusta a la definición de un compilador, sino que se incluye en Chrome y se usa mucho en las máquinas cliente.

    
respondido por el riwalk 30.08.2011 - 17:05
fuente
4

Un caso sería para una aplicación que generó dinámicamente un código en tiempo de ejecución y luego ejecutó el código generado. Este código debería compilarse en tiempo de ejecución.

Editar: hay otras excepciones, pero ya se mencionaron en otras respuestas.

    
respondido por el Morgan Herlocker 30.08.2011 - 17:18
fuente
3
  

los compiladores están diseñados solo para que los desarrolladores compilen sus   código de lenguaje de programación a archivos ejecutables (código de máquina)

Yo diría que "los compiladores son primordiales para los desarrolladores ...". Pero he visto ejemplos en los que los programas generan un nuevo código 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 motivos para el diseño de este programa:

  • rendimiento: piense en una aplicación guiada por 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 su lugar, el programa toma esta fórmula, hace algunas adiciones para transformarla en una pieza válida de código de programa, deja que el compilador lo compile y lo ejecute después.

respondido por el Doc Brown 30.08.2011 - 16:52
fuente
2

Eso es correcto: los compiladores compilan el código fuente en una forma ejecutable, que luego se vincula a un archivo binario ejecutable mediante un enlazador. 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 utilizan, y los "usuarios finales" pueden tener herramientas de desarrollo como compiladores e intérpretes instalados en sus máquinas.

    
respondido por el Caleb 30.08.2011 - 16:41
fuente
1

Los administradores también pueden necesitar utilizar lenguajes de programación para escribir scripts para realizar varias tareas automatizadas. Por ejemplo, tener un script que elimina los archivos de registro antiguos de un servidor después de 90 días para liberar algo de espacio en el disco. El lenguaje utilizado para escribir el script debe interpretarse o compilarse para que pueda ejecutarse en el sistema.

    
respondido por el JB King 30.08.2011 - 16:59
fuente
1

Algunos programas son meta-programas : 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 en varias etapas .

Para utilizar este tipo de programas, se necesitaría un compilador, incluso si el usuario no sabe cómo programarse (porque la computadora generaría algún código que debe compilarse).

Para ver un ejemplo, consulte MELT (que genera el código C ++ para extender GCC ) o J.Pitrat CAIA sistema de inteligencia artificial ( que generan el código C, notablemente su propio código, para resolver problemas combinatorios).

Además, algunos lenguajes y algunas implementaciones casi requieren que un compilador esté presente en todas partes (en cada programa codificado en ese lenguaje y en la implementación). Primero, varios navegadores web contienen un motor de Javascript JIT (como V8 ). Además, la mayoría de las implementaciones de Common Lisp -e.g. SBCL : contiene un compilador (incluso útil para ejecutar aplicaciones, que puede generar y evaluar expresiones). Lea también sobre lenguas homoicónicas y programas Qine .

    
respondido por el Basile Starynkevitch 04.12.2014 - 19:13
fuente

Lea otras preguntas en las etiquetas