Présentation

Article

1 - INTRODUCTION

2 - PHASES DE COMPILATION ET TYPOLOGIES D’UTILISATION

  • 2.1 - Source vers binaire
  • 2.2 - Parallélisation
  • 2.3 - Source à source
  • 2.4 - Bootstrap

3 - LANGAGES DE PROGRAMMATION

  • 3.1 - Modèles de programmation
  • 3.2 - Grammaire
  • 3.3 - Sémantique

4 - DESCRIPTION D’ARCHITECTURE

  • 4.1 - Machines mono-core
  • 4.2 - Machines à mémoire partagée
  • 4.3 - Machines à mémoire distribuée
  • 4.4 - Machines virtuelles
  • 4.5 - Accélérateurs de calcul

5 - FONCTIONNEMENT DU COMPILATEUR

6 - TECHNOLOGIES POUR LE COMPILATEUR

  • 6.1 - Lexer / Parser
  • 6.2 - Allocation de ressources

7 - OUTILS CONNEXES

  • 7.1 - Déboggeur
  • 7.2 - Profilage
  • 7.3 - Moteurs de construction
  • 7.4 - Sûreté de fonctionnement
  • 7.5 - Compilation croisée

8 - RUNTIME

  • 8.1 - Initialisation du programme
  • 8.2 - Gestion de la mémoire
  • 8.3 - Gestion des entrées/sorties
  • 8.4 - Gestion des exceptions et des signaux

9 - CONCLUSION

Article de référence | Réf : H3168 v2

Runtime
Compilateur

Auteur(s) : Henri-Pierre Charles, Christian Fabre

Date de publication : 10 août 2017

Pour explorer cet article
Télécharger l'extrait gratuit

Vous êtes déjà abonné ?Connectez-vous !

Sommaire

Présentation

Version en anglais English

NOTE DE L'ÉDITEUR

05/08/2017

Cet article est la réédition actualisée de l’article H 3 168 intitulé Compilateurs paru en 1996, rédigé par Bernard LOHRO.

RÉSUMÉ

Un compilateur est un logiciel permettant de transformer un programme source (écrit dans un langage de programmation) dans un autre langage de programmation cible, le plus souvent dans le langage d’un processeur permettant d’exécuter le dit programme. Nous verrons dans cet article les grands principes d’un compilateur, les technologies utilisées ainsi que d’autres usages de la compilation.

Lire cet article issu d'une ressource documentaire complète, actualisée et validée par des comités scientifiques.

Lire l’article

Auteur(s)

INTRODUCTION

Histoire de la compilation

L’architecture des ordinateurs et les applications informatiques ont toujours été en grande évolution. La compilation étant à la frontière de ces deux mondes en pleine évolution, il est naturel qu’elle ait évolué de concert.

Schématiquement on pourrait découper l’histoire de la compilation en quatre grandes périodes :

1950-1970 : Durant cette période, les principales notions d’architecture matérielle étaient en place, mais il était difficile de programmer les ordinateurs qui étaient de volumineuses machines.

Les expressions rationnelles (1956) qui utilisent la théorie des automates finis et les analyseurs syntaxiques (1965) ont permis la création d’outils pour créer des langages de programmation et leur compilation. COBOL et FORTRAN (1957) ont été les premiers langages informatiques compilés.

On peut dire que cette période correspond à la création des fondements théoriques et pratique de la compilation

1970-1990 : C’est durant cette période que l’électronique grand public a été popularisée. Le processeur Intel 4004 (1971) est le premier processeur grand public, le processeur Intel 386 a été la base de la popularité des PC (Personnal Computer). Le processeur MIPS a été créé (1984), il a introduit la notion d’architecture RISC. C’est également durant cette période que Gordon Moore a réévalué sa célèbre loi indiquant « que le nombre de transistors des microprocesseurs sur une puce de silicium double tous les deux ans »

C’est pendant cette période qu’ont été créés les langages C (1972) et C++ (1983) et le premier compilateur open source GCC 1.0. Ce compilateur a eu un succès énorme et a reçu l’adhésion de beaucoup de constructeurs informatiques.

Les objectifs de la compilation d’un programme étaient alors : « de fournir un programme binaire sémantiquement équivalent au programme source ». Les optimisations étaient encore peu développées.

1990-2000 : Cette période fut très riche par la création de nouveaux concepts architecturaux : pipelines, processeurs superscalaires, mémoire caches, machine parallèles.

C’est durant cette période qu’a été créé le langage Java (1995) et qui a largement diffusé la compilation au vol (1999).

Les objectifs de la compilation d’un programme sont devenus : « de fournir un programme binaire sémantiquement équivalent qui utilise au mieux les concepts architecturaux ». Les phases d’optimisation sont devenues de plus en plus complexes. Les premiers outils pour la programmation parallèles comme MPI pour le passage de message entre processeurs (1991) ou OpenMP pour la parallélisation automatique (1997) ont été créés.

2000-2017 : Cette dernière période a vu exploser la complexité des architectures : processeurs multicœurs, co-processeurs graphiques (GPU). Les langages CUDA (2007) et OpenCL (2009) sont apparus à cette période.

Le compilateur open source LLVM est apparu en 2003. Créé comme un projet de recherche, il a ensuite reçu le support des entreprise Apple et Google qui l’ont aidé à évoluer.

Les objectifs de la compilation ont encore changé pour arriver : à fournir plusieurs programmes binaires optimisés pour exploiter les différents cœurs de l’ordinateur (hétérogènes ou non).

Cet article est réservé aux abonnés.
Il vous reste 92% à découvrir.

Pour explorer cet article
Téléchargez l'extrait gratuit

Vous êtes déjà abonné ?Connectez-vous !


L'expertise technique et scientifique de référence

La plus importante ressource documentaire technique et scientifique en langue française, avec + de 1 200 auteurs et 100 conseillers scientifiques.
+ de 10 000 articles et 1 000 fiches pratiques opérationnelles, + de 800 articles nouveaux ou mis à jours chaque année.
De la conception au prototypage, jusqu'à l'industrialisation, la référence pour sécuriser le développement de vos projets industriels.

VERSIONS

Il existe d'autres versions de cet article :

DOI (Digital Object Identifier)

https://doi.org/10.51257/a-v2-h3168


Cet article fait partie de l’offre

Technologies logicielles Architectures des systèmes

(240 articles en ce moment)

Cette offre vous donne accès à :

Une base complète d’articles

Actualisée et enrichie d’articles validés par nos comités scientifiques

Des services

Un ensemble d'outils exclusifs en complément des ressources

Un Parcours Pratique

Opérationnel et didactique, pour garantir l'acquisition des compétences transverses

Doc & Quiz

Des articles interactifs avec des quiz, pour une lecture constructive

ABONNEZ-VOUS

Lecture en cours
Présentation
Version en anglais English

8. Runtime

Le runtime d’un compilateur peut se définir comme l’ensemble du code qui est lié (linké) avec chaque programme pour permettre sa bonne exécution.

Le runtime prend en charge les fonctions de support au code généré par le compilateur. Classiquement, il s’agit des fonctions suivantes : (1) l’initialisation du programme. (2) la gestion des ressources de mémoire dynamique. (3) la gestion des entrée/sorties. (4) la génération de code dynamique. (5) la gestion des exceptions.

8.1 Initialisation du programme

Un programme ne démarre pas tout seul. Une préparation est nécessaire. Ceci se fait par l’exécution de code d’initialisation qui est très dépendant à la fois du système d’exploitation et du langage dans lequel le programme est écrit.

Pour un programme écrit en C sur Unix, cette initialisation a lieu dans une routine nommée _crt0 (pour C RunTime 0, où le 0 indique le tout début). Elle a la responsabilité de la mise en place de la pile, des arguments argc et argv de main(argc,argv), et des variables d’environnement. Une fois tout cela terminé, crt0 appelle la routine msain() par un simple appel de fonction, ce qui démarre l’exécution du programme proprement dit.

En C++, il faut également exécuter les constructeurs d’objets globaux avant d’appeler main().

HAUT DE PAGE

8.2 Gestion de la mémoire

Les besoins en mémoire d’un programme sont de plusieurs ordres.

Il y a celui qui est connu au moment du développement et ne dépend pas du jeu de données de l’application. Ce besoin est couvert par les diverses formes de variables globales offertes par les langages de programmation.

Il y a ensuite le besoin en mémoire dont la durée de vie n’excède pas la portée d’une routine ou d’une fonction. Ces besoins sont couverts par la pile et accessibles au programmeur sous la forme des variables locales de fonction ou des méthodes que proposent les langages.

Enfin, il y a le besoin en mémoire dynamique qui n’est pas connu au moment du développement car il dépend de la taille ou de la valeur des données que le programme aura à traiter. Au niveau du langage, ce besoin peut être satisfait de deux manières :

  1. directement...

Cet article est réservé aux abonnés.
Il vous reste 95% à découvrir.

Pour explorer cet article
Téléchargez l'extrait gratuit

Vous êtes déjà abonné ?Connectez-vous !


L'expertise technique et scientifique de référence

La plus importante ressource documentaire technique et scientifique en langue française, avec + de 1 200 auteurs et 100 conseillers scientifiques.
+ de 10 000 articles et 1 000 fiches pratiques opérationnelles, + de 800 articles nouveaux ou mis à jours chaque année.
De la conception au prototypage, jusqu'à l'industrialisation, la référence pour sécuriser le développement de vos projets industriels.

Cet article fait partie de l’offre

Technologies logicielles Architectures des systèmes

(240 articles en ce moment)

Cette offre vous donne accès à :

Une base complète d’articles

Actualisée et enrichie d’articles validés par nos comités scientifiques

Des services

Un ensemble d'outils exclusifs en complément des ressources

Un Parcours Pratique

Opérationnel et didactique, pour garantir l'acquisition des compétences transverses

Doc & Quiz

Des articles interactifs avec des quiz, pour une lecture constructive

ABONNEZ-VOUS

Lecture en cours
Runtime
Sommaire
Sommaire

BIBLIOGRAPHIE

  • (1) - FRIGO (M.) -   A fast Fourier transform compiler.  -  ACM SIGPLAN Notices, 39(4):642–655 (2004).

  • (2) - PUSCHEL (M.), MOURA (J.MF.), JOHNSON (J.R.), PADUA (D.), VELOSO (M.M.), SINGER (B.W.), XIONG (J.), FRANCHETTI (F.), GACIC (A.), VORONENKO (Y.) and others -   SPIRAL : Code generation for DSP transforms.  -  Proceedings of the IEEE, 93(2):232–275 (2005).

  • (3) - ISO -   The ANSI C standard (C99).  -  Technical Report WG14 N1124, ISO/IEC (1999).

  • (4) - ISO -   Microprocessor Systems – Floating-Point arithmetic.  -  Technical Report ISO/IEC/IEEE 60559:2011, ISO/IEC (2011).

  • (5) - American National Standards Institute, 1430 Broadway, New York, NY 10018, USA -   Military Standard Ada Programming Language,  -  February 1983. Also MIL-STD-1815A.

  • (6) - Bjarne Stroustrup -   The...

Cet article est réservé aux abonnés.
Il vous reste 92% à découvrir.

Pour explorer cet article
Téléchargez l'extrait gratuit

Vous êtes déjà abonné ?Connectez-vous !


L'expertise technique et scientifique de référence

La plus importante ressource documentaire technique et scientifique en langue française, avec + de 1 200 auteurs et 100 conseillers scientifiques.
+ de 10 000 articles et 1 000 fiches pratiques opérationnelles, + de 800 articles nouveaux ou mis à jours chaque année.
De la conception au prototypage, jusqu'à l'industrialisation, la référence pour sécuriser le développement de vos projets industriels.

Cet article fait partie de l’offre

Technologies logicielles Architectures des systèmes

(240 articles en ce moment)

Cette offre vous donne accès à :

Une base complète d’articles

Actualisée et enrichie d’articles validés par nos comités scientifiques

Des services

Un ensemble d'outils exclusifs en complément des ressources

Un Parcours Pratique

Opérationnel et didactique, pour garantir l'acquisition des compétences transverses

Doc & Quiz

Des articles interactifs avec des quiz, pour une lecture constructive

ABONNEZ-VOUS