Was genau ist ein Kompilierungsziel?

17

Ich höre den Begriff immer wieder und alle Google-Suchen führen mich zu Artikeln über Compiler. Ich möchte nur verstehen, was der Begriff Kompilierungsziel bedeutet: |

UPDATE: Um einen Kontext zu geben: Ich habe gehört, dass Web Assembly ein Kompilierungsziel für andere Sprachen wie C, C ++, Rust usw. ist.

ScionOfBytes
quelle
Ich rate Ihnen, die Artikel über Compiler zu lesen.
4
Artikel über Compiler setzen voraus, dass Sie dies bereits wissen. Das ist eine vernünftige Frage.
Karl Bielefeldt
Ich habe mehr über Wikipedia-Artikel nachgedacht. Und ich stimme der Frage angemessen zu. Es war nur ein Vorschlag, keine Kritik.
4
Die Frage ist vernünftig, aber schlecht geschrieben. Der Begriff "Ziel" kann unterschiedliche Bedeutungen haben, daher würde ich empfehlen, einen Verweis oder einen weiteren Kontext anzugeben, in dem Sie ihn gehört oder darüber gelesen haben.
Doc Brown
@DocBrown Ich habe es in vielen Zusammenhängen gehört, aber in letzter Zeit im Zusammenhang mit Webassembly als Kompilierungsziel für andere Sprachen.
ScionOfBytes

Antworten:

17

Compiler sind im Wesentlichen Übersetzer, die Eingaben in einer Sprache erfassen und Ausgaben in einer anderen erzeugen. Beispielsweise verwendet der Compiler von Eiffel Software Eingaben in Eiffelsprache und erstellt C. GCC für Intel liest Eingaben in C-Sprache und erstellt x86-Assemblys. Der GAS-Assembler für Intel übernimmt die x86-Assembly und erstellt den x86-Objektcode. Alle drei Dinge sind technisch gesehen Compiler.

Unabhängig vom Format wird die von einem Compiler gelesene Eingabe als Quelle und die Ausgabe als Ziel bezeichnet . Der letztere Begriff stammt aus einer seiner Definitionen, "beabsichtigtes Ergebnis".

Die Mehrheit der Compiler ist darauf ausgelegt, Assembly- oder Objektcode für einen bestimmten Prozessor oder eine bestimmte Architektur zu erstellen. Aus diesem Grund, Ziel häufig verwendet, um auf die Architektur selbst und nicht auf das Ausgabeformat zu verweisen.

Das Ziel eines Compilers muss nicht mit der Architektur identisch sein, auf der er ausgeführt wird. In solchen Fällen wird das Programm als Cross-Compiler bezeichnet . (Zum Beispiel kann GCC so erstellt werden, dass es auf x86-Systemen ausgeführt wird, um C in eine ARM-Assembly zu kompilieren.)

Darüber hinaus gibt es einzelne Compiler, die in der Lage sind, je nach Eingabe, z. B. Schalter in der Befehlszeile, Ausgaben für verschiedene Ziele zu erstellen. Diese werden als Multi-Target- Compiler bezeichnet.

Blrfl
quelle
2
Als Randnotiz ist zu erwähnen, dass dieser Begriff auch im Kontext von Build-Systemen in einer allgemeineren Form verwendet wird - ein Ziel ist eine Ausgabe eines beliebigen Build-Schritts, bei dem es sich nicht unbedingt um eine Kompilierungsaktion handeln muss (z. B. Erstellen eines Installationsprogramms).
BartoszKP
2
Compiler sind Übersetzer, keine Filter.
1
@Birfl. offensichtlich. "tr" bedeutet übersetzen, nicht filtern. filter sind keine übersetzer, das liegt auf der hand.
2
@Birfl: Ich gehe nicht von Wikipedia. Nur einen Stream von einem anderen ssys nichts zu produzieren. Die Unterscheidung zwischen Filtern und Übersetzern ist sehr bekannt. Ein Filter schließt ein / aus, basierend auf einem Prädikat. es verwandelt sich nicht. eine Liste von ganzen Zahlen nach Gerade filtern? und Sie bekommen sogar ganze Zahlen untransformiert. Übersetzen Sie dieselbe Liste mit inc und Sie erhalten eine transformierte Version der ursprünglichen Liste.
1
Ihr Konto der Zusammenstellung ist außer dem Begriff "Filter" in Ordnung.
4

