Sim e não. Sim, o cenário clássico é um desenvolvedor que usa um compilador para gerar código de máquina a partir do código-fonte, e o código da máquina é distribuído aos usuários.
Não são poucas excepções a esta embora. Primeiro, muitos projetos de código aberto são distribuídos principalmente (ou mesmo exclusivamente) no formato de código-fonte e esperam que o usuário final os instale digitando alguns comandos como make
e depoismake intall
. Isso chamará o compilador, o vinculador etc. para gerar o código da máquina a partir do código-fonte do computador desse usuário. Nesses casos, no entanto, o processo de criação e instalação é (pelo menos pretendido) automatizado a ponto de o usuário raramente precisar de muito conhecimento além do fato de que, se nunca instalou um pacote somente de código-fonte anteriormente , o gerenciador de pacotes normalmente listará algum pacote de "desenvolvimento" como um pré-requisito para instalar o aplicativo de que realmente se preocupa (embora alguns ainda o considerem hostil para os usuários finais).
Outra exceção (já mencionada, mas não explicada muito bem nas outras respostas que eu vi) são os compiladores just-in-time (JIT). Alguns exemplos óbvios de compiladores JIT são o Microsoft Common Language Runtime (CLR) e a Java Virtual Machine (JVM). Nesses casos, normalmente existem dois compiladores completamente separados envolvidos na conversão do código-fonte em código de máquina. Um é usado pelo desenvolvedor. No entanto, em vez de gerar código de máquina diretamente, ele gera um código de bytes independente de máquina. O CLR / JVM inclui um segundo compilador, totalmente separado do primeiro, que converte esses códigos de bytes em código de máquina para o computador de destino.
Devo acrescentar que o segundo compilador não é estritamente necessário. As versões anteriores da JVM (por exemplo) apenas interpretavam os códigos de bytes em vez de compilá-los. No entanto, isso geralmente gera uma penalidade de desempenho bastante séria, portanto, as JVMs razoavelmente recentes destinadas ao uso em produção incluem um compilador JIT.