¿Se usan compiladores fuera del desarrollo?

14

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?

Pankaj Upadhyay
fuente
21
Sí, los compiladores compilan el código.
Tom Squires
@Tom: Leí en alguna parte que los compiladores C están instalados en varias máquinas, incluidas las consolas de juegos. ¿Significa esto que escribimos código en C, que luego se envía a estos dispositivos, donde el compilador los compila y luego el intérprete los ejecuta?
Pankaj Upadhyay
3
@Pankaj Upadhyay: Es posible que el código podría conseguir enviado a una máquina y luego compilado por un proceso interno. Es poco probable que el usuario del dispositivo vea que esto suceda o se entere. Podría hacerse si es necesario compilar partes del código para hardware específico y las soluciones que prueban el hardware en tiempo de ejecución son demasiado lentas, lo que genera la necesidad de distribuir código y compilar durante la instalación. Quizás ...
FrustratedWithFormsDesigner
3
@Pankaj No se incluyen consolas de juegos con compiladores, pero se pueden instalar algunas en ellas. Sony proporcionó una versión de Linux y GCC que podría instalarse en la PS2, por ejemplo. Otras personas han descifrado / pirateado su camino para llevar otros sistemas operativos y software a las consolas.
IronMensan
44
@Stargazer: ¿Quiso decir: "No, los compiladores traducen de un idioma de origen a un idioma de destino"? Omitir la coma hace que su oración signifique lo contrario de su significado previsto.
Daniel Pryden

Respuestas:

19

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 makey 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.

Jerry Coffin
fuente
24

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.

Karl Bielefeldt
fuente
44
Si limitáramos la definición de "compiladores" a programas que generan archivos ejecutables, entonces esta sería una buena respuesta. Sin embargo, eso es simplemente un subconjunto de la verdadera definición de "compilador"
riwalk
16
@ Jan Soltis: No estoy de acuerdo. He compilado el kernel de Linux desde la fuente: ¿eso significa que soy un desarrollador de kernel de Linux ? Nunca modifiqué el código del kernel de Linux ni envié un parche. Diría que eso significa que no soy un desarrollador de kernel. Además, durante los varios años que usé Gentoo como mi sistema operativo principal, compilé cada pieza de software en la máquina. Sin embargo, la gran mayoría de ellos fueron compilados automáticamente por el sistema de gestión de paquetes de Portage. Yo diría que en ese caso estaba actuando como usuario final pero no como desarrollador .
Daniel Pryden
8
@ Jan Soltis: Soy consciente de que esa es tu opinión. Respetuosamente no estoy de acuerdo. Proporcioné argumentos en contra para apoyar mi posición, mientras continúas haciendo afirmaciones sin respaldo. Parece que piensa que hay una línea clara entre "desarrollador" y "usuario final" que no creo que exista.
Daniel Pryden
66
Descargar fuentes y luego ejecutar "make install" no es ser un desarrollador. Definitivamente es una operación de usuario final.
Kristopher Johnson
3
@Jan: podía aceptar que el uso de una distro como Gentoo que compila los paquetes que hace al menos un poder usuario, pero que sigue siendo claramente un tipo de usuario. Compilar el código de otras personas, sin modificarlo, agregarlo o incluso leerlo, no lo convierte en un desarrollador.
Carson63000
10

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.

Riwalk
fuente
4

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.

Morgan Herlocker
fuente
+1 solo dice JIT
mosquito
1
El motor V8 en Chrome no es una excepción extraña.
Riwalk
Actualizado para aclarar. Me doy cuenta de que hay otras excepciones.
Morgan Herlocker
3

los compiladores están destinados solo a desarrolladores para compilar su código de lenguaje de programación en archivos ejecutables (código de máquina)

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.

Doc Brown
fuente
hmm ... Eso no significa que el usuario final tenga que trabajar con el compilador por sí mismo . Eso prácticamente explica y aclara.
Pankaj Upadhyay
2

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.

Caleb
fuente
2
Ok, voy a -1 este, porque aquí hay muchos malentendidos sobre compiladores. Los compiladores traducen el código de un idioma de origen a un idioma de destino. Decir que generan código de máquina es similar a decir que los vehículos tienen 4 ruedas (sí, la mayoría de los vehículos tienen 4 ruedas, pero una motocicleta también es un vehículo. De la misma manera, la mayoría de los compiladores generan código de máquina, pero un convertidor C # -> VB es un compilador también)
riwalk
1
@ Stargazer712, le aseguro que no hay malentendidos . Sé muy bien lo que hacen los compiladores, gracias. Pero si alguien que no sabe me pregunta qué es un automóvil, probablemente diría que un automóvil tiene cuatro ruedas a pesar de que algunos no . Una definición pedante a menudo confunde más de lo que explica a una persona que trata de entender un concepto. "Compilador" también puede ser una descripción del trabajo, pero mencionar eso no ayudaría aquí.
Caleb
1

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.

JB King
fuente
1

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 .

Basile Starynkevitch
fuente