O que exatamente é um destino de compilação?

17

Continuo ouvindo o termo e todas as pesquisas no Google me levam a artigos sobre compiladores. Eu só quero entender o que o termo destino de compilação significa: |

UPDATE: Para dar um contexto: ouvi dizer que o assembly da web é um destino de compilação para outras linguagens como C, C ++, Rust etc.

ScionOfBytes
fonte
Eu aconselho você a ler os artigos sobre compiladores.
4
Os artigos sobre compiladores supõem que você já saiba disso. É uma pergunta razoável.
Karl Bielefeldt
Eu estava pensando mais em artigos no estilo da Wikipedia. E eu concordo que a pergunta é razoável. Foi apenas uma sugestão, não uma crítica.
4
A pergunta é razoável, mas mal escrita. O termo "alvo" pode ter significados diferentes, portanto, recomendo que você forneça uma referência ou mais contexto em que você o ouviu ou leu sobre ele.
Doc Brown
@DocBrown Já ouvi isso em muitos contextos, mas, mais recentemente, no contexto da Web assembly, sendo um destino de compilação para outros idiomas.
ScionOfBytes 22/03

Respostas:

17

Compiladores são, em essência, tradutores que recebem informações em um idioma e produzem resultados em outro. Por exemplo, o compilador da Eiffel Software pega entrada no idioma Eiffel e produz C. GCC for Intel lê entrada no idioma C e produz montagem x86. O montador de GAS da Intel faz a montagem x86 e produz o código do objeto x86. Todas essas três coisas são tecnicamente compiladores.

Independentemente do formato, a entrada lida por um compilador é chamada de origem e a saída é chamada de destino . O último termo é retirado de uma de suas definições, "resultado pretendido".

A maioria dos compiladores é projetada para produzir código de montagem ou objeto para um processador ou arquitetura em particular. Por esse motivo , o destino é frequentemente usado para se referir à própria arquitetura, e não ao formato de saída.

O destino de um compilador não precisa ser o mesmo da arquitetura em que é executado e, nos casos em que isso acontece, o programa é chamado de de compilador cruzado . (Por exemplo, o GCC pode ser criado para executar em sistemas x86 para compilar C no assembly ARM.)

Além disso, existem compiladores únicos capazes de produzir saída para diferentes destinos, dependendo da entrada, como opções na linha de comando. Esses são chamados de compiladores de vários destinos .

Blrfl
fonte
2
Como observação lateral, vale a pena mencionar que esse termo também é usado de uma forma mais generalizada no contexto de sistemas de construção - um destino é uma saída de qualquer etapa de construção, que não precisa necessariamente ser uma ação de compilação (por exemplo, criando um instalador).
precisa saber é o seguinte
2
compiladores são tradutores, não filtros.
1
@Birfl. obviamente. "tr" significa traduzir, não filtrar. filtros não são tradutores, isso é óbvio.
2
@ Birfl: eu não vou pela wikipedia. apenas produzindo um fluxo de outro ssys nada. a distinção entre filtros e tradutores é muito conhecida. um filtro inclui / exclui, com base em um predicado. não se transforma. filtrar uma lista de números inteiros por pares? e você obtém inteiros pares não transformados. traduza a mesma lista usando inc e você obterá uma versão transformada da lista original.
1
sua conta de compilação está correta, exceto pelo termo "filtro".
4

Na tradução, seja um idioma natural como o inglês ou artificial como C, usamos a fonte e o destino da terminologia para falar sobre a entrada e saída de um sistema de tradução. Na tradução para o idioma natural, o sistema é o cérebro humano competente capaz de traduzir entre duas línguas. Nas linguagens de programação, é um compilador.

Portanto, a fonte de um compilador é a linguagem de programação (C), enquanto o destino é o bytecode (instruções no nível da máquina). Geralmente usamos o target na compilação porque sistemas diferentes (arquiteturas de CPU) possuem conjuntos de instruções diferentes, por exemplo, ARM, MIPS, etc. O compilador precisa saber qual conjunto de instruções é o destino, para que possa criar a saída correta (bytecode).

Chris Cirefice
fonte
0

O WebAssemby é algo mais recente e melhor, que converte o código c / c ++ em formato binário.

  • O WebAssembly visa executar na velocidade nativa, aproveitando o hardware comum. Ele foi projetado para integrar-se à plataforma web.

Aqui está o link onde um dos aplicativos que você pode ver, com que rapidez ele converte o simples programa fatorial em código de máquina.

Verifique esta besta, https://godbolt.org/

Você pode usar este programa de amostra para executar nesse site para ver a montagem.

# include<stdio.h>

int square(int num) {
    return num * num;
}

int main() {
    int res = square(4);
    printf("%d\n",res);
  return 0;
}
  • Defina um formato binário portátil, eficiente em tamanho e tempo de carregamento para servir como um destino de compilação que pode ser compilado para ser executado na velocidade nativa, aproveitando os recursos comuns de hardware disponíveis em uma ampla variedade de plataformas, incluindo móveis e IoT.

Algumas informações básicas sobre host e destino, como a linguagem de programação é traduzida para 10101010.

host=>pc :(windows, iOS, Linux, zOS, Solaris..etc)
target=>CPUhardware: (Intel x86, ARM, PowerPC, etc)
  1. O GCC converte o código C / C ++ em código de montagem. Uma ferramenta chamada "assembler" converte o código de montagem em código de máquina e uma ferramenta chamada "linker" conecta vários arquivos de código de máquina em um único arquivo executável (.EXE no Windows). A maioria desses compiladores permite gravar o código do assembler resultante em um arquivo, para que você possa ver o código do assembler ou modificá-lo.

  2. O montador e o vinculador fazem parte da cadeia de ferramentas, o que significa que eles geralmente são entregues juntamente com o compilador.

  3. No entanto, alguns compiladores (como a Microsoft) convertem diretamente o código C / C ++ em linguagem de máquina, para que não seja necessário mais montador. Muitos desses compiladores não conseguem criar código assembler, portanto você não pode gravar o código assembler em um arquivo.

A propósito: Existem até compiladores (não para C / C ++, mas para outras linguagens de programação) que criam diretamente um arquivo .exe, portanto, nenhum vinculador é necessário.

WebAssembly: https://github.com/WebAssembly/design

danglingpointer
fonte