it-swarm.dev

Was ist Compiler, Linker, Loader?

Ich wollte die Bedeutung und das Funktionieren von Compiler, Linker und Loader eingehend kennen. Mit Bezug auf jede Sprache, vorzugsweise c ++.

95
Sachin
=====> COMPILATION PROCESS <======

                     |
                     |---->  Input is Source file(.c)
                     |
                     V
            +=================+
            |                 |
            | C Preprocessor  |
            |                 |
            +=================+
                     |
                     | ---> Pure C file ( comd:cc -E <file.name> )
                     |
                     V
            +=================+
            |                 |
            | Lexical Analyzer|
            |                 |
            +-----------------+
            |                 |
            | Syntax Analyzer |
            |                 |
            +-----------------+
            |                 |
            | Semantic Analyze|
            |                 |
            +-----------------+
            |                 |
            | Pre Optimization|
            |                 |
            +-----------------+
            |                 |
            | Code generation |
            |                 |
            +-----------------+
            |                 |
            | Post Optimize   |
            |                 |
            +=================+
                     |
                     |--->  Assembly code (comd: cc -S <file.name> )
                     |
                     V
            +=================+
            |                 |
            |   Assembler     |
            |                 |
            +=================+
                     |
                     |--->  Object file (.obj) (comd: cc -c <file.name>)
                     |
                     V
            +=================+
            |     Linker      |
            |      and        |
            |     loader      |
            +=================+
                     |
                     |--->  Executable (.Exe/a.out) (com:cc <file.name> ) 
                     |
                     V
            Executable file(a.out)

C Vorprozessor: -

C-Vorverarbeitung ist der erste Schritt der Kompilierung. Es behandelt:

  1. #define-Anweisungen.
  2. #include-Anweisungen.
  3. Bedingte Anweisungen.
  4. Makros

Der Zweck des Geräts besteht darin, die C-Quelldatei in eine Pure C-Codedatei zu konvertieren.

C-Zusammenstellung:

Es gibt sechs Schritte in der Einheit:

1) Lexikalischer Analysator:

Es kombiniert Zeichen in der Quelldatei, um ein "TOKEN" zu bilden. Ein Token ist eine Menge von Zeichen ohne Leerzeichen, Tabulatorträger und neue Zeile. Diese Einheit wird daher auch als "TOKENIZER" bezeichnet. Es entfernt auch die Kommentare, generiert Symboltabellen- und Verschiebungstabelleneinträge.

2) Syntaktischer Analysator:

Diese Einheit prüft die Syntax im Code. Für ex:

{
    int a;
    int b;
    int c;
    int d;

    d = a + b - c *   ;
}

Der obige Code erzeugt den Parser-Fehler, da die Gleichung nicht ausgewogen ist. Diese Einheit prüft dies intern, indem sie den Parserbaum als Generiert.

                            =
                          /   \
                        d       -
                              /     \
                            +           *
                          /   \       /   \
                        a       b   c       ?

Daher wird diese Einheit auch als PARSER bezeichnet.

3) Semantischer Analysator:

Diese Einheit prüft die Bedeutung in den Anweisungen. Für ex:

{
    int i;
    int *p;

    p = i;
    -----
    -----
    -----
}

Der obige Code generiert den Fehler "Zuordnung eines inkompatiblen Typs".

4) Voroptimierung:

Diese Einheit ist unabhängig von der CPU, d. H. Es gibt zwei Arten der Optimierung

  1. Voroptimierung (CPU-unabhängig)
  2. Postoptimierung (CPU-abhängig)

Diese Einheit optimiert den Code in den folgenden Formen:

  • I) Tote Code-Beseitigung
  • II) Subcode-Eliminierung
  • III) Schleifenoptimierung

I) Eliminierung toter Codes:

Für ex: 

{
    int a = 10;
    if ( a > 5 ) {
        /*
        ...
        */
    } else {
       /*
       ...
       */
    }
}

Hier kennt der Compiler zur Kompilierzeit den Wert von 'a', daher weiß er auch, dass die if-Bedingung immer wahr ist. Daher wird der else-Teil im Code entfernt.

II) Subcode-Beseitigung:

Für ex:

{
    int a, b, c;
    int x, y;

    /*
    ...
    */

    x = a + b;
    y = a + b + c;

    /*
    ...
    */
}

kann wie folgt optimiert werden:

{
    int a, b, c;
    int x, y;

    /*
     ...
    */

    x = a + b;
    y = x + c;      // a + b is replaced by x

    /*
     ...
    */
}

III) Schleifenoptimierung:

Für ex:

{
    int a;
    for (i = 0; i < 1000; i++ ) {

    /*
     ...
    */

    a = 10;

    /*
     ...
    */
    }
}

Wenn im obigen Code 'a' lokal ist und nicht in der Schleife verwendet wird, kann es wie folgt optimiert werden:

