Existe alguma diferença entre os dois? De acordo com o livro de Ullman , os compiladores convertem um idioma para outro (geralmente de baixo nível), assim como um assembler. Como os dois são diferentes?
Existe alguma diferença entre os dois? De acordo com o livro de Ullman , os compiladores convertem um idioma para outro (geralmente de baixo nível), assim como um assembler. Como os dois são diferentes?
Respostas:
Um montador converte o código de montagem em código de máquina. A tradução é mecânica e pode ser feita de apenas uma maneira. Por outro lado, um compilador tem mais liberdade ao compilar a linguagem de programação relevante - ele pode otimizar, por exemplo, e até compiladores que não otimizam produzem código diferente. Além disso, os compiladores podem ser escritos de maneira a separar o "front-end" (correspondente à linguagem de programação) e o "back-end" (correspondente à arquitetura do computador), enquanto que os montadores são sempre os mesmos.
A conclusão é que é mais divertido escrever um compilador do que um montador. As linguagens assembly geralmente são projetadas para serem quase triviais para analisar e verificar o tipo e tendem a envolver muitos geradores acionados por tabela ("o opcode para add é 01110", "para instruções de carregamento, o registro do operando de destino é especificado pelos bits 17 a 21. "). Normalmente, a parte mais interessante de um montador é a parte que resolve etiquetas simbólicas em números.
No entanto , a maioria dos montadores pode fazer uma pequena quantidade de aritmética (adicionando rótulos simbólicos com pequenas constantes, por exemplo) e a maioria dos montadores possui ou está integrada a um recurso de processamento de macro. (Na maioria dos sistemas Unix, o recurso de macro é realmente fornecido executando o pré-processador C sobre o conjunto antes de passá-lo ao montador apropriado.)
O montador do MIPS teve que ir um passo além disso, tomou algumas decisões interessantes sobre geração de código e fez uma pequena otimização. A linguagem de máquina do MIPS requer sequências de código diferentes para carregar constantes diferentes, por exemplo, e assim o montador teve que escolher a sequência de código após construir a constante . Além disso, o código de máquina MIPS tinha a noção de slots de atraso , mas era responsabilidade do montador abstraí-los e apresentar uma linguagem de montagem abstrata mais "normal" ao compilador. Portanto, o assembler do MIPS precisa fazer algum agendamento de instruções local.
A distinção é ainda mais obscurecida por parte do trabalho de Norman Ramsey , em particular sua linguagem assembly C - portátil. (O artigo relevante é Ramsey e Peyton Jones, "Uma única linguagem intermediária que suporta múltiplas implementações de exceções", Prog. Lang. Impl. E Dsgn. , (PLDI-21): 285–298, 2000. ) E finalmente, há também é uma linguagem de montagem digitada de David Walker e Greg Morrisett com um assembler que pode garantir a segurança da memória.
Um pouco de resposta simplificada aqui, a realidade é mais complicada. Eu esperaria que a diferença entre um Assembler (A) e um Compiler (C) estivesse entre outras coisas:
Nós tendemos a chamar a linguagem assembly de "baixo nível" e o idioma de origem que um compilador entende como "alto nível" (isso é simplificação grosseira, mas ainda assim).
Na linguagem assembly, você poderia, por exemplo, fazer uma operação add dizendo:
Em um idioma de alto nível, você pode escrever:
E isso pode resultar em uma instrução ou centenas de instruções, dependendo de várias circunstâncias, uma é para qual CPU o compilador cria instruções.
Como você pode ver, a linguagem de origem do assembly costuma ser: (A) uma linha de código-fonte fornece uma linha de códigos de operação da CPU e depende muito de qual CPU você está direcionando. Um compilador de linguagem de alto nível (C) lida com todos esses detalhes para você - uma linha de código-fonte pode se tornar zero, um ou mais códigos de operação da CPU e o compilador lida com os detalhes do que a CPU pode fazer.
Hoje, um compilador geralmente consiste em vários estágios diferentes. Eles poderiam ser chamados de frontend / backend ou ser chamados de outras coisas. Eu normalmente os vejo como quatro estágios:
Escrever bons compiladores é uma profissão altamente qualificada - fazer um compilador de linguagem de brinquedo pode ser feito à tarde por um amador (ou bem, um pouco mais).