In der Übersetzung, ob die Sprache eine natürliche Sprache wie Englisch ist, oder eine künstliche wie C, verwenden wir die Terminologie Quelle und Ziel zu sprechen über die Eingabe und Ausgabe eines Übersetzungssystems. Bei der Übersetzung natürlicher Sprachen ist das System das kompetente menschliche Gehirn, das in der Lage ist, zwischen zwei Sprachen zu übersetzen. In Programmiersprachen ist es ein Compiler.

Die Quelle für einen Compiler ist daher die Programmiersprache (C), während das Ziel der Bytecode (Anweisungen auf Maschinenebene) ist. Wir verwenden Target häufig beim Kompilieren, weil verschiedene Systeme (CPU-Architekturen) unterschiedliche Befehlssätze haben, z. B. ARM, MIPS usw. Der Compiler muss wissen, welcher Befehlssatz das Ziel ist, damit er die richtige Ausgabe (Bytecode) erstellen kann.

Chris Cirefice
quelle
0

WebAssemby ist etwas Neuestes und Größtes, das den c / c ++ - Code in ein Binärformat konvertiert.

  • WebAssembly soll mit nativer Geschwindigkeit ausgeführt werden, indem die gemeinsame Hardware genutzt wird. Es wurde für die Integration in die Webplattform entwickelt.

Hier ist der Link, wo eine der Anwendungen sehen kann, wie schnell sie das einfache Fakultätsprogramm in Maschinencode umwandelt.

Überprüfen Sie dieses Biest, https://godbolt.org/

Mit diesem Beispielprogramm können Sie auf dieser Site die Assembly anzeigen.

# include<stdio.h>

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

int main() {
    int res = square(4);
    printf("%d\n",res);
  return 0;
}
  • Definieren Sie ein portables, größen- und Ladezeit-effizientes Binärformat als Kompilierungsziel, das kompiliert werden kann, um mit nativer Geschwindigkeit ausgeführt zu werden, indem Sie die allgemeinen Hardwarefunktionen nutzen, die auf einer Vielzahl von Plattformen verfügbar sind, einschließlich mobiler und IoT.

Einige grundlegende Informationen zu Host und Ziel, wie die Programmiersprache in 10101010 übersetzt wird.

host=>pc :(windows, iOS, Linux, zOS, Solaris..etc)
target=>CPUhardware: (Intel x86, ARM, PowerPC, etc)
  1. GCC konvertiert den C / C ++ - Code in Assembler-Code. Ein Tool namens "Assembler" konvertiert den Assemblycode in Maschinencode und ein Tool namens "Linker" verbindet mehrere Maschinencodedateien zu einer einzigen ausführbaren Datei (.EXE unter Windows). Mit den meisten dieser Compiler können Sie den resultierenden Assembler-Code in eine Datei schreiben, um den Assembler-Code anzuzeigen oder zu ändern.

  2. Der Assembler und der Linker sind Teil der Toolkette, was bedeutet, dass sie normalerweise zusammen mit dem Compiler ausgeliefert werden.

  3. Einige Compiler (wie Microsoft) konvertieren jedoch C / C ++ - Code direkt in Maschinensprache, sodass kein Assembler mehr benötigt wird. Viele dieser Compiler können keinen Assembler-Code erstellen, sodass Sie den Assembler-Code nicht in eine Datei schreiben können.

Übrigens: Es gibt sogar Compiler (nicht für C / C ++, sondern für andere Programmiersprachen), die direkt eine .EXE-Datei erstellen, sodass kein Linker erforderlich ist.

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

baumelnder Zeiger
quelle