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.