#1 Le 02/06/2008, à 18:48
- muspro
[Résolu] Questions sur le compilateur
Salut tout le monde,
Je suis un peu perdu : Je voudrais avoir une réponse à ces questions :
1- est ce que le compilateur du langage C utilise l'assembleur ? les compilateurs des autres langages utilisent-ils l'assembleur ou autre ?
2- j'ai lu que le compilateur d'un langage peut être différent de ce dernier ! comment il le comprend ?
Si vous pouvez aussi m'indiquer une documentation ?
merci ?
NB : Je ne suis qu'un amateur
#2 Le 02/06/2008, à 19:32
- guyver2
Re : [Résolu] Questions sur le compilateur
1- est ce que le compilateur du langage C utilise l'assembleur ? les compilateurs des autres langages utilisent-ils l'assembleur ou autre ?
que veux tu dire par là ?
gcc n'utilise rien pour compiler tes programmes en C, il tourne tout seul. Par contre, il peut transformer ton code C en code assembleur. (option -S)
pour la seconde question. Tu veux dire "est ce qu'un logiciel ecrit en java peu compiler un logiciel ecrit en C ?" (par exemple)
la réponse est : bien sur.
Imagine la chose suivante : Si SEUL un programme ecrit en C pouvait compiler un autre programme en C. Comment compiler le premier programme ?
Un compilateur comprend les sources qu'on lui donne car le langage respecte une syntaxe bien définie.
par exemple, la syntaxe du langage C est definie dans des document comme celui ci : http://www.vmunix.com/~gabor/c/draft.html
fait un tour sur la wikipedia et regarde des pages comme
http://fr.wikipedia.org/wiki/Compilateur
http://fr.wikipedia.org/wiki/Analyse_lexicale
http://fr.wikipedia.org/wiki/Analyse_syntaxique
http://fr.wikipedia.org/wiki/Compilateur_de_compilateur
c'est assez complexe (enfin je trouve)
J'ai fais l'an dernier un compilateur en Ocaml de code C vers du bytecode java. Tu vois qu'il n'y a pas de restriction dans le mélange des langages.
Croire est le meilleur moyen de ne jamais rien savoir
Mes jeux en C/C++
Hors ligne
#3 Le 02/06/2008, à 20:22
- Link31
Re : [Résolu] Questions sur le compilateur
gcc n'utilise rien pour compiler tes programmes en C, il tourne tout seul
Pas vraiment tout seul. Il sort de l'assembleur dans tous les cas, qui est ensuite passé à l'assembleur gas (GNU binutils), qui passe le fichier objet ainsi produit au linker ld (toujours du paquet GNU binutils).
En principe, tous les langages compilés sont convertis en assembleur, à l'exception des langages à bytecode (programmes compilés en Java, Python, Perl (?)...).
Après, certains compilateurs utilisent l'assembleur/linker du système, d'autres nécessitent les outils GNU, d'autres encore fournissent leur propre linker ou font tout eux-mêmes (en tout cas ça doit sûrement exister).
Dernière modification par Link31 (Le 02/06/2008, à 20:23)
Hors ligne
#4 Le 02/06/2008, à 20:32
- guyver2
Re : [Résolu] Questions sur le compilateur
Pas vraiment tout seul
Oui tu as raison, je voulais dire par là que gcc n'utilise pas d'assembleur (comme pouvait eventuellement le laisser penser la question) quand il compile, il en produit
Croire est le meilleur moyen de ne jamais rien savoir
Mes jeux en C/C++
Hors ligne
#5 Le 02/06/2008, à 21:31
- muspro
Re : [Résolu] Questions sur le compilateur
Merci pour vos réponse, effectivement je voulais dire qu'il produit l'assembleur.
Je voudrais savoir si gcc est écrit en language C ou non ? et si je veux jeter un coup d'oeil sur ses fichiers (de gcc) je les trouve où ?
Merci encore une fois
#6 Le 02/06/2008, à 21:37
- Link31
Re : [Résolu] Questions sur le compilateur
Je voudrais savoir si gcc est écrit en language C ou non ?
Oui.
(avec en prime le style de code absolument illisible des projets GNU...)
et si je veux jeter un coup d'oeil sur ses fichiers (de gcc) je les trouve où ?
Là :
ftp://mirrors.kernel.org/gnu/gcc/
Hors ligne
#7 Le 03/06/2008, à 09:36
- muspro
Re : [Résolu] Questions sur le compilateur
Salut,
Ce que je veux comprendre : c'est la conversion par un compilateur d'un script écrit en C vers un script écrit en assembleur, comment cela se fait (sans utiliser l'assembleur (langage machine ) ) ? c'est embêtant ( répondez moi svp avec que je me suiccide ), ou m'indiquer svp un lien de documentation
sum = 0;
for ( i=10; i >0; i −− )
sum += i;
peut être traduit en assembleur de la façon suivante :
mov eax, 0 ; eax est sum
mov ecx, 10 ; ecx est i
loop_start:
add eax, ecx
loop loop_start
#8 Le 03/06/2008, à 09:58
- Nasman
Re : [Résolu] Questions sur le compilateur
Je ne sais pas si celà peut répondre à ta question mais dans ma jeunesse, j'avais fait un programme en basic qui transformait un programme écrit en langage d'assemblage (en fait un fichier texte) en opcodes (exécutables). Le programme basic recherchait les instructions, du genre jmp et transformait la chaine "jmp" en un octet (opcode de la mnémonique jmp).
En pratique, le programme écrit en basic, en C ou en autre chose est transformé en fichier exécutable, soit en une succession d'opcodes.
Je suppose qu'à l'origine il a fallu que certains s'amusent à coder les premiers programmes "à la main" directement en langage machine. Par la suite je suppose que l'on a du rendre cette étape plus automatisée, assembleurs type debug (ne gérant pas les étiquettes) puis plus complets. Des fonctions de bases ont été créées pour gérer le matériel, l'affichage (printf), amenant l'apparition des langages de haut niveau.
PC fixe sous Bionic 64 bits et portable avec Focal 64 bits
Hors ligne
#9 Le 03/06/2008, à 10:11
- guyver2
Re : [Résolu] Questions sur le compilateur
Tout est expliqué plus haut:
pour compiler un code (pas un script) en C, le compilateur le transforme en code assembleur et cela est possible car le langage respecte une syntaxe clairement définie et qu'avec un analyseur lexical et un analyseur syntaxique gcc peut extraire les structures (boucles, déclarations, fonctions...) du code C pour les réécrire en assembleur.
un traducteur francais -> anglais n'a pas besoin d'etre anglais pour faire son travail, il lui suffit de connaitre les regles gramaticale et le vocabulaire de la langue anglaise pour pouvoir traduire. Et en plus cela ne l'empeche pas de connaitre l'italien a coté.
Croire est le meilleur moyen de ne jamais rien savoir
Mes jeux en C/C++
Hors ligne
#10 Le 03/06/2008, à 11:03
- muspro
Re : [Résolu] Questions sur le compilateur
Tout est expliqué plus haut:
pour compiler un code (pas un script) en C, le compilateur le transforme en code assembleur et cela est possible car le langage respecte une syntaxe clairement définie et qu'avec un analyseur lexical et un analyseur syntaxique gcc peut extraire les structures (boucles, déclarations, fonctions...) du code C pour les réécrire en assembleur.un traducteur francais -> anglais n'a pas besoin d'etre anglais pour faire son travail, il lui suffit de connaitre les regles gramaticale et le vocabulaire de la langue anglaise pour pouvoir traduire. Et en plus cela ne l'empeche pas de connaitre l'italien a coté.
Justement c'est ça que je comprends pas : L'assembleur est le langage compris par la machine, et pour faire la conversion, le compilateur utilise la machine, donc doit parler en assembleur, alors que c'est pas toujours le cas gcc (ou C lui même) est écrit en C : est ce le compilateur va s'auto convertir en assembleur ?
#11 Le 03/06/2008, à 11:15
- Nasman
Re : [Résolu] Questions sur le compilateur
Lorsque tu utilises gcc, tu utilises la version compilée de gcc. Bien que sous gnu/Linux on puisse avoir un programme source en C (on en autre chose) et le compiler, seule la version compilée est opérationnelle.
PC fixe sous Bionic 64 bits et portable avec Focal 64 bits
Hors ligne
#12 Le 03/06/2008, à 11:56
- muspro
Re : [Résolu] Questions sur le compilateur
Lorsque tu utilises gcc, tu utilises la version compilée de gcc. Bien que sous gnu/Linux on puisse avoir un programme source en C (on en autre chose) et le compiler, seule la version compilée est opérationnelle.
compiler par qui, et comment, c'est toujours le problème de compilation, non ?
si C était le premier langage machine (assembleur) je ne pose pas la question, il y'a qq chose qui m'échappe, c'est sûr.
#13 Le 03/06/2008, à 12:14
- guyver2
Re : [Résolu] Questions sur le compilateur
disons que tu semble te poser la question de la poule et de l'oeuf
comment a été compilé le premier compilateur ?
si c'est ça qui te turlupine, il faut savoir que le seul langage compris par la machine se sont des suite d'octets (encore en dessous de l'assembleur).
En gros au debut il a fallut ecrire a la main le premier "programme" en ecrivant ses octets. Puis petit a petit, des gens ont écrit des programme permettant d'en générer d'autre plus simplement, a partir du code assembleur par exemple.
Puis ainsi de suite, le premier compilateur C a du etre ecrit en assembleur ou dans un autre langage de tres bas niveau...
Voila comment aujourd'hui, on peut se passer d'ecrire le code assembleur (ou pire encore) et laisser ce travail a des compilateurs.
Croire est le meilleur moyen de ne jamais rien savoir
Mes jeux en C/C++
Hors ligne
#14 Le 03/06/2008, à 12:24
- telliam
Re : [Résolu] Questions sur le compilateur
je pense qu'il y a des confusions sur les mots utilisés :
- le seul langage compris par un pc est le binaire .
- le langage assembleur n'est qu'une representation en texte des commandes binaires compris par la machine, pour générer un executable (un fichier binaire) a partir de l'assembleur il faut donc "convertir" l'assembleur en un fichier "binaire". c'est cette phase qui est appelé la compilation.
- le langage C est un langage de plus haut niveau que l'assembleur
- qd tu compiles un programme avec gcc tu px lui faire produire soit un fichier assembleur ( donc du texte que tu devras donc ensuite "compilé" pour obtenir un executable ), soit directement un executable tout depend en fait des options que tu passes a GCC.
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#15 Le 03/06/2008, à 12:58
- Karl_le_rouge
Re : [Résolu] Questions sur le compilateur
Généralement, la première chose à faire quand tu fournis une nouvelle plateforme matérielle, c'est de fournir un compilo (généralement un compilo C)
a) soit un compilo simple codé en assembleur. De plus en plus rare.
b) soit un cross-compilo, un compilo pouvant cracher des binaires destiné à une autre plateforme matérielle différente de la plateforme d'exécution du compilo.
En embarqué, ou la question du bootstrap se pose souvent, très souvent, on utilise une version modifiée de GCC.
Technique qui a été utilisé relativement tôt dans l'histoire d'Unix et de C.
GCC est compilé en 3 passes.
passe 1: GCC est compilé par un compilo C ANSI, tu obtiens un GCC minimal.
passe 2: tu compiles GCC avec le GCC minimal.
passe 3 (optionnel): GCC se recompile pour tester les différences entre les 2 versions complètes.
Hors ligne
#16 Le 03/06/2008, à 13:44
- nicolas.sitbon
Re : [Résolu] Questions sur le compilateur
GCC est compilé en 3 passes.
passe 1: GCC est compilé par un compilo C ANSI, tu obtiens un GCC minimal.
passe 2: tu compiles GCC avec le GCC minimal.
passe 3 (optionnel): GCC se recompile pour tester les différences entre les 2 versions complètes.
Je suis d'accord mais seulement avec l'option "make bootstrap" autrement il est compilé directement.
Hors ligne
#17 Le 03/06/2008, à 13:50
- nicolas.sitbon
Re : [Résolu] Questions sur le compilateur
je pense qu'il y a des confusions sur les mots utilisés :
- le seul langage compris par un pc est le binaire .- le langage assembleur n'est qu'une representation en texte des commandes binaires compris par la machine, pour générer un executable (un fichier binaire) a partir de l'assembleur il faut donc "convertir" l'assembleur en un fichier "binaire". c'est cette phase qui est appelé la compilation.
- le langage C est un langage de plus haut niveau que l'assembleur
- qd tu compiles un programme avec gcc tu px lui faire produire soit un fichier assembleur ( donc du texte que tu devras donc ensuite "compilé" pour obtenir un executable ), soit directement un executable tout depend en fait des options que tu passes a GCC.
Attention aux termes, le binaire n'est pas un langage, le seul langage connu d'un processeur est le langage machine intimement lié à ce processeur.
la phase de "conversion" de l'assembleur au langage machine s'appelle la traduction.
la phase de "conversion" d'un langage de 3ème génération (ou plus) à un langage de 2ème génération (assembleur) s'appelle la compilation.
Pour rappel :
.h .c -> cpp -> .c
.c -> gcc -> .S
.S -> as -> .o
.o -> ld -> .a .so a.out
Hors ligne
#18 Le 03/06/2008, à 14:28
- Karl_le_rouge
Re : [Résolu] Questions sur le compilateur
Je suis d'accord mais seulement avec l'option "make bootstrap" autrement il est compilé directement.
A moins d'avoir GCC de préinstallé (ce qui fait office de "première passe"), tu es obligé de faire les 2 premières passes. La première passe compile un compilo fonctionnel mais ce n'est pas un GCC "full featured", seul GCC peut compiler (proprement) GCC.
"make bootstrap" ne fait qu'automatiser les 3 passes.
Hors ligne
#19 Le 03/06/2008, à 17:28
- muspro
Re : [Résolu] Questions sur le compilateur
Je suis finalement convaincu, et un Grand merci à tout le monde.
Bravo à vous.
Si quelqu'un peut ajouter "convaincu" ou "résolu" au titre