{
    int a;
    a = 10;
    for (i = 0; i < 1000; i++ ) {
        /*
        ...
        */
    }
}

5) Codegenerierung:

Hier generiert der Compiler den Assembly-Code, sodass die häufiger verwendeten Variablen in den Registern gespeichert werden.

6) Nachoptimierung:

Hier ist die Optimierung CPU-abhängig. Angenommen, es gibt mehr als einen -Sprung im Code, dann werden sie in einen als:

            -----
        jmp:<addr1>
<addr1> jmp:<addr2>
            -----
            -----

Die Steuerung springt direkt zum.

Die letzte Phase ist das Verknüpfen (wodurch die ausführbare Datei oder Bibliothek erstellt wird). Wenn die ausführbare Datei ausgeführt wird, werden die benötigten Bibliotheken geladen.

159
user3334053
  • Ein Compiler liest, analysiert und übersetzt Code in eine Objektdatei oder eine Liste von Fehlernachrichten.
  • Ein Linker kombiniert eine oder mehrere Objektdateien und möglicherweise etwas Bibliothekscode in einer ausführbaren Datei, einer Bibliothek oder einer Liste von Fehlermeldungen.
  • Ein Loader liest den ausführbaren Code in den Speicher, führt einige Adressübersetzungen durch und versucht, das Programm auszuführen, was zu einem laufenden Programm oder einer Fehlermeldung (oder beiden) führt.

ASCII-Darstellung:

[Source Code] ---> Compiler ---> [Object code] --*
                                                 |
[Source Code] ---> Compiler ---> [Object code] --*--> Linker --> [Executable] ---> Loader 
                                                 |                                    |
[Source Code] ---> Compiler ---> [Object code] --*                                    |
                                                 |                                    |
                                 [Library file]--*                                    V
                                                                       [Running Executable in Memory]
115
Toon Krijthe

Hoffe das hilft dir ein bisschen mehr.

Gehen Sie zuerst dieses Diagramm durch:

                         (img source->internet)

source->internet

Sie machen ein Stück Code und speichern die Datei (Quellcode)

Preprocessing: - Wie der Name schon sagt, ist es nicht Teil der Kompilierung. Sie weisen den Compiler an, die erforderliche Vorverarbeitung vor der eigentlichen Kompilierung durchzuführen. Sie können diese Phase als Textsubstitution oder Interpretation spezieller Präprozessoranweisungen aufrufen, die mit # gekennzeichnet sind. 

Compilation: - Compilation ist ein Prozess, bei dem ein Programm, das in einer Sprache geschrieben ist, in eine andere Zielsprache übersetzt wird. Bei Fehlern werden sie vom Compiler erkannt und gemeldet.

Assemble: - Assembler-Code wird in Maschinencode übersetzt. Sie können Assembler einen speziellen Complieretyp nennen.

Linking: - Wenn für diesen Code eine andere Quelldatei benötigt wird, verknüpfen Sie diese mit dem Linker, um eine ausführbare Datei zu erstellen. 

Es gibt viele Prozesse, die danach passieren. Ja, Sie haben es erraten, hier kommt die Rolle des Laders:

Loader: - Der ausführbare Code wird in den Speicher geladen. Programm und Datenstack werden erstellt, das Register wird initialisiert. 

Kleine Extra-Info: - http://www.geeksforgeeks.org/memory-layout-of-c-program/ Sie können das Speicherlayout dort sehen. 

27
Anurag Bhakuni

Compiler: Ein Programm, das ein Hochsprachenprogramm in ein Maschinensprachenprogramm übersetzt. Ein Compiler ist intelligenter als ein Assembler. Es prüft alle Arten von Grenzwerten, Bereichen, Fehlern usw. Die Programmlaufzeit ist jedoch länger und beansprucht einen größeren Teil des Speichers. Es hat langsame Geschwindigkeit. Weil ein Compiler das gesamte Programm durchläuft und das gesamte Programm dann in Maschinencodes übersetzt. Wenn ein Compiler auf einem Computer ausgeführt wird und die Maschinencodes für denselben Computer erzeugt, wird er als Selbstcompiler oder residenter Compiler bezeichnet. Wenn dagegen ein Compiler auf einem Computer ausgeführt wird und die Maschinencodes für andere Computer erzeugt, wird er als Cross-Compiler bezeichnet.

