Os compiladores são usados ​​fora do desenvolvimento?

14

No meu entender, os compiladores são destinados a desenvolvedores que compilam seu código em arquivos executáveis ​​(código de máquina). Os compiladores não se estendem à máquina do cliente ou ao sistema do usuário final.

Em vez disso, os desenvolvedores apenas usam o compilador para converter seu código em código de máquina, que é transportado para outras máquinas para uso como aplicativos.

Os compiladores têm uma função fora desse processo? Se sim, quando eles são usados?

Pankaj Upadhyay
fonte
21
Sim, compiladores compilam código.
Tom Squires
@ Tom: Li em algum lugar que os compiladores C estão instalados em várias máquinas, incluindo consoles de jogos. Isso significa que escrevemos código em C, que é enviado para esses dispositivos, onde são compilados pelo compilador e depois executados pelo intérprete?
Pankaj Upadhyay
3
@Pankaj Upadhyay: É possível que o código possa ser enviado para uma máquina e compilado por um processo interno. É improvável que o usuário do dispositivo veja isso acontecendo ou saiba sobre isso. Isso pode ser feito se partes do código precisarem ser compiladas para hardware específico e as soluções que testam o hardware em tempo de execução forem muito lentas, levando à necessidade de distribuir código e compilar durante a instalação. Talvez ...
FrustratedWithFormsDesigner
3
@Pankaj Nenhum console de jogo é fornecido com compiladores, mas alguns podem ser instalados neles. A Sony forneceu uma versão do Linux e GCC que poderia ser instalada no PS2, por exemplo. Outras pessoas invadiram / invadiram o caminho para colocar outros SOs e softwares nos consoles.
precisa saber é o seguinte
4
@ Stargazer: Você quis dizer: "Não, os compiladores traduzem de um idioma de origem para um idioma de destino"? Omitir a vírgula faz com que sua sentença signifique o oposto do significado pretendido.
Daniel Pryden 30/08/11

Respostas:

19

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

Jerry Coffin
fonte
24

Sim, os compiladores são usados ​​principalmente pelos desenvolvedores, com algumas exceções notáveis. Às vezes, os usuários finais usam compiladores para compilar e instalar o software de código aberto mais recente, mesmo que eles não façam alterações no código. Além disso, algumas linguagens de programação não possuem compiladores. Em vez disso, eles usam intérpretes que "compilam" rapidamente. Nesse caso, os usuários finais precisam ter o intérprete instalado em suas máquinas.

Karl Bielefeldt
fonte
4
Se restringíssemos a definição de "compiladores" para significar programas que geram arquivos executáveis, essa seria uma boa resposta. No entanto, isso é meramente um subconjunto da verdadeira definição de "compilador"
Riwalk
16
@ Jan Soltis: Eu discordo. Eu compilei o kernel Linux a partir da fonte: isso significa que eu sou um desenvolvedor de kernel Linux ? Nunca modifiquei o código do kernel do Linux nem enviei um patch - eu diria que isso significa que não sou desenvolvedor de kernel. Além disso, durante os vários anos em que usei o Gentoo como meu sistema operacional principal, compilei cada software da máquina. No entanto, a grande maioria deles foi compilada automaticamente por meio do sistema de gerenciamento de pacotes Portage. Eu argumentaria que, nesse caso, eu estava atuando como usuário final, mas não como desenvolvedor .
Daniel Pryden
8
@ Jan Soltis: Estou ciente de que essa é a sua opinião. Eu discordo respeitosamente. Forneci contra-argumentos para apoiar minha posição, enquanto você continua fazendo afirmações sem suporte. Você parece pensar que existe uma linha acentuada entre "desenvolvedor" e "usuário final", que eu não acredito que exista.
Daniel Pryden 30/08/11
6
Baixar fontes e depois executar "make install" não é um desenvolvedor. É definitivamente uma operação do usuário final.
precisa
3
@ Jan: Eu poderia aceitar que usar uma distro como o Gentoo que compila pacotes faz de você pelo menos um usuário avançado , mas ainda é claramente um tipo de usuário. Compilar o código de outras pessoas, sem modificá-lo, adicioná-lo ou mesmo lê-lo, não faz de você um desenvolvedor.
Carson63000
10

sim

Um compilador é definido como um programa que traduz código de um idioma para outro (consulte a Wikipedia ). O uso mais comum dos compiladores é traduzir o idioma de origem em código de máquina, mas isso define a palavra "compilador".

Por exemplo, o Python gera código de bytes quando importa um módulo e, portanto, se encaixa na definição de compilador (porque converte da linguagem de origem, Python, para a linguagem de destino, código de bytes do Python).

Outro exemplo é o mecanismo JavaScript V8. Ele converte JavaScript em código de máquina x86 e, portanto, também se encaixa na definição de compilador. O V8 não apenas se encaixa na definição de compilador, mas também está incluído no Chrome e é amplamente utilizado nas máquinas clientes.

riwalk
fonte
4

