Qu’est-ce que le compilateur, l’éditeur de liens, le chargeur?

Je voulais connaître en profondeur le fonctionnement du compilateur, de l’éditeur de liens et du chargeur. En référence à une langue de préférence c ++.

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

    Préprocesseur C: –

    Le prétraitement C est la première étape de la compilation. Il gère:

    1. #define déclarations.
    2. #include déclarations.
    3. Expressions conditionnelles.
    4. Macros

    Le but de l’unité est de convertir le fichier source C en fichier de code Pure C.

    C compilation:

    Il y a six étapes dans l’unité:

    1) parsingur lexical:

    Il combine des caractères dans le fichier source pour former un “TOKEN”. Un jeton est un ensemble de caractères sans «espace», «tabulation» et «nouvelle ligne». Par conséquent, cette unité de compilation est également appelée “TOKENIZER”. Il supprime également les commentaires, génère des entrées de table de symboles et de table de relocalisation.

    2) Analyseur syntaxique:

    Cette unité vérifie la syntaxe dans le code. Pour ex:

     { int a; int b; int c; int d; d = a + b - c * ; } 

    Le code ci-dessus générera l’erreur d’parsing car l’équation n’est pas équilibrée. Cette unité vérifie cela en interne en générant l’arborescence de l’parsingur comme suit:

      = / \ d - / \ + * / \ / \ abc ? 

    Par conséquent, cet appareil est également appelé PARSER.

    3) Analyseur sémantique:

    Cette unité vérifie la signification dans les déclarations. Pour ex:

     { int i; int *p; p = i; ----- ----- ----- } 

    Le code ci-dessus génère l’erreur “Affectation de type incompatible”.

    4) Pré-optimisation:

    Cette unité est indépendante de la CPU, c’est-à-dire qu’il existe deux types d’optimisation

    1. Préoptimisation (indépendante du processeur)
    2. Post-optimisation (dépend de la CPU)

    Cette unité optimise le code sous les formes suivantes:

    • I) Élimination du code mort
    • II) Élimination du sous-code
    • III) Optimisation de la boucle

    I) Élimination du code mort:

    Pour ex:

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

    Ici, le compilateur connaît la valeur de ‘a’ au moment de la compilation, donc il sait aussi que la condition if est toujours vraie. Par conséquent, il élimine la partie autre dans le code.

    II) Élimination du sous-code:

    Pour ex:

     { int a, b, c; int x, y; /* ... */ x = a + b; y = a + b + c; /* ... */ } 

    peut être optimisé comme suit:

     { int a, b, c; int x, y; /* ... */ x = a + b; y = x + c; // a + b is replaced by x /* ... */ } 

    III) Optimisation de la boucle:

    Pour ex:

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

    Dans le code ci-dessus, si «a» est local et non utilisé dans la boucle, il peut être optimisé comme suit:

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

    5) génération de code:

    Ici, le compilateur génère le code de l'assemblage afin que les variables les plus fréquemment utilisées soient stockées dans les registres.

    6) Post-optimisation:

    Ici, l'optimisation dépend de la CPU. Supposons que s'il y a plus d'un saut dans le code, ils sont convertis en un comme:

      ----- jmp:  jmp: ----- ----- 

    Le contrôle saute directement au contrôle.

    Ensuite, la dernière phase est la liaison (qui crée un exécutable ou une bibliothèque). Lorsque l'exécutable est exécuté, les bibliothèques requirejses sont chargées.

    • Un compilateur lit, parsing et traduit le code en un fichier object ou une liste de messages d’erreur.
    • Un éditeur de liens combine un ou plusieurs fichiers d’object et un code de bibliothèque possible dans un fichier exécutable, une bibliothèque ou une liste de messages d’erreur.
    • Un chargeur lit le code exécutable en mémoire, effectue une traduction d’adresse et tente d’exécuter le programme résultant en un programme en cours d’exécution ou un message d’erreur (ou les deux).

    Représentation ASCII:

     [Source Code] ---> Comstackr ---> [Object code] --* | [Source Code] ---> Comstackr ---> [Object code] --*--> Linker --> [Executable] ---> Loader | | [Source Code] ---> Comstackr ---> [Object code] --* | | | [Library file]--* V [Running Executable in Memory] 

    J’espère que cela vous aidera un peu plus.

    Tout d’abord, parcourez ce diagramme:

      (img source->internet) 

    source-/> internet”></p>