Linker: In Hochsprachen werden einige eingebaute Header-Dateien oder Bibliotheken gespeichert. Diese Bibliotheken sind vordefiniert und enthalten grundlegende Funktionen, die für die Ausführung des Programms unerlässlich sind. Diese Funktionen sind durch ein Programm namens Linker mit den Bibliotheken verbunden. Wenn der Linker eine Bibliothek einer Funktion nicht findet, informiert er den Compiler, und der Compiler generiert einen Fehler. Der Compiler ruft den Linker automatisch als letzten Schritt beim Kompilieren eines Programms auf. Nicht in Bibliotheken gebaut, verknüpft er auch die benutzerdefinierten Funktionen mit den benutzerdefinierten Bibliotheken. Normalerweise wird ein längeres Programm in kleinere Unterprogramme unterteilt, die als Module bezeichnet werden. Und diese Module müssen kombiniert werden, um das Programm auszuführen. Das Kombinieren der Module übernimmt der Linker.

Loader: Loader ist ein Programm, das Maschinencodes eines Programms in den Systemspeicher lädt. In Computing ist ein Loader der Teil eines Betriebssystems, der für das Laden von Programmen verantwortlich ist. Dies ist einer der wesentlichen Schritte beim Start eines Programms. Weil es Programme in den Speicher legt und für die Ausführung vorbereitet. Beim Laden eines Programms werden die Inhalte der ausführbaren Datei in den Speicher gelesen. Sobald das Laden abgeschlossen ist, startet das Betriebssystem das Programm, indem die Steuerung an den geladenen Programmcode übergeben wird. Alle Betriebssysteme, die das Laden von Programmen unterstützen, verfügen über Lader. In vielen Betriebssystemen befindet sich der Loader permanent im Speicher. 

15
Tanu Saxena

Wikipedia sollte eine gute Antwort haben, hier meine Gedanken:

  • Compiler: liest etwas.c Quelle, schreibt etwas.o Objekt.
  • Linker: fügt mehrere * .o-Dateien in ein ausführbares Programm ein.
  • Loader: Code, mit dem eine ausführbare Datei in den Speicher geladen und gestartet wird.
11
RedGrittyBrick

Compiler:

Es liest eine Quelldatei, die vom Typ .c oder .cpp usw. sein kann, und übersetzt diese in eine .o-Datei, die als Objektdatei bezeichnet wird.

Linker:

Es kombiniert die verschiedenen .o-Dateien, die für mehrere Quelldateien generiert werden können, in einer ausführbaren Datei (ELF-Format in GCC). Es gibt zwei Arten der Verknüpfung:

  • statische Verknüpfung
  • dynamische Verknüpfung

Lader:

Ein Programm, das die ausführbare Datei in den Hauptspeicher des Computers lädt.


Für eine detaillierte Untersuchung dieser drei Phasen der Programmausführung unter Linux lesen Sie bitte lesen Sie diese .

4
Raghu

*

erklärt in Bezug auf Linux/Unix-basierte Systeme, obwohl es ein Grundkonzept für alle anderen Computersysteme ist.

*

Linkers and Loaders vom LinuxJournal erklärt dieses Konzept mit Klarheit. Es erklärt auch, wie der klassische Name a.out kam. (Assembler-Ausgabe)

Eine kurze Zusammenfassung,

c program --> [compiler] --> objectFile --> [linker] --> executable file (say, a.out)

wir haben die ausführbare Datei, geben Sie diese Datei jetzt an Ihren Freund oder an Ihren Kunden weiter, der diese Software benötigt :)

wenn sie diese Software ausführen, geben Sie sie beispielsweise in die Befehlszeile ./a.out ein

execute in command line ./a.out --> [Loader] --> [execve] --> program is loaded in memory

Sobald das Programm in den Speicher geladen ist, wird die Steuerung auf dieses Programm übertragen, indem der PC (Programmzähler) auf den ersten Befehl von a.out zeigt.

3
tsenapathy

Betriebssystem: Ein Betriebssystem (Betriebssystem) ist Systemsoftware, die Computerhardware- und -software-Ressourcen verwaltet und allgemeine Dienste für Computerprogramme bereitstellt. Das Betriebssystem ist eine Komponente der Systemsoftware in einem Computersystem. Anwendungsprogramme erfordern normalerweise ein Betriebssystem, um zu funktionieren.

Compiler: Ein Compiler ist ein Computerprogramm (oder eine Gruppe von Programmen), das in einer Programmiersprache (der Quellsprache) geschriebenen Quellcode in eine andere Computersprache (die Zielsprache) umwandelt, wobei die letztere häufig eine als Objekt bezeichnete binäre Form hat Code.

Interpreter: Interpreter ist ein Computerprogramm, das Anweisungen, die in einer Programmiersprache oder Skriptsprache geschrieben sind, direkt ausführt, d. H. Ausführt, ohne sie zuvor in ein Maschinensprachenprogramm zu übersetzen.

Assembler: Ein Assembler ist ein Programm, das grundlegende Computeranweisungen in ein Bitmuster umwandelt, das der Prozessor des Computers zur Ausführung seiner grundlegenden Operationen verwenden kann.

