Che cos'è esattamente un obiettivo di compilazione?


17

Continuo a sentire il termine e tutte le ricerche su Google mi portano ad articoli sui compilatori. Voglio solo capire cosa significa il termine target di compilazione: |

AGGIORNAMENTO: Per dare un po 'di contesto: ho sentito dire che l'assemblaggio web è un obiettivo di compilazione per altri linguaggi come C, C ++, Rust ecc.


Ti consiglierei di leggere gli articoli sui compilatori.

4
Gli articoli sui compilatori presuppongono che tu lo sappia già. È una domanda ragionevole.
Karl Bielefeldt,

Stavo pensando di più agli articoli in stile Wikipedia. E sono d'accordo che la domanda è ragionevole. Era solo un suggerimento, non una critica.

4
La domanda è ragionevole, ma scritta male. Il termine "target" può avere significati diversi, quindi consiglierei di dare un riferimento o più contesto in cui l'hai sentito o letto su di esso.
Doc Brown,

@DocBrown L'ho sentito in molti contesti, ma più recentemente nel contesto dell'assemblaggio web è stato un obiettivo di compilazione per altre lingue.
ScionOfBytes il

Risposte:


17

I compilatori sono, in sostanza, traduttori che accettano input in una lingua e producono output in un'altra. Ad esempio, il compilatore di Eiffel Software accetta input in linguaggio Eiffel e produce C. GCC per Intel legge input in linguaggio C e produce assembly x86. L'assemblatore GAS per Intel accetta l'assemblaggio x86 e produce il codice oggetto x86. Tutte e tre queste cose sono tecnicamente compilatori.

Indipendentemente dal formato, l'input letto da un compilatore è chiamato sorgente e l'output è chiamato destinazione . Quest'ultimo termine è tratto da una delle sue definizioni, "risultato previsto".

La maggior parte dei compilatori è progettata per produrre codice assembly o oggetto per un particolare processore o architettura. Per questo motivo , la destinazione viene spesso utilizzata per fare riferimento all'architettura stessa anziché al formato di output.

La destinazione di un compilatore non deve necessariamente essere la stessa dell'architettura in cui viene eseguita e, nei casi in cui ciò accade, il programma viene chiamato cross-compilatore . (Ad esempio, GCC può essere creato per essere eseguito su sistemi x86 per compilare C in assembly ARM.)

Inoltre, ci sono compilatori singoli in grado di produrre output per target diversi a seconda dell'input come switch sulla riga di comando. Questi sono chiamati compilatori multi-target .


2
Come nota a margine, potrebbe valere la pena ricordare che questo termine è anche usato in una forma più generalizzata nel contesto dei sistemi di compilazione: un obiettivo è un output da qualsiasi fase di compilazione, che non deve necessariamente essere un'azione di compilazione (ad es. creazione di un programma di installazione).
BartoszKP

2
i compilatori sono traduttori, non filtri.

1
@Birfl. ovviamente. "tr" significa tradurre, non filtrare. i filtri non sono traduttori, questo è ovvio.

2
@Birfl: non vado su Wikipedia. semplicemente producendo un flusso da un altro ssys niente. la distinzione tra filtri e traduttori è molto nota. un filtro include / esclude, in base a un predicato. non si trasforma. filtrare un elenco di numeri interi pari? e ottieni interi pari non trasformati. traduci lo stesso elenco usando inc e otterrai una versione trasformata dell'elenco originale.

1
il tuo account di compilation va bene tranne il termine "filtro".

4

Nella traduzione, sia che si tratti di un linguaggio naturale come l'inglese, sia di un linguaggio artificiale come C, utilizziamo la sorgente e il target della terminologia per parlare dell'input e dell'output di un sistema di traduzione. Nella traduzione in lingua naturale, il sistema è il cervello umano competente in grado di tradurre tra due lingue. Nei linguaggi di programmazione, è un compilatore.

Pertanto, l' origine di un compilatore è il linguaggio di programmazione (C), mentre l' obiettivo è il bytecode (istruzioni a livello di macchina). Usiamo spesso target in compilation perché sistemi diversi (architetture CPU) hanno set di istruzioni diversi, ad esempio ARM, MIPS, ecc. Il compilatore deve sapere quale set di istruzioni è il target, in modo che possa creare l'output corretto (bytecode).


0

WebAssemby è qualcosa di più recente e più grande, che converte il codice c / c ++ in formato binario.

  • WebAssembly mira a eseguire a velocità nativa sfruttando l'hardware comune. Ha progettato per integrarsi con la piattaforma web.

Ecco il link in cui è possibile visualizzare un'applicazione, la velocità con cui converte il semplice programma fattoriale in codice macchina.

Dai un'occhiata a questa bestia, https://godbolt.org/

È possibile utilizzare questo programma di esempio per eseguire in quel sito per vedere assembly.

# include<stdio.h>

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

int main() {
    int res = square(4);
    printf("%d\n",res);
  return 0;
}
  • Definire un formato binario portatile, efficiente in termini di dimensioni e tempo di caricamento che funga da obiettivo di compilazione che può essere compilato per essere eseguito a velocità nativa sfruttando le funzionalità hardware comuni disponibili su una vasta gamma di piattaforme, tra cui mobile e IoT.

Alcune informazioni di base su host e target, su come il linguaggio di programmazione viene tradotto in 10101010.

host=>pc :(windows, iOS, Linux, zOS, Solaris..etc)
target=>CPUhardware: (Intel x86, ARM, PowerPC, etc)
  1. GCC converte il codice C / C ++ in codice assembly. Uno strumento chiamato "assemblatore" converte il codice assembly in codice macchina e uno strumento chiamato "linker" collega più file di codice macchina in un unico file eseguibile (.EXE sotto Windows). La maggior parte di questi compilatori consente di scrivere il codice assembler risultante in un file in modo da poter guardare il codice assembler o modificarlo.

  2. L'assemblatore e il linker fanno parte della catena degli strumenti, il che significa che vengono generalmente forniti insieme al compilatore.

  3. Alcuni compilatori (come Microsoft) tuttavia convertono direttamente il codice C / C ++ in linguaggio macchina, quindi non è più necessario alcun assemblatore. Molti di questi compilatori non sono in grado di creare codice assembler, quindi non è possibile scrivere il codice assembler in un file.

A proposito: ci sono anche compilatori (non per C / C ++, ma per altri linguaggi di programmazione) che creano direttamente un file .EXE, quindi non è richiesto alcun linker.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.