<p>  Vous faites un morceau de code et enregistrez le fichier (code source), puis </p>
<p>  <strong>Pré</strong> – <strong>traitement</strong> : – Comme son nom l’indique, cela ne fait pas partie de la compilation.  Ils demandent au compilateur de faire le prétraitement requirejs avant la compilation proprement dite.  Vous pouvez appeler cette phase Substitution de texte ou interpréter des directives spéciales de préprocesseur notées #. </p>
<p>  <strong>Compilation</strong> : – La compilation est un processus dans lequel un programme écrit dans une langue est traduit dans une autre langue ciblée.  S’il y a des erreurs, le compilateur les détectera et les signalera. </p>
<p>  <strong>Assembler</strong> : – Assembler le code se traduit en code machine.  Vous pouvez appeler assembleur un type particulier de complicateur. </p>
<p>  <strong>Liaison</strong> : – Si ces parties de code ont besoin d’un autre fichier source pour être lié, l’éditeur de liens les lie pour en faire un fichier exécutable. </p>
<p>  Il y a beaucoup de processus qui se produisent après.  Oui, vous l’avez deviné, voici le rôle du chargeur: </p>
<p>  <strong>Loader</strong> : – Charge le code exécutable en mémoire;  programme et stack de données sont créés, le registre est initialisé. </p>
<p>  Little Extra info: – <a href=http://www.geeksforgeeks.org/memory-layout-of-c-program/ , vous pouvez voir la disposition de la mémoire là-bas.

    Compilateur: C’est un programme qui traduit un programme de langage de haut niveau en un programme en langage machine. Un compilateur est plus intelligent qu’un assembleur. Il vérifie toutes sortes de limites, plages, erreurs, etc. Mais le temps d’exécution de son programme est plus important et occupe une plus grande partie de la mémoire. Il a une vitesse lente. Parce qu’un compilateur parcourt l’intégralité du programme, puis traduit l’intégralité du programme en codes machine. Si un compilateur s’exécute sur un ordinateur et produit les codes machine pour le même ordinateur, il est appelé compilateur autonome ou résident. Par contre, si un compilateur s’exécute sur un ordinateur et produit les codes machine pour un autre ordinateur, il est appelé compilateur croisé.

    Linker: Dans les langages de haut niveau, certains fichiers d’en-tête ou bibliothèques intégrés sont stockés. Ces bibliothèques sont prédéfinies et contiennent des fonctions de base indispensables à l’exécution du programme. Ces fonctions sont liées aux bibliothèques par un programme appelé Linker. Si l’éditeur de liens ne trouve pas de bibliothèque d’une fonction, il informe le compilateur et le compilateur génère une erreur. Le compilateur appelle automatiquement l’éditeur de liens comme dernière étape de la compilation d’un programme. Non intégré dans les bibliothèques, il relie également les fonctions définies par l’utilisateur aux bibliothèques définies par l’utilisateur. Généralement, un programme plus long est divisé en sous-programmes plus petits appelés modules. Et ces modules doivent être combinés pour exécuter le programme. Le processus de combinaison des modules est effectué par l’éditeur de liens.

    Loader: Loader est un programme qui charge les codes machine d’un programme dans la mémoire système. En informatique, un chargeur est la partie d’un système d’exploitation responsable du chargement des programmes. C’est l’une des étapes essentielles du processus de démarrage d’un programme. Parce qu’il met les programmes en mémoire et les prépare à l’exécution. Le chargement d’un programme implique la lecture du contenu du fichier exécutable en mémoire. Une fois le chargement terminé, le système d’exploitation lance le programme en transmettant le contrôle au code du programme chargé. Tous les systèmes d’exploitation prenant en charge le chargement de programme ont des chargeurs. Dans de nombreux systèmes d’exploitation, le chargeur réside en permanence dans la mémoire.

    Wikipedia devrait avoir une bonne réponse, voici mes pensées:

    • Compilateur: lit quelque chose, source.écrit quelque chose.o object.
    • Linker: joint plusieurs fichiers * .o dans un programme exécutable.
    • Loader: code qui charge un exécutable en mémoire et le lance en cours d’exécution.

    Compilateur:

    Il lira le fichier source qui peut être de type .c ou .cpp etc et le traduit en fichier .o appelé fichier object.

    Linker:

    Il combine plusieurs fichiers .o pouvant être générés pour plusieurs fichiers sources dans un fichier exécutable (format ELF dans GCC). Il existe deux types de liens:

    • liaison statique
    • liaison dynamic

    Chargeur:

    Un programme qui charge le fichier exécutable dans la mémoire primaire de la machine.


    Pour une étude détaillée des trois étapes de l’exécution du programme sous Linux, veuillez lire ceci .

    *

    expliqué par rapport aux systèmes basés sur Linux / Unix, bien que ce soit un concept de base pour tous les autres systèmes informatiques.

    *

    Linkers and Loaders de LinuxJournal explique ce concept avec clarté. Il explique également comment le nom classique a.out est venu. (sortie assembleur)

    Un résumé rapide,

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

    nous avons l’exécutable, donnez maintenant ce fichier à votre ami ou à votre client qui a besoin de ce logiciel 🙂

    lorsqu’ils exécutent ce logiciel, dites-le en le tapant dans la ligne de commande ./a.out

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

    Une fois le programme chargé dans la mémoire, le contrôle est transféré à ce programme en faisant en sorte que le PC (compteur de programmes) pointe sur la première instruction de a.out

    Système d’exploitation: Un système d’exploitation (SE) est un logiciel système qui gère les ressources matérielles et logicielles de l’ordinateur et fournit des services communs aux programmes informatiques. Le système d’exploitation est un composant du logiciel système dans un système informatique. Les programmes d’application nécessitent généralement un système d’exploitation pour fonctionner.

    Compilateur: Un compilateur est un programme informatique (ou un ensemble de programmes) qui transforme le code source écrit dans un langage de programmation (la langue source) en un autre langage informatique (la langue cible), cette dernière ayant souvent une forme binary appelée object code.

    Interpreter: interpreter est un programme informatique qui exécute directement, c’est-à-dire exécute des instructions écrites dans un langage de programmation ou de script, sans les comstackr préalablement dans un programme de langage machine.

    Assembler: un assembleur est un programme qui prend des instructions de base sur l’ordinateur et les convertit en un modèle de bits que le processeur de l’ordinateur peut utiliser pour effectuer ses opérations de base.

    Loader: un chargeur est la partie d’un système d’exploitation responsable du chargement des programmes et des bibliothèques. C’est l’une des étapes essentielles du processus de démarrage d’un programme, car il met les programmes en mémoire et les prépare à l’exécution.

    Linker: linker est un programme qui combine des modules d’object pour former un programme exécutable.

    Preproccesor: Preproccesor est un outil de substitution de texte qui demande au compilateur d’effectuer le pré-traitement requirejs avant la compilation proprement dite.

    Les modifications du compilateur vérifient si votre code source contient des erreurs et le transforment en code object. Il s’agit du code exécuté par le système d’exploitation.

    Vous n’écrivez souvent pas tout un programme dans un seul fichier, donc l’éditeur de liens relie tous vos fichiers de code object.

    votre programme ne sera pas exécuté sauf s’il est dans la mémoire principale

    • Compilateur : qui convertit le format compréhensible par l’homme en format compréhensible par la machine
    • Linker : qui convertit le format compréhensible par la machine en format compréhensible par le système d’exploitation
    • Loader : entité qui charge et exécute le programme en RAM

    Linker & Interpreter sont des interpréteurs mutuellement exclusifs obtenant du code ligne par ligne et exécutant ligne par ligne.

    Un compilateur est un logiciel qui comstack les fichiers de code source du programme dans un programme exécutable. Il est inclus dans l’environnement de développement intégré IDE avec la plupart des logiciels de programmation. Le compilateur prend des fichiers de code source écrits dans un langage de haut niveau, tel que C, BASIC ou Java, et comstack le code dans un langage de bas niveau, tel que du code machine ou du code assembleur. Ce code est créé pour un type de processeur spécifique, tel que Intel Pentium ou PowerPC. Le programme peut alors être reconnu par le processeur et exécuté à partir du système d’exploitation.

    Loader est un utilitaire de système d’exploitation qui copie des programmes d’un périphérique de stockage vers la mémoire principale, où ils peuvent être exécutés. En plus de copier un programme dans la mémoire principale, le chargeur peut également remplacer les adresses virtuelles par des adresses physiques. La plupart des chargeurs sont transparents, c’est-à-dire que vous ne pouvez pas les exécuter directement, mais le système d’exploitation les utilise lorsque cela est nécessaire.

    Linker Est un programme qui ajuste plusieurs segments de programme en langage machine afin qu’ils puissent être chargés et exécutés simultanément en tant qu’unité. Aussi appelé éditeur de liens et classeur, un éditeur de liens est un programme qui combine des modules d’object pour former un programme exécutable. De nombreux langages de programmation vous permettent d’écrire des morceaux de code différents, appelés modules, séparément. Cela simplifie la tâche de programmation car vous pouvez diviser un grand programme en petits morceaux plus faciles à gérer. Finalement, vous devez assembler tous les modules. C’est le travail de l’éditeur de liens.

    Un compilateur est un programme spécial qui traite les instructions écrites dans un langage de programmation particulier et les transforme en langage machine ou “code” utilisé par le processeur d’un ordinateur.

    Un compilateur traduit les lignes de code du langage de programmation en langage machine.

    Un éditeur de liens crée un lien entre deux programmes.

    Un chargeur charge le programme en mémoire dans la firebase database principale, le programme, etc.

    Compilateur: c’est un logiciel système qui corrige les erreurs des programmes, fichiers objects, messages, etc.

    Linker: il s’agit d’un logiciel système qui combine un ou plusieurs fichiers d’object et un code de bibliothèque possible dans une bibliothèque ou une liste d’erreur

    Loader: programme qui charge le fichier exécutable dans la mémoire primaire de la machine