Loader: Ein Loader ist der Teil eines Betriebssystems, der für das Laden von Programmen und Bibliotheken zuständig ist. Es ist eine der wesentlichen Phasen beim Starten eines Programms, da es Programme in den Speicher speichert und für die Ausführung vorbereitet.

Linker: Linker ist ein Programm, das Objektmodule zu einem ausführbaren Programm kombiniert.

Preproccesor: Preproccesor ist ein Textsubstitutionswerkzeug, das den Compiler anweist, die erforderliche Vorverarbeitung vor der eigentlichen Kompilierung durchzuführen.

2
Shylesh Prabhu

Ein Compiler ist ein Softwareprogramm, das Programmquellcodedateien in ein ausführbares Programm kompiliert. Es ist Bestandteil der integrierten Entwicklungsumgebung IDE der meisten Programmiersoftwarepakete .. _ Der Compiler nimmt Quellcodedateien, die in einer übergeordneten Sprache geschrieben sind, z. B. C, BASIC oder Java und kompiliert den Code in eine einfache Sprache, z. B. Maschinencode oder Assemblycode. Dieser Code wird für einen bestimmten Prozessortyp erstellt, z. B. für Intel Pentium oder PowerPC. Das Programm kann dann vom Prozessor erkannt und vom Betriebssystem ausgeführt werden. 

Loader ist ein Betriebssystem-Dienstprogramm, das Programme von einem Speichergerät in den Hauptspeicher kopiert, wo sie ausgeführt werden können. Neben dem Kopieren eines Programms in den Hauptspeicher kann der Loader auch virtuelle Adressen durch physische Adressen ersetzen. .__ Die meisten Loader sind transparent, d. H. Sie können sie nicht direkt ausführen, aber das Betriebssystem verwendet sie bei Bedarf. 

Linker Ist ein Programm, das zwei oder mehr Maschinensprachen-Programmabschnitte so einstellt, dass sie gleichzeitig als Einheit geladen und ausgeführt werden können. Ein Linker ist ein Programm, das Objektmodule zu einem ausführbaren Programm zusammenfasst . In vielen Programmiersprachen können Sie verschiedene Codeteile, so genannte Module, separat schreiben. Dies vereinfacht die Programmieraufgabe, da Sie ein großes Programm in kleine, überschaubare Teile aufteilen können. Schließlich müssen Sie jedoch alle Module zusammenstellen. Dies ist die Aufgabe des Linkers.

1
Firaol kapita

compiler-Änderungen prüfen Ihren Quellcode auf Fehler und ändern ihn in Objektcode. Dies ist der Code, den das Betriebssystem ausführt.

Sie schreiben häufig nicht ein gesamtes Programm in einer einzigen Datei, daher werden alle Ihre Objektcode-Dateien mit dem Linker verknüpft.

ihr Programm wird nicht ausgeführt, es sei denn, es befindet sich im Hauptspeicher

1
  • Compiler: Ein Sprachübersetzer, der ein vollständiges -Programm in Maschinensprache konvertiert, um ein -Programm zu erstellen, das der Computer in seiner Gesamtheit verarbeiten kann.
  • Linker: Hilfsprogramm, das eine oder mehrere kompilierte Objektdateien in eine ausführbare Datei oder eine andere Objektdatei überführt.
  • Loader: Lädt den ausführbaren Code in den Speicher , Erstellt das Programm und den Datenstack , Initialisiert die Register Und startet den Code.
1
lucy
  • Compiler : Welches vom Menschen verständliche Format in ein maschinenverständliches Format konvertieren
  • Linker : Welches maschinenverständliche Format in ein vom Betriebssystem verständliches Format konvertieren
  • Loader : ist eine Entität, die das Programm tatsächlich in den RAM lädt und ausführt

Linker und Interpreter schließen sich gegenseitig aus Interpreter erhält Code Zeile für Zeile und führt Zeile für Zeile aus.

1
Sugat Mankar

Compiler: Dies ist eine Systemsoftware, die Fehler von Programmen, Objektdateien, Meldungen usw. Korrigiert

Linker: Es handelt sich um eine Systemsoftware, die eine oder mehrere Objektdateien und möglicherweise etwas Bibliothekscode in entweder eine bestimmte Bibliothek oder eine Fehlerliste kombiniert

Loader: Ein Programm, das die ausführbare Datei in den Hauptspeicher der Maschine lädt

0
Abinasha Das

Ein Compiler übersetzt Codezeilen aus der Programmiersprache in Maschinensprache.

Ein Linker erstellt eine Verbindung zwischen zwei Programmen.

Ein Loader lädt das Programm in den Speicher in der Hauptdatenbank, im Programm usw.

Ein Compiler ist ein spezielles Programm, das Anweisungen verarbeitet, die in einer bestimmten Programmiersprache geschrieben sind, und diese in Maschinensprache oder "Code" umwandeln, den der Prozessor eines Computers verwendet