Um caso seria para um aplicativo que gerasse código dinamicamente no tempo de execução e depois executasse o código gerado. Esse código precisaria ser compilado em tempo de execução.

Edit: Existem outras exceções, mas elas já foram mencionadas em outras respostas.

Morgan Herlocker
fonte
1 basta dizer JIT
gnat 30/08
1
O mecanismo V8 no Chrome não é uma exceção esquisita.
precisa saber é o seguinte
Atualizado para esclarecer. Eu percebo que existem outras exceções.
Morgan Herlocker
3

compiladores destinam-se apenas a desenvolvedores para compilar seu código de linguagem de programação em arquivos executáveis ​​(código de máquina)

Eu diria "compiladores são primários para desenvolvedores ...". Mas vi exemplos em que os programas geram um novo código da linguagem de programação on-the-fly e, portanto, precisam que um compilador seja instalado na máquina do usuário final. Isso não significa que o usuário final precise trabalhar com o compilador sozinho.

Possíveis razões para o design deste programa:

  • desempenho: pense em um aplicativo orientado a regras em que as regras sejam armazenadas em algum tipo de armazenamento de dados do usuário final e você tenha alguns dados em massa a serem processados ​​por essas regras. Em vez de interpretar as regras repetidamente, um programa gera o código de processamento primeiro, o compila e executa nos dados a serem processados

  • pense em um programa em que o usuário final possa adicionar algum tipo de fórmula matemática e o desenvolvedor do programa não queira implementar seu próprio analisador / intérprete para isso. Em vez disso, o programa adota essa fórmula, faz algumas adições para transformá-lo em uma parte válida do código do programa, deixa o compilador compilá-lo e o executa posteriormente.

Doc Brown
fonte
hmm .... Isso não significa que o usuário final precise trabalhar com o compilador sozinho . Isso praticamente explica e esclarece.
Pankaj Upadhyay
2

Isso mesmo - os compiladores compilam o código-fonte no formato executável, que é então vinculado a um arquivo binário executável por um vinculador. O código-fonte também pode ser executado diretamente por um intérprete, como um dos muitos shells da linha de comando (shell C, bash, zsh etc.), awk, sed e assim por diante.

Pode ser difícil traçar uma linha clara entre "desenvolvedor" e "usuário final", a menos que você limite sua discussão a um produto específico. Os desenvolvedores são todos "usuários finais" das ferramentas que usam, e "usuários finais" podem ter ferramentas de desenvolvimento, como compiladores e intérpretes instalados em suas máquinas.

Caleb
fonte
2
Ok, eu vou -1 neste, porque há muitos mal-entendidos aqui sobre compiladores. Compiladores traduzem código de um idioma de origem para um idioma de destino. Dizer que geram código de máquina é semelhante a dizer que veículos têm 4 rodas (sim, a maioria dos veículos tem 4 rodas, mas uma motocicleta também é um veículo. Da mesma forma, a maioria dos compiladores gera código de máquina, mas um conversor C # -> VB é um compilador)
riwalk
1
@ Stargazer712, garanto que não há mal - entendidos - eu sei muito bem o que os compiladores fazem, obrigado. Mas se alguém que não conhece me perguntar o que é um carro, eu provavelmente diria que um carro tem quatro rodas, apesar de algumas não . Uma definição pedante muitas vezes confunde mais do que explica para uma pessoa que tenta entender um conceito. "Compilador" também pode ser uma descrição do trabalho, mas mencionar que não ajudaria aqui.
Caleb
1

Os administradores também podem precisar usar linguagens de programação para escrever scripts para executar várias tarefas automatizadas. Por exemplo, ter um script que exclua arquivos de log antigos de um servidor após 90 dias para liberar espaço em disco. O idioma usado para escrever o script deve ser interpretado ou compilado para que possa ser executado no sistema.

JB King
fonte
1

Alguns programas são metaprogramas : durante a execução, eles podem gerar outro programa (ou algum código-fonte) e compilá-lo e executá-lo de alguma forma. Leia também sobre programação em vários estágios .

Portanto, para usar esse tipo de programa, seria necessário um compilador, mesmo que o usuário não saiba programar (porque o computador geraria algum código que precisa ser compilado).

Por exemplo, consulte MELT (que gera código C ++ para estender o GCC ) ou o sistema de inteligência artificial CAIA da J.Pitrat (que gera código C - principalmente seu próprio código - para resolver problemas combinatórios).

Além disso, algumas linguagens e algumas implementações quase exigem que um compilador esteja presente em todos os lugares (em todos os programas codificados nessa linguagem e implementação). Primeiro, vários navegadores da Web contêm um mecanismo Javascript JIT (como V8 ). Além disso, a maioria das implementações do Common Lisp -eg SBCL - contém um compilador (até útil para a execução de aplicativos, que pode gerar e avaliar expressões). Leia também sobre idiomas homoicônicos e programas Qine .

Basile Starynkevitch
fonte