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 :

etape d'exécution d'un pg en C ?


Sujet :

C

  1. #1
    Membre très actif Avatar de zangaloni
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 474
    Par défaut etape d'exécution d'un pg en C ?
    Bonjour,
    j'ai besoin de comprendre
    1_comment un programme est exécuté vis a vis de la memoire ( qu'est ce qui se passe dans la partie segment de code ,segment data..etc)pour un programme en C ?
    2_en quoi se diffère le C de C++ et Java ?
    3_Etpaes d'exécution d'un programme ?

    Si vous avez une idée,ou un lien qui pourrait m'aider à rèpondre à ce genre de question .
    Merci de me le faire parvenir.
    j'ai besoin de ceci au plutard demain matin.

  2. #2
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    1_ C'est-à-dire ?
    Tu veux savoir qu'est-ce qu'il y a dans chaque segment de mémoire ?
    Segment de code/texte : Code
    Segment data/données : Variables statiques/globales initialisées.
    Segment bss : Variables statiques/globales non initialisées.
    Segment de tas : Mémoire utilisée par l'appel à malloc, realloc etc.
    Segment de pile : Fonctions, variables, etc. (tout ce qui est en train d'être exécuté).

    Je te dis ça à titre indicatif, mais c'est variable en fonction de l'implémentation. Ce que j'ai dis est valable pour l'architecture x86 sous Unix.

    2_ Ce sont des langages différents, chacun à son utilité. En quoi diffère une voiture, un train et un avion ?

    3_ Pas bien compris ...
    Ton programme commence, toutes tes variables son placées dans le segment de données/bss (si il y en a), ensuite on commence par le main qui sera placé dans la pile, avec les variables, les adresses de retour, le bloc d'activation etc. ensuite tous les appels de fonctions avec, pareil, les variables etc.

  3. #3
    Membre très actif Avatar de zangaloni
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 474
    Par défaut
    1_
    le segment data n'est pas divisé en deux ?une partie statique pour les var. statique et globale et une partie dynamique pour les variable décrit à l'interieur du main ?

    J'aimerais aussi avoir une idée sur les pointeur ?y a deux pointeur sur la memoire l'un sur le code et l'autre sur le sommet de la pile ?

    le Tas c'est pour l'allocation dynamique ?

    2_pour la différence j'aimerais juste savoir les grand trait qui les diffèrent

    3_ il peut ne pas y avoir de segment data ?
    je n'ai pas bien compris

  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    1_ Les variables du main sont dans la pile, pas dans le data
    Bah heuu.. les pointeurs sont des variables qui pointent sur des adresses mémoires. Ils sont donc dans la pile.
    Le segment de pile évolue des adresses hautes vers les adresses basses, et le tas évolue vers les adresses hautes. Les autres segments sont fixes et sont dans les adresses basses avant le segment de tas.

    2_ Je ne connais pas les autres langages, je ne ferai donc pas de comparaison

    3_ Oui

    Encore une fois, et je le répète, ceci est entièrement dépendant de l'implémentation !

  5. #5
    Membre très actif Avatar de zangaloni
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 474
    Par défaut
    Pour les pointeurs,je parlais des pointeur qui pointeent sur la memoire.

    En tout ca merci pour vos rèponses

  6. #6
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Ups petit modification, je me suis trompé
    La pile évolue vers les adresses basse

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Je pense que lire des cours d'assembleur pourrait t'aider à y voir plus clair, au sujet des différents segments, de la gestion de la pile, des appels de fonctions (par exemple, comment sont passés les paramètres de fonction, en fonction des conventions d'appel), du rôle des registres, etc.

    Après, il y a encore plein de choses qui compliquent l'organisation de la mémoire, notamment le système de mémoire virtuel, les différents modes (réel, protégé), etc. Mais là, après, c'est l'OS qui gère ça. Je ne sais pas si ça entre dans le cadre de tes questions mais ça dépasse en tout cas le cadre de l'assembleur.

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Bon pour la comparaison entre les langages les gros points sont les suivants :

    - Le C est langage de programmation procédurale bas niveau ...
    - Le Java et le C++sont des langages plutôt objet (même si on peut les utiliser en procédurale).

    La programmation objet et la programmation procédurale sont deux modes de programmation différents et chacun ont leur utilité selon le contexte. Et la préférence d'un de ces modes (tout comme la préférence des langages) dépend des développeurs ...

    Autre précision concernant le Java : C'est un langage actuellement à la mode mais parfois un peu lent pour une simple raison : celui-ci est généralement compilé en bytcode qui est interprété par une machine virtuelle sun : le JRE.

    Mais bon il semble que ça change sur certaines plateformes récentes de développement Java, où l'on parle de compilation "Just In Time" pour une amélioration des performances, mais bon je ne suis pas expert dans le domaine.

    Le C et le C++ sont eux compilés en langage machine (conversion d'un fichier source en fichier binaire exécutable).

    Voilà, d'autres pourront certainement t'en dire plus.

    Cordialement,
    Idriss

  9. #9
    Membre très actif Avatar de zangaloni
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 474
    Par défaut
    Merci à vous tous.

    Ce que je cherche c'est quand par exemple,j'écris sur mon compilateur :
    int x;
    qu'est ce qui se passe ?
    et par suite qu'est ce qui se passe pour tout un pg avec lemain et tout??

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Le compilateur va décoder ton code source afin de le traduire en code machine, qui est le seul langage que le CPU puisse comprendre. Le C, comme tous les langages, n'est qu'un intermédiaire permettant de "relier" le programmeur à la machine. Le programmeur créée sont programme, en respectant la norme du langage, et le compilateur fait son travail de traducteur, générant du code machine.

    Dans ton exemple, lorsque tu déclares une variable, cela dépend du contexte. Soit elle se trouve sur la pile (variable locale non statique), soit dans un autre segment.
    Au passage, une variable n'est ni plus ni moins qu'une zone mémoire. D'ailleurs, à la compilation, le nom de ta variable disparait. La valeur contenue dans cette zone mémoire est lue (et écrite) via les instructions propres au CPU et à ses registres.
    Même chose pour une fonction : son nom disparait. Quand on appelle une fonction, on appelle en fait une adresse. Cela se fait via l'instruction CALL de l'assembleur. Pour que le CPU puisse se "souvenir" d'où a été appelée la fonction (une fois qu'elle se termine), il dépile certains registres (qu'il avait empilés lors de l'appel), notamment un très capital contenant la fameuse adresse. C'est bien pourquoi un appel récursif d'une fonction, s'il n'y a aucun contrôle, est susceptible de faire crasher la pile à cause d'un débordement.

    Le mieux, c'est que tu codes un petit programme et que tu configures ton projet afin que ton compilo te génère le fichier assembleur associé à ton code source.
    C'est très intéressant de voir comment est codée chaque instruction ou chaque expression. Par contre, il faut un minimum de connaissance en assembleur pour bien comprendre. Pas être un expert spécifiquement, mais connaître les grandes lignes quand même.
    Sur le net, il existe de nombreux tutos/cours qui expliquent bien le déroulement d'un programme (à base d'assembleur), avec toutes les notions capitales : les segments, les registres, les empilements/dépilements, les appels, les sauts, la gestion du statut signé ou non signé des nombres (avec leurs instructions respectives), etc.

  11. #11
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Tu peux, par exemple, utiliser GDB pour voir le code assembleur généré.
    Avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <stdio.h>
     
    int main(void) {
    	int x = 0x12345;
    	return 0;
    }
    GDB me donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <main+0>:	nop    
    <main+1>:	nop    
    <main+2>:	nop    
    <main+3>:	nop    
    <main+4>:	nop    
    <main+5>:	nop    
    <main+6>:	push   rbp
    <main+7>:	mov    rbp,rsp
    <main+10>:	mov    DWORD PTR [rbp-0x4],0x12345
    <main+17>:	mov    eax,0x0
    <main+22>:	leave  
    <main+23>:	ret
    Tu peut voir ici que la variable x est située à l'adresse rbp-0x4. rbp pointe sur l'adresse 0x7fff5fbff750 qui correspond à l'emplacement où sont situées les variables de la fonction.
    Avec GDB toujours, si je regarde (après avoir exécuté l'instruction) la valeur à l'adresse 0x7fff5fbff750-0x4 j'obtient bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (gdb) x/x 0x7fff5fbff750-0x4
    0x7fff5fbff74c:	0x00012345
    On peut voir aussi qu'un int fait 4 octets (DWORD) chez moi
    C'est pourquoi, en C, on peut utiliser le même nom de variable dans plusieurs blocs/fonctions imbriquées. Le nom n'a pas d'importance

  12. #12
    Membre très actif Avatar de zangaloni
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 474
    Par défaut
    Bonjour,
    Vos rèponses me sont de grande utilité merci pour votre précieux aide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void insererdeb(int T[20],int*,int);
     
     
    int main()
        {
    int val,dim=0,T[20];
    printf("entrez la valeur A jouter ");
         scanf("%d",&val);
         insererdeb(T,&dim,val);
        }
     
    void insererdeb(int T[20],int* dim,int val)
     {
               int  i=*dim;
         while(i!=0)
            {
                  T[i]=T[i-1];
                  i--;
            }
                  T[0]=val;
                  (*dim)++;
     }
    Si je prend par exemple ce programme,et je voulais essayer d'imaginer les étapes d'éxécution que mon compilateur va suivre.
    les variables qui sont déclaré en dehors du "main" seront éxacuté au moment de l'éxécution et pour cela on les placent dans la partie du segment de donnèes reservée pour les variables dynamiques,Tandis que les variables déclarés à l'intérieur du main,c'est au momen de la compilation,donc on les places segment data des Variables Statiques ..Pour ce qui reste je sais qu'il y a des information qui vont être empilé et que une fois il termine il les libèrent ,mais de quel information il s'agit exactement??
    J'aimerais bien avoir de l'aide.

    N.b : je ne retrouve pas de tuto rèpondant à ce genre de question.

  13. #13
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    J'ai pas l'impression que tu aies compris ce que j'ai mis plus haut

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Agent sql et etape qui ne s'exécute pas
    Par Msysteme dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 17/06/2015, 12h26
  2. Réduire des etapes dans un programme a exécuté
    Par yassinebench dans le forum MATLAB
    Réponses: 6
    Dernier message: 13/04/2014, 17h06
  3. [ArchiveBuilder][JavaMail] exécution impossible...
    Par Gorthal dans le forum JBuilder
    Réponses: 7
    Dernier message: 10/01/2003, 09h12
  4. Exécution indivisible (accès conccurent)
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 23/07/2002, 08h09
  5. Réponses: 2
    Dernier message: 06/07/2002, 12h36

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