IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Code assembleur d'une fonction ,algorithme de compilation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 11
    Par défaut Code assembleur d'une fonction ,algorithme de compilation
    Bonjour,

    Lorsque l'on compile un code source c , pour chaque fonction et opérateur , il y a bien une correspondance en code assembleur , qui ce dernier est traduit en opcodes(langage machine).

    Si on prend la fonction printf() par exemple du header stdio.h , le code assembleur ne peut pas être présent dans le fichier de la librairie std glibc car ce dernier est un fichier compilé ( ne contient donc que des opcodes).

    Alors comment le compilateur remonte-t-il le code assembleur correspondant à chaque fonction et opérateur ( exemple + < >= lors de l'étape de compilation?

  2. #2
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Citation Envoyé par fs1985 Voir le message
    Bonjour,

    Lorsque l'on compile un code source c , pour chaque fonction et opérateur , il y a bien une correspondance en code assembleur , qui ce dernier est traduit en opcodes(langage machine).
    Bonjour,
    En gros, oui mais la réponse précise est non. Le compilateur ne fait pas (ou plus) que traduire bêtement un source C en assembleur pour produire du code machine.
    Cela dépend évidemment des options que tu donnes à ton compilateur, de la plateforme ciblée, …
    Pour te donner quelques exemples : si tu déclares une variable locale dont tu ne prends jamais l'adresse alors cette variable pourra ne jamais exister en mémoire mais uniquement dans les registres ; si dans ton source le compilateur arrive à prouver qu'une partie ne sera jamais exécutée alors il ne produira simplement pas de code pour cette partie ; si tu fais une division entière par 10 (par exemple) il pourra ne jamais produire l'opcode qui calcule une division mais utiliser un autre calcul qui est plus adapté à la plateforme ; si dans le source tu appelles une fonction que le compilateur sait constante alors il se pourrait que le code produit ne l'appelle qu'une seule fois même si dans le code tu l'appelles plusieurs fois ; il peut substituer une fonction par une autre (surtout celles de la libc), suivant les paramètres que tu donnes à printf il va transformer cet appel en appel à puts ou putchar ; les exemple peuvent être nombreux …

    Citation Envoyé par fs1985 Voir le message
    Si on prend la fonction printf() par exemple du header stdio.h , le code assembleur ne peut pas être présent dans le fichier de la librairie std glibc car ce dernier est un fichier compilé ( ne contient donc que des opcodes).

    Alors comment le compilateur remonte-t-il le code assembleur correspondant à chaque fonction et opérateur ( exemple + < >= lors de l'étape de compilation?
    Là on parle de l'édition des liens (quand tu compiles) voire du loader (quand tu exécutes). Quand tu as créé ton exécutable, le compilateur «sait» que le printf que tu appelles est dans la libc et que tu désires ne pas lier statiquement ton exécutable avec la libc mais dynamiquement.
    Lorsque l'OS va charger ton exécutable, il voit qu'il aura besoin de la libc donc il la charge d'abord si elle n'est pas déjà présente en mémoire et quand ton exécutable aura besoin de printf il en trouvera le code en mémoire : le tour est joué.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 11
    Par défaut
    J'ai saisi le ce que tu mentionnes mais prenons alors exemple d'une édition de lien statique ainsi que du codage de base des fonctions de la librairie std c.

    Si on prend toutes les fonctions(routines)du language c , elles ont bien étaient codé en assembleur à la base , puis compiler en librairie partagée.Les développeurs du c concoivent bien les fonctions en assembleur à la racine?

    Lorsque l'on compile un programme en statique utilisant ces fonctions , le compilateur va alors directement chercher le code machine correspondant pour l implémenter dans le fichier contenant le programme.?

  4. #4
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Citation Envoyé par fs1985 Voir le message
    J'ai saisi le ce que tu mentionnes mais prenons alors exemple d'une édition de lien statique ainsi que du codage de base des fonctions de la librairie std c.

    Si on prend toutes les fonctions(routines)du language c , elles ont bien étaient codé en assembleur à la base , puis compiler en librairie partagée.Les développeurs du c concoivent bien les fonctions en assembleur à la racine?
    C'est une idée reçue. La bibliothèque standard C est écrite majoritairement en C, il y a des parties écrites en assembleur, mais principalement pour des raisons de performances. Tu peux par exemple consulter les sources de la GNU LibC ou celles de Musl (bien plus accessibles).
    Pour la petite note historique, la libC a été implémentée en C (dans la mesure du possible) très tôt. Par exemple tu peux retrouver les souces utilisées pour la «première vraie version d'UNIX».

    Citation Envoyé par fs1985 Voir le message
    Lorsque l'on compile un programme en statique utilisant ces fonctions , le compilateur va alors directement chercher le code machine correspondant pour l implémenter dans le fichier contenant le programme.?
    Une bibliothèque statique n'est rien d'autre (en gros) qu'une archive de fichiers objets.
    Il faut surtout comprendre qu'un exécutable n'est pas simplement un fichier binaire qui est chargé en mémoire et directement exécuté (je parle des plateformes modernes classiques linux/windows/mac). Il s'agit d'un fichier avec un format particulier (ELF/PE/MACHO) que l'OS va lire et interpréter pour créer l'image d'un processus.

Discussions similaires

  1. Réponses: 13
    Dernier message: 08/11/2012, 00h21
  2. code source d'une fonction prédéfinie
    Par bambitous dans le forum C
    Réponses: 8
    Dernier message: 27/10/2012, 15h43
  3. JSP : mettre du code java dans une fonction javascript
    Par padraig29 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 11/08/2010, 10h07
  4. code source d'une fonction
    Par kchiheb dans le forum MATLAB
    Réponses: 0
    Dernier message: 17/09/2008, 23h38
  5. Réponses: 5
    Dernier message: 21/12/2004, 18h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo