Recherchez sur tout Techno-Science.net
       
Techno-Science.net : Suivez l'actualité des sciences et des technologies, découvrez, commentez
 A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | +
Préprocesseur
Langages à objets
C++ - C# - D
Delphi - Eiffel - Groovy
Java - Lisaac - Python - Ruby
Simula - Smalltalk
Visual Basic - WLangage
Langages impératifs
APL - ASP - Assembleur
BASIC (En programmation, BASIC est un acronyme pour Beginner's All-purpose Symbolic Instruction Code. qui désigne une famille de langages de programmations de haut niveau.) - C - Cobol (COBOL est un langage de programmation de troisième génération créé en 1959 (officiellement le 18 Septembre 1959). Son nom est l'acronyme de COmmon...) - Natural (Natural est un langage de programmation semi-compilé, édité par la société allemande Software AG.)
Forth - Fortran - Limbo
Logo - Pascal - Perl - PHP (PHP (sigle de PHP: Hypertext Preprocessor), est un langage de scripts libre principalement utilisé pour produire des pages Web dynamiques via un serveur HTTP,...)
Langages fonctionnels
Haskell - ML/OCaml
Lisp/Common Lisp
Scheme - XSLT
Langages déclaratifs
Clips - Prolog
Langages concurrents
Ada 95 - Erlang
Voir aussi
Conception - Codage (De façon générale un codage permet de passer d'une représentation des données vers une autre.)
Tests - Optimisations

En informatique (L´informatique - contraction d´information et automatique - est le domaine d'activité scientifique, technique et industriel en rapport avec le traitement automatique de...), un préprocesseur est un programme qui procède à des transformations sur un code source (Le code source (ou les sources voire le source) est un ensemble d'instructions écrites dans un langage de programmation informatique de haut niveau, compréhensible...), avant l'étape de compilation ou d'interprétation proprement dite. Les préprocesseurs sont des exemples typiques de langages spécialisés.

Pré-processeurs lexicaux

Les préprocesseurs lexicaux sont les préprocesseurs de plus bas niveau, au sens (SENS (Strategies for Engineered Negligible Senescence) est un projet scientifique qui a pour but l'extension radicale de l'espérance de vie humaine. Par une évolution progressive allant du...) où ils requièrent uniquement un mécanisme d'analyse lexicale (L'analyse lexicale est la transformation d’un flot de caractères en un flot de lexèmes ou tokens.). Ces préprocesseurs se contentent de procéder à des substitutions de chaînes de caractères en fonction de règles définies par l'utilisateur. On les utilise généralement pour instancier des macros, inclure d'autres fichiers (par opposition à des fonctionnalités de plus haut niveau telles que l'inclusion de modules/paquets/unités/composants) et permettre la compilation ou/et l'inclusion conditionnelle.

Pré-processeur C/C++

Le préprocesseur le plus utilisé est CPP, pour C PreProcessor, qui est employé à chaque étape dans le monde (Le mot monde peut désigner :) C/C++.

Inclusion

L'usage (L’usage est l'action de se servir de quelque chose.) le plus fréquent du préprocesseur C est la directive

 
 #include "…" 
 

ou

 
 #include <…> 
 

dont le rôle est de recopier le contenu d'un fichier ( Un fichier est un endroit où sont rangées des fiches. Cela peut-être un meuble, une pièce, un bâtiment, une base de...) dans le fichier courant. On l'emploie généralement pour inclure les en-têtes de bibliothèques, telles que les fonctions mathématiques () ou les fonctions d'entrée/sortie standard ().

Si cet usage du préprocesseur permet d'ajouter à moindre coût la réutilisation de code à un langage de programmation (Un langage de programmation est un langage informatique, permettant à un être humain d'écrire un code source qui sera analysé par une machine,...), il s'agit d'une technique lente (La Lente est une rivière de la Toscane.), inefficace, et qui nécessite l'ajout manuel de directives de compilation conditionnelle pour éviter d'inclure et de compiler plusieurs fois un fichier d'en-tête.

Depuis les années 1970, des alternatives (Alternatives (titre original : Destiny Three Times) est un roman de Fritz Leiber publié en 1945.) plus rapides, plus sûres et plus efficaces sont connues et employées dans la majorité des langages de programmation : Java comporte des paquets, Pascal des unités, Modula, OCaml, Haskell ou Python des modules. De même, le langage D, conçu comme remplacement de C et C++ a des « importations » (NB : à la connaissance du rédacteur de cet article, le terme n'a pas encore de traduction officielle).

Macros

Le mécanisme des macros est fréquemment utilisé en C pour définir de petits extraits de code qui seront réutilisés à divers endroits du programme. Durant l'exécution du préprocesseur, chaque appel de la macro est remplacé, dans le corps du fichier, par la définition de cette macro.

Exemple :

 
 #define max(a,b) a>b?a:b 
 

définit la macro max. Cette macro peut être appelée comme n'importe quelle fonction C. Ainsi, après passage du préprocesseur,

 
 z = max(x,y); 
 

devient

 
 z = x>y?x:y; 
 

Cet usage des macros est fondamental en C, notamment pour définir des structures de données sûres ou en tant qu'outil (Un outil est un objet finalisé utilisé par un être vivant dans le but d'augmenter son efficacité naturelle dans l'action. Cette augmentation se traduit par la simplification des actions entreprises, par une plus grande...) de débogage, il ralentit la compilation et parfois l'exécution, et présente de nombreux pièges.

Ainsi, contrairement à l'intuition, si f et g sont deux fonctions, l'appel

 
 z = max(f(), g()); 
 

ne se contentera pas d'évaluer f() et g() et de placer le plus haut des résultats dans z. En fait, l'une des deux fonctions sera évaluée deux fois. Si cette fonction a des effets de bord, ceci n'est généralement pas le comportement attendu.

Les langages de programmation (La programmation dans le domaine informatique est l'ensemble des activités qui permettent l'écriture des programmes informatiques. C'est une étape importante de la conception de logiciel (voire...) plus modernes se passent généralement de méta-programmation par macro-expansion de chaînes de caractères, et utilisent généralement des fonctions/méthodes traditionnelles, recopiées par le compilateur en ligne en fonction d'optimisations automatiques ou guidées. De même, plutôt que d'utiliser des macros pour définir des structures de données, ces langages utilisent souvent du polymorphisme paramétrique (aussi appelé templates, alias méthodes/classes génériques).

Les langages Lisp, cependant, sont intégralement conçus autour (Autour est le nom que la nomenclature aviaire en langue française (mise à jour) donne à 31 espèces d'oiseaux qui, soit appartiennent au genre Accipiter, soit constituent les 5 genres Erythrotriorchis, Kaupifalco,...) d'une utilisation similaire des macros, mais à l'aide de techniques bien plus puissantes.

Compilation conditionnelle

Le préprocesseur C permet aussi la compilation conditionnelle, ce qui permet de disposer de plusieurs versions d'un même programme ou d'un extrait dans un même fichier source. Typiquement, les programmeurs C utilisent cette technique pour pouvoir compiler différemment le programme en fonction de son état d'avancement, de la plateforme de destination, des tests désirés, ou pour s'assurer que les fichiers d'en-tête ne sont inclus qu'une seule fois.

 
 #ifdef x 
 … 
 #else 
 … 
 #endif 
 

or

 
 #if x 
 … 
 #else 
 … 
 #endif 
 

La majorité des langages de programmation modernes n'utilisent pas cette fonctionnalité et dépendent plutôt d'une utilisation des habituels opérateurs if…then…else…, laissant au compilateur la tâche de supprimer le code inutile.

Autres pré-processeurs lexicaux

  • Le langage généraliste m4 est utilisé essentiellement dans la conception de systèmes de compilation multiplate-forme (Un logiciel multiplate-forme ou multiplateforme est un logiciel conçu pour fonctionner sur plusieurs plates-formes, c’est-à-dire le couple liant ordinateur et système d’exploitation....).
  • Le langage généraliste php (Hypertext Preprocessor) est utilisé essentiellement pour la conception de sites web.

Préprocesseurs syntaxiques

La notion de préprocesseur syntaxique a été introduite avec le langage Lisp. Son rôle est de transformer des arbres de syntaxe en fonction de règles définies par l'utilisateur. Pour certains langages de programmation, ces règles sont écrites dans le même langage que le programme (introspection statique). C'est le cas de Lisp ou d'OCaml. Dans d'autres cas, il s'agit d'un langage externe entièrement, tel que XSLT pour XML, ou de sa contrepartie statiquement typée CDuce.

Les préprocesseurs syntaxiques sont typiquement utilisés pour personnaliser la syntaxe d'un langage, pour étendre un langage avec de nouvelles primitives ou pour transformer un langage de programmation généraliste en un langage spécialisé.

Personnalisation de la syntaxe

Un bon exemple de personnalisation de syntaxe est l'existence de deux syntaxes distinctes pour le langage OCaml. Un programme peut être écrit indifféremment à l'aide de la « syntaxe normale » ou de la « syntaxe révisée », et peut être réaffiché à la demande dans une syntaxe ou l'autre.

De même, un grand nombre (La notion de nombre en linguistique est traitée à l’article « Nombre grammatical ».) de programmes écrits en OCaml personnalisent la syntaxe du langage pour lui ajouter de nouveaux opérateurs.

Extension d'un langage

Le meilleur exemple d'extension d'un langage à l'aide de macros est Lisp. Alors que les langages de la famille, par eux-mêmes, ne sont que des noyaux fonctionnels minimalistes (moins de 10 instructions) et dynamiquement typés, la distribution standard de Scheme ou de Common Lisp permet la programmation impérative ou orientée objets, ou encore le typage statique (Le mot statique peut désigner ou qualifier ce qui est relatif à l'absence de mouvement. Il peut être employé comme :). Toutes ces fonctionnalités sont implantées à l'aide du préprocesseur syntaxique.

De la même manière, la gestion d'expressions rationnelles ou la génération de code statiquement vérifiées et fortement typées peuvent être ajoutées à la syntaxe et la sémantique d'OCaml à l'aide de macros, de même que des fibres (Une fibre est une formation élémentaire, végétale ou animale, d'aspect filamenteux, se présentant généralement sous forme de faisceaux.) (ou coroutines, ou générateurs), des monades ou la manipulation transparente d'arbres XML.

Specialisation d'un langage

Une fonctionnalité inhabituelle de Lisp est la possibilité d'utiliser des macros pour transformer le langage en un langage spécialisé. Typiquement, dans tout (Le tout compris comme ensemble de ce qui existe est souvent interprété comme le monde ou l'univers.) projet (Un projet est un engagement irréversible de résultat incertain, non reproductible a priori à l’identique, nécessitant le concours et l’intégration d’une grande...) Lisp suffisamment large, une partie de l'effort est concentré sur l'adaptation du langage lui-même à la tâche visée, et la construction, par exemple, de dialectes pour SQL ou pour l'affichage (L' affichage désigne l'application d'une surface de papier script dans un lieu public(et non du foyer)sur un support destiné à son émission, externe ou...) ou l'interface (Une interface est une zone, réelle ou virtuelle qui sépare deux éléments. L’interface désigne ainsi ce que chaque élément a besoin de connaître de...) graphique, etc. D'après des programmeurs Lisp expérimentés, cette fonctionnalité leur permet de diviser par 7 à 20 fois le temps (Le temps est un concept développé par l'être humain pour appréhender le changement dans le monde.) et la longueur (La longueur d’un objet est la distance entre ses deux extrémités les plus éloignées. Lorsque l’objet est filiforme ou en forme de lacet, sa longueur est celle de l’objet...) du code nécessaire pour achever un projet.

Le préprocesseur MetaOCaml fournit des fonctionnalités similaires pour la conception de langages spécialisés externes. Ce préprocesseur, à partir de la description de la sémantique d'un langage (i.e. un interpréteur), à l'aide d'interprétation durant la compilation et de génération de code, convertit cette description en un compilateur dans le langage Ocaml.

Source: Wikipédia publiée sous licence CC-BY-SA 3.0.

Vous pouvez soumettre une modification à cette définition sur cette page. La liste des auteurs de cet article est disponible ici.