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 :

[Linux -- gcc] besoin d'éclaircissements concernant le rôle du compilateur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut [Linux -- gcc] besoin d'éclaircissements concernant le rôle du compilateur
    Bonjour à toutes et tous, salutations !!

    Je suis toujours en train de mettre à jour, tenter d'améliorer une sorte de référentiel pour mes élèves au laboratoire.

    Je tente de leur apprendre à programmer en langage ANSI C.

    Voici mon petit soucis: j'essaye de leur expliquer le rôle du compilateur lors de la création d'une variable.

    Je n'ai pas envie de rentrer dans les détails liés à l'assembleur, et encore moins expliquer en détail comment le compilateur va créer un fichier exécutable à partir d'un code source
    et "préparer" le "plan d'éxécution" de celui-ci. Par contre, dans la partie de mon référentiel où j'introduis la notion de variables, j'ai besoin de plus d'informations.

    Le compilateur va compiler le code source sur une machine, imaginons que celle-ci soit équipée d'une mémoire de 1Go, et que, pour on ne sait quelles raisons, les variables et données
    manipulées par le programme que l'on cherche à compiler (le Data Segment) dépasse la mémoire équipée de l'ordinateur... que va-t-il se passer à la compilation ?

    Ceci introduit une sous-question: est-ce que le compilateur a pour rôle de vérifier si la mémoire installée de l'ordinateur qui compile le code source est suffisante pour gérer toutes les variables déclarées et utilisées dans le code source ?

    Je ne suis pas certain (il faut le dire: j'ai été un peu flemmard au niveau de mes recherches sur le fonctionnement d'un compilateur comme GNU C Compiler gcc) de l'assertion que j'ai mise dans mon référentiel.
    Je dis que si nous cherchons à déclarer une variable, à la compilation, le compilateur va vérifier si il reste de la place en mémoire, si il reste de la place pour réserver l'espace mémoire correspondant au type de variable déclaré,
    dans ce cas il "attribue" une adresse à cette variable -- on considère que l'espace réservé pour cette variable dépend de son type mais qu'elle commence à l'adresse fournie par le compilateur.
    Dans le cas contraire le compilateur devrait spécifier qu'il n'y a plus de place disponible en mémoire.

    Quels seraient vos avis ? Est-ce que je vais dans la bonne direction ?

    Merci d'avance pour vos éclaircissements ^^

  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
    Bonjour,

    Citation Envoyé par hurukan Voir le message
    [...]
    Le compilateur va compiler le code source sur une machine, imaginons que celle-ci soit équipée d'une mémoire de 1Go, et que, pour on ne sait quelles raisons, les variables et données
    manipulées par le programme que l'on cherche à compiler (le Data Segment) dépasse la mémoire équipée de l'ordinateur... que va-t-il se passer à la compilation ?

    Ceci introduit une sous-question: est-ce que le compilateur a pour rôle de vérifier si la mémoire installée de l'ordinateur qui compile le code source est suffisante pour gérer toutes les variables déclarées et utilisées dans le code source ?
    [...]
    Non, car un compilateur ne produit pas un exécutable spécifiquement pour la machine sur laquelle il tourne mais pour une architecture bien prédéfinie. Par exemple par défaut un gcc linux64 de «base» va produire du code pour une architexture x86/64 générique (souvent sans extensions sse par exemple) au format elf. Il existe évidemment des options pour tuner l'architecture cible. Cela est encore plus évident avec les cross compilateurs.

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 256
    Par défaut
    Une variable prend peu de place en RAM 1 int=16 ou 32 bits. De là à saturer la RAM...

    Pour les plus grosses allocations, c'est malloc qui est utilisé, si pas assez de RAM, le retour sera ENOMEM, il est impératif de tester le retour de malloc.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  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 chrtophe Voir le message
    Une variable prend peu de place en RAM 1 int=16 ou 32 bits. De là à saturer la RAM...

    Pour les plus grosses allocations, c'est malloc qui est utilisé, si pas assez de RAM, le retour sera ENOMEM, il est impératif de tester le retour de malloc.
    Je pense que la discussion se plaçait plus sur les grosses variables statiques, genre un énorme tableau static en BSS comme par exemple static int big_table[1024*1024*1024];

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 256
    Par défaut
    ça compilera je pense, par contre si manque de RAM la création du process échouera lors de la tentative de lancement de l’exécutable.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    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
    C'est clair, le compilateur est chargé de la création d'un exécutable pour une plateforme cible c'est tout. Ensuite c'est le loader qui le charge et gère les erreurs à ce moment là (pas assez de mémoire) où le processeur (?*à vérifier) dans le cas d'une instruction illégale.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je pense que cela dépend aussi des cibles.

    Je vais parler de ce que je connais sur les micro-contrôleurs Cortex-M.
    - Pour ce qui est des instructions illégales (ex: un opcode valable sur Cortex-M4 qu'on tente d'exécuter sur Cortex-M3 qui a un jeu assembleur plus restreint), c'est bien le processeur qui génère une erreur en tentant de l'exécuter.
    - Pour ce qui est des allocations dynamiques, c'est évidemment l'allocation qui vérifiera l'espace restant dans le tas et échouera si le tas est plein. Le compilateur n'y est pour rien dans tout ça.
    - Pour ce qui est des allocations automatiques, personne ne vérifie cela a priori, ta pile système déborde. Si tu as un OS, il peut faire des vérifications sur les piles des threads.
    - Pour ce qui est des allocations statiques, c'est le rôle du linker* de vérifier cela. Tes fichiers de link décrivent ta quantité de RAM et de flash, ainsi que les adresses de ces différentes régions. Il est donc capable de vérifier cela et de générer une erreur si tu fais quelque chose comme static int big_table[1024*1024*1024];.

    Le dernier contrôle n'est possible que lorsqu'on connait très bien la cible. Sur PC, la quantité de mémoire peut varier d'une machine à l'autre. C'est donc l'OS qui lors du chargera du binaire exécutable pourra faire des vérifications.

    * : il s'agit bien du linker et pas du compilateur a proprement parlé. Le compilateur vérifie le code et traduit, fichier par fichier, rien de plus.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    ...c'est malloc qui est utilisé, si pas assez de RAM, le retour sera ENOMEM,
    Bonjour

    Pour être plus précis, si pas assez de RAM le retour de malloc sera NULL et c'est NULL qu'il faut tester à l'exclusion de tout autre chose.
    Dans le même temps, la variable globale "errno" sera positionnée à ENOMEM. Celui qui veut être plus précis pourra alors afficher cette valeur de errno ou mieux, strerror(errno) lequel renvoie le message textuel correspondant à cette valeur.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/12/2006, 23h32
  2. Besoin d'aide concernant le diapo Flash.
    Par simplyme dans le forum Flash
    Réponses: 3
    Dernier message: 31/10/2006, 20h22
  3. [vb6] traitement d'images, besoin d'éclaircissements
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 01/08/2006, 10h20
  4. [JGoodies] besoin d'éclaircissements
    Par sozie9372 dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 26/06/2006, 23h10
  5. Besoin d'aide concernant 1 exo
    Par Shakan972 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 29/11/2005, 11h31

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