Je voulais connaître en profondeur le sens et le fonctionnement du compilateur, de l'éditeur de liens et du chargeur .
=====> 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)
Le prétraitement est la première étape de la compilation. Il gère:
#define
déclarations.#include
déclarations.Le but de l’unité est de convertir le fichier source C en fichier de code Pure C.
Il y a six étapes dans l'unité:
Il combine des caractères dans le fichier source, pour former un "JETON". Un jeton .__ est un ensemble de caractères ne comportant pas d'espace, de tabulation ni de nouvelle ligne . Par conséquent, cette unité de compilation s'appelle également "TOKENIZER". Il supprime également les commentaires, génère les entrées de la table des symboles et de la table de relocalisation.
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'analyse car l'équation n'est pas équilibrée Cette unité vérifie cela en interne en générant l’arborescence de l’analyseur comme suit:
=
/ \
d -
/ \
+ *
/ \ / \
a b c ?
Par conséquent, cette unité s'appelle également PARSER.
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".
Cette unité est indépendante de la CPU, c’est-à-dire qu’il existe deux types d’optimisation.
Cette unité optimise le code sous les formes suivantes:
Pour ex:
{
int a = 10;
if ( a > 5 ) {
/*
...
*/
} else {
/*
...
*/
}
}
Ici, le compilateur connaît la valeur de 'a' au moment de la compilation, il sait donc également que la condition if est toujours vraie. Par conséquent, cela élimine la partie else Du 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
/*
...
*/
}
Pour ex:
{
int a;
for (i = 0; i < 1000; i++ ) {
/*
...
*/
a = 10;
/*
...
*/
}
}
Dans le code ci-dessus, si 'a' est local et n'est pas utilisé dans la boucle, il peut alors être optimisé comme suit:
{
int a;
a = 10;
for (i = 0; i < 1000; i++ ) {
/*
...
*/
}
}
Ici, le compilateur génère le code d'assemblage de sorte que les variables les plus fréquemment utilisées soient stockées dans les registres.
Ici, l'optimisation dépend de la CPU. Supposons que s'il y a plus d'un Sauts dans le code, ils sont convertis en un comme:
-----
jmp:<addr1>
<addr1> jmp:<addr2>
-----
-----
Le contrôle passe directement au.
Ensuite, la dernière phase est Lier (qui crée un exécutable ou une bibliothèque) . Lorsque l’exécutable est exécuté, les bibliothèques qu’il requiert sont chargées.
Représentation ASCII:
[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]
J'espère que cela vous aide un peu plus.
Tout d'abord, parcourez ce diagramme:
(img source->internet)
Vous faites un morceau de code et enregistrez le fichier (code source), puis
Prétraitement: - Comme son nom l'indique, cela ne fait pas partie de la compilation. Ils demandent au compilateur d'effectuer le prétraitement requis avant la compilation proprement dite. Vous pouvez appeler cette phase Substitution de texte ou interpréter les directives spéciales du préprocesseur désignées par #.
Compilation: - La compilation est un processus dans lequel un programme écrit dans une langue est traduit dans une autre langue. S'il y a des erreurs, le compilateur les détectera et les rapportera.
Assemble: - Le code d'assemblage est traduit en code machine. Vous pouvez appeler l'assembleur d'un type spécial de compliant.
Linking: - Si ces morceaux de code nécessitent un autre fichier source pour être liés, un éditeur de liens les lie pour en faire un fichier exécutable.
Il y a beaucoup de processus qui se passe après. Oui, vous l'avez deviné, voici le rôle du chargeur:
Loader: - Il charge le code exécutable en mémoire; le programme et la pile de données sont créés, le registre est initialisé.
Little Extra info: - 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 langue de haut niveau en un programme de langage machine. Un compilateur est plus intelligent qu'un assembleur. Il vérifie toutes sortes de limites, plages, erreurs, etc. Mais la durée d'exécution de son programme est plus longue 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 le convertit en codes machine. Si un compilateur s'exécute sur un ordinateur et génère les codes machine du même ordinateur, il est appelé compilateur autonome ou compilateur résident. D'autre part, si un compilateur s'exécute sur un ordinateur et génère les codes machine pour un autre ordinateur, il est appelé compilateur croisé.
Lieur: 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 essentielles à 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 la bibliothèque d'une fonction, il en informe le compilateur et le compilateur génère une erreur. Le compilateur appelle automatiquement l'éditeur de liens à la 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 d’ordinateur 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 des programmes en mémoire et les prépare pour 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 passant 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 mémoire en permanence.
Wikipedia devrait avoir une bonne réponse, voici ce que je pense:
Il lira le fichier source qui peut être de type .c ou .cpp, etc. et le traduira en fichier .o appelé fichier objet.
Il combine les différents 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:
Un programme qui charge le fichier exécutable dans la mémoire principale de la machine.
Pour une étude détaillée sur ces trois étapes d’exécution de programme sous Linux, veuillez lire ceci .
*
*
Linkers and Loaders de LinuxJournal explique ce concept avec clarté. Il explique également comment le nom classique a.out est venu. (sortie de l'assembleur)
Un résumé rapide,
c program --> [compiler] --> objectFile --> [linker] --> executable file (say, a.out)
nous avons obtenu l'exécutable, donnez maintenant ce fichier à votre ami ou à votre client qui a besoin de ce logiciel :)
quand ils courent ce logiciel, disons en le tapant en 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 programme) pointe vers la première instruction de a.out
Système d'exploitation: Un système d'exploitation est un logiciel système qui gère les ressources matérielles et logicielles de l'ordinateur et fournit des services communs pour les programmes informatiques. Le système d'exploitation est un composant du logiciel système d'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 (le langage source) en un autre langage informatique (le langage cible), ce dernier ayant souvent une forme binaire appelée objet. code.
Interprète: interprète 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 compiler au préalable dans un programme en langage machine.
Assembleur: un assembleur est un programme qui prend des instructions informatiques de base et les convertit en une configuration de bits que le processeur de l'ordinateur peut utiliser pour effectuer ses opérations de base.
Chargeur: 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 enregistre les programmes en mémoire et les prépare à leur exécution.
Éditeur de liens: l'éditeur de liens est un programme qui combine des modules d'objets pour former un programme exécutable.
Preproccesor: Preproccesor est un outil de substitution de texte qui indique au compilateur d'effectuer le pré-traitement requis avant la compilation.
Un compilateur est un logiciel qui compile les fichiers de code source du programme en un programme exécutable. Il est inclus dans l’environnement de développement intégré IDE avec la plupart des progiciels de programmation. compile le code dans un langage de bas niveau, tel que le code machine ou le 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 dans 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.
Éditeur de liens Est un programme qui ajuste au moins deux segments de programme en langage machine afin qu’ils puissent être chargés et exécutés simultanément en tant qu’unité Également appelé éditeur de liens et classeur, un éditeur de liens est un programme qui associe des modules d’objets pour former un programme exécutable. . De nombreux langages de programmation vous permettent d'écrire différents morceaux de code, appelés modules, séparément. Cela simplifie la tâche de programmation car vous pouvez diviser un programme volumineux en petites parties plus faciles à gérer. Finalement, vous devez rassembler tous les modules. C'est le travail de l'éditeur de liens.
les modifications du compilateur vérifient que votre code source ne contient pas d'erreurs et le modifie en code d'objet. Il s'agit du code exécuté par le système d'exploitation.
Souvent, vous n'écrivez pas un programme entier dans un seul fichier, donc l'éditeur de liens relie tous vos fichiers de code objet.
votre programme ne sera pas exécuté s'il n'est pas dans la mémoire principale
L'éditeur de liens et l'interprète s'excluent mutuellement L'interprète obtient le code ligne par ligne et exécute ligne par ligne.
Compilateur: c'est un logiciel système qui corrige l'erreur des programmes, des fichiers objets, des messages, etc.
Lieur: c'est un logiciel système qui combine un ou plusieurs objets et un code de bibliothèque possible dans une bibliothèque exicutable ou une liste d'erreurs
Loader: programme qui charge le fichier exécutable dans la mémoire principale de la machine.
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 base de données principale, le programme, etc.
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 en "code" utilisé par le processeur d'un ordinateur.