6 votes

Quelques questions générales sur le langage C

J'essaie de comprendre le processus d'écriture d'un code dans un certain langage pour qu'il soit exécuté par le système d'exploitation. Dans mon cas, le langage serait le C et le système d'exploitation serait Windows. Jusqu'à présent, j'ai lu de nombreux articles, mais je ne suis pas sûr d'avoir bien compris le processus, et j'aimerais vous demander si vous connaissez de bons articles sur des sujets que je n'ai pas trouvés.

Voici donc ce que je pense savoir sur le langage C (et fondamentalement sur d'autres langages) :

Le compilateur C lui-même ne gère que les types de données, les opérations mathématiques de base, les opérations sur les pointeurs et le travail avec les fonctions. Par travail avec les fonctions, j'entends comment passer un argument à la fonction et comment obtenir la sortie de la fonction. Lors de la compilation, l'appel de la fonction est remplacé par le passage d'arguments à la pile, et si la fonction n'est pas en ligne, son appel est remplacé par un symbole pour l'éditeur de liens. Le linker trouve alors la définition de la fonction, et remplace le symbole pour passer à l'adresse de cette fonction (et bien sûr revenir au programme).

Si ce qui précède est généralement vrai et que j'ai bien compris, à quel endroit du fichier .exe final l'éditeur de liens enregistre-t-il les fonctions ? Après la fonction main() ? Et qu'est-ce qui crée l'en-tête .exe ? Le compilateur ou l'éditeur de liens ?

Les capacités supplémentaires du langage C, aujourd'hui connues sous le nom de bibliothèque standard C, sont un ensemble de fonctions et leurs déclarations, que d'autres programmeurs ont écrites pour étendre et simplifier l'utilisation du langage C. Mais ces fonctions, comme printf(), étaient (ou pouvaient être ?) écrites dans un autre langage, ou en assembleur. Et c'est là qu'intervient ma question suivante : la fonction printf(), par exemple, peut-elle être écrite en langage C pur sans utiliser d'assembleur ?

Je sais que c'est une question assez vaste, mais je veux surtout savoir si j'ai raison ou non. Et croyez-moi, j'ai lu beaucoup d'articles sur le web, et je ne vous demanderais pas si je pouvais trouver ces informations réunies en un seul endroit, dans un seul article. Au lieu de cela, je dois rassembler des informations au coup par coup, et je ne suis donc pas sûr d'avoir raison. Je vous remercie.

6voto

Uri Points 50687

Je pense que vous êtes exposé à certaines informations qui sont moins pertinentes en tant que programmeur C débutant et qui peuvent vous perturber - une partie de l'objectif de l'utilisation d'un langage de plus haut niveau comme celui-ci est de ne pas avoir à penser initialement à la façon dont ce processus fonctionne. Au fil du temps, cependant, il est important de comprendre le processus. Je pense que vous en avez généralement une bonne compréhension.

Le compilateur C prend simplement le code C et génère des fichiers objets qui contiennent le langage machine. La majeure partie du fichier objet est occupée par le contenu des fonctions. Un simple appel de fonction en C, par exemple, serait représenté dans la forme compilée par des opérateurs de bas niveau pour pousser des choses dans la pile, changer le pointeur d'instruction, etc.

La bibliothèque C et toutes les autres bibliothèques que vous utiliseriez sont déjà disponibles sous cette forme compilée.

L'éditeur de liens est l'élément qui combine tous les fichiers objets pertinents, résout toutes les dépendances (par exemple, un fichier objet appelant une fonction de la bibliothèque standard) et crée ensuite l'exécutable.

Quant au langage dans lequel les bibliothèques sont écrites : Considérez chaque fonction comme une boîte noire. Tant que la boîte noire possède une interface standard (la convention d'appel C, c'est-à-dire qu'elle prend des arguments d'une certaine manière, renvoie des valeurs d'une certaine manière, etc. Le plus souvent, les fonctions sont écrites en C ou directement en assembleur. Lorsqu'elles sont intégrées dans un fichier objet (ou dans une bibliothèque compilée), la manière dont elles ont été créées initialement n'a plus d'importance, ce qui compte, c'est qu'elles se trouvent maintenant sous la forme compilée de la machine.

Le format d'un exécutable dépend du système d'exploitation, mais une grande partie du corps de l'exécutable sous Windows est très similaire à celui des fichiers objets. Imaginez que quelqu'un ait fusionné tous les fichiers objets et y ait ajouté de la colle. La colle s'occupe du chargement et invoque ensuite la fonction main(). Lorsque j'étais enfant, par exemple, les gens s'amusaient à "changer la colle" pour ajouter une autre fonction avant la fonction main() qui affichait un écran d'accueil avec leur nom.

Il convient toutefois de noter que, quel que soit le langage utilisé, il faut un jour ou l'autre faire appel aux services du système d'exploitation. Par exemple, pour afficher des choses à l'écran, pour gérer des processus, etc. La plupart des systèmes d'exploitation disposent d'une API qui peut être appelée de la même manière, mais son contenu n'est pas inclus dans votre EXE. Par exemple, lorsque vous lancez votre navigateur, il s'agit d'un exécutable, mais à un moment donné, il y a un appel à l'API Windows pour créer une fenêtre ou charger une police. Si cela faisait partie de votre EXE, celui-ci serait énorme. Ainsi, même dans votre exécutable, il y a des "références manquantes". En général, ces références sont traitées au moment du chargement ou de l'exécution, selon le système d'exploitation.

1voto

ColOfAbRiX Points 123

Je suis un nouvel utilisateur et ce système ne me permet pas de poster plus d'un lien. Pour contourner cette restriction, j'ai posté quelques idées sur mon blog. http://zhinkaas.blogspot.com/2010/04/how-does-c-program-work.html . Il m'a fallu un certain temps pour obtenir tous les liens, mais dans l'ensemble, ceux-ci devraient vous permettre de démarrer.

0voto

RarrRarrRarr Points 1538

Le compilateur est chargé de traduire toutes vos fonctions écrites en C en assemblage, qu'il enregistre dans le fichier objet (DLL ou EXE, par exemple). Ainsi, si vous écrivez un fichier .c qui contient une fonction principale et quelques autres fonctions, le compilateur traduira toutes ces fonctions en langage assembleur et les enregistrera ensemble dans le fichier EXE. Ensuite, lorsque vous exécutez le fichier, le chargeur (qui fait partie du système d'exploitation) sait qu'il doit commencer par exécuter la fonction principale. Sinon, la fonction principale est comme n'importe quelle autre fonction pour le compilateur.

L'éditeur de liens est responsable de la résolution des références entre les fonctions et les variables d'un fichier objet et les références dans d'autres fichiers. Par exemple, si vous appelez printf(), puisque vous ne définissez pas vous-même la fonction printf(), l'éditeur de liens est chargé de s'assurer que l'appel à printf() va à la bonne bibliothèque système où printf() est défini. Cela se fait au moment de la compilation.

printf() est en effet écrit en C pur. Ce qu'il fait, c'est appeler un appel système dans le système d'exploitation qui sait comment envoyer des caractères à la sortie standard (comme un terminal de fenêtre). Lorsque vous appelez printf() dans votre programme, au moment de la compilation, l'éditeur de liens se charge de lier votre appel à la fonction printf() dans les bibliothèques C standard. Lorsque la fonction est passée au moment de l'exécution, printf() formate les arguments correctement et appelle ensuite l'appel système approprié du système d'exploitation pour afficher les caractères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X