System unit/fr: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: System unit/fr
| Old | New | Line | |
|---|---|---|---|
| 1 | + | Dans [[FPC/fr|FPC]] l'unité `system` est celle qui est [[Uses/fr|inclue]] par *tout* [[Program/fr|programme]]. | |
| 2 | + | ||
| 3 | + | La [[RTL/fr|bibliothèque d'exécution (RTL)]] est livrée avec l'unité `system` où la plupart de ses fonctionnalités, si ce n'est pas toutes, tournent sur *chaque* [[Platform list/fr|plateforme]] disponible. | |
| 4 | + | ||
| 5 | + | ## Compilation des unités système | |
| 6 | + | ||
| 7 | + | Pour compiler une unité system, on doit appeler FPC avec le commutateur `-Us`. Cela indiquera au compilateur que seules les définitions de type de base sont faites et que l'inclusion d'une unité systèm est ignorée Des types tels que [[Integer/fr|integer]] ne seront pas disponibles. | |
| 8 | + | ||
| 9 | + | ### Tâches obligatoire pour l'unité system | |
| 10 | + | ||
| 11 | + | Si vous tentez de créer votre propre unité system, vous noterez de manière incrémentale ce dont le compilateur a besoin ou ce qu'attend le code généré. Sur une cible Linux, l'unité minimal System doit contenir : | |
| 12 | + | ||
| 13 | + | ``` pascal | |
| 14 | + | unit system; | |
| 15 | + | ||
| 16 | + | interface | |
| 17 | + | ``` | |
| 18 | + | ||
| 19 | + | La définition de type de `hresult`. | |
| 20 | + | ||
| 21 | + | ``` pascal | |
| 22 | + | type | |
| 23 | + | hresult = longint; | |
| 24 | + | ``` | |
| 25 | + | ||
| 26 | + | L'identificateur `operatingsystem_result` doit être déclaré. Les données stockées à cette position sont communiquées au système d'exploitation comme valeur de retour. | |
| 27 | + | ||
| 28 | + | Que `hresult` et `operatingsystem_result` soient définis dans la section `interface` n'est pas pertinent. | |
| 29 | + | ||
| 30 | + | Pourtant, il est très plausible de les mettre dans la section `interface`, ainsi les programmes utilisant cette unité `system` peuvent les manipuler. | |
| 31 | + | ||
| 32 | + | ``` pascal | |
| 33 | + | var | |
| 34 | + | exitCode: hresult = 0; export name 'operatingsystem_result'; | |
| 35 | + | ||
| 36 | + | implementation | |
| 37 | + | ``` | |
| 38 | + | ||
| 39 | + | Ici la lumière est faite sur ce que sont les responsabilités du système : il doit initialiser (ou devrait initialiser) les unités, ce qui veut dire qu'il appelle chaque [[Initialization/fr|routines d'initialization]]. Pour cela, l'étiquette `FPC_INITIALIZEUNITS` doit être définie. | |
| 40 | + | ||
| 41 | + | ``` pascal | |
| 42 | + | procedure initializeUnits; alias: 'FPC_INITIALIZEUNITS'; | |
| 43 | + | begin | |
| 44 | + | end; | |
| 45 | + | ``` | |
| 46 | + | ||
| 47 | + | L'étiquette `FPC_DO_EXIT` doit également être définie. Ici, les programmeurs d'unités system ont la possibilité de finaliser les unités. | |
| 48 | + | ||
| 49 | + | ``` pascal | |
| 50 | + | procedure doExit; alias: 'FPC_DO_EXIT'; | |
| 51 | + | begin | |
| 52 | + | end; | |
| 53 | + | ||
| 54 | + | end. | |
| 55 | + | ``` | |
| 56 | + | ||
| 57 | + | De plus, FPC se plaindra peut-être que l'unité `fpintres.pp` était manquante. Créez donc un fichier `fpintres.pas`: | |
| 58 | + | ||
| 59 | + | ``` pascal | |
| 60 | + | unit FPIntRes; | |
| 61 | + | interface | |
| 62 | + | implementation | |
| 63 | + | end. | |
| 64 | + | ``` | |
| 65 | + | ||
| 66 | + | Après avoir fait cela, vous pouvez compiler votre unité System avec `fpc -Us system.pas`, ou directement créer un programme vide et le compiler pour examiner l'impact sur la taille du binaire. Sur une cible Linux x86-64, l'exécutable a une taille de 2744 octets. | |
| 67 | + | ||
| 68 | + | Le grand compromis n'est pas pratique. Toute la fonctionnalité qui peut être "implémentée" par le compilateur est partie. | |
| 69 | + | ||
| 70 | + | Par exemple, [`addr`](https://www.freepascal.org/docs-html/rtl/system/addr.html) ou [`ord`](https://www.freepascal.org/docs-html/rtl/system/ord.html) fonctionne encore, alors que [`sin`](https://www.freepascal.org/docs-html/rtl/system/sin.html) ou [`random`](https://www.freepascal.org/docs-html/rtl/system/random.html) ne sont pas disponibles. | |
| 71 | + | ||
| 72 | + | > **Note:** Selon ce que votre programme utilise, il peut y avoir aussi d'autres tâches obligatoires. En particulier, la POO ne marchera pas sans une unité `objpas` fonctionnelle. | |
| 73 | + | ||
| 74 | + | ### Initialisation et finalisation des unités | |
| 75 | + | ||
| 76 | + | Pour ceux qui sont curieux, comment implémenter `FPC_INITIALIZEUNITS` : FPC met dans la section de donnée de chaque programme une table `INITFINAL`. | |
| 77 | + | ||
| 78 | + | La compilation d'un programme avec le commutateur `-al` maintiendra un fichier [[Assembly language/fr|assembleur]]. En l'examinant, vous rencontrerez quelque chose comme cela : | |
| 79 | + | ||
| 80 | + | ``` asm | |
| 81 | + | .section .data.n_INITFINAL | |
| 82 | + | .balign 8 | |
| 83 | + | .globl INITFINAL | |
| 84 | + | .type INITFINAL,@object | |
| 85 | + | INITFINAL: | |
| 86 | + | .quad 1,0 | |
| 87 | + | .quad INIT$_$SOMEUNIT | |
| 88 | + | .quad FINALIZE$_$SOMEUNIT | |
| 89 | + | ``` | |
| 90 | + | ||
| 91 | + | Pour des recherches plus avancées, jeter un oeil à l'implémentation actuelle aide : [`rtl/inc/system.inc`](https://svn.freepascal.org/cgi-bin/viewvc.cgi/tags/release_3_0_4/rtl/inc/system.inc?view=markup#l862). | |
| 92 | + | ||
| 93 | + | > **Note:** En général, implémenter sa propre sa "propre" unité system est une idée stupide (Ndt: le dire au début aura donc éviter une lecture inutile ;-) ). Il y a le “smartlinking” si [[Size Matters/fr|la taille compte]]. | |
| 94 | + | ||
| 95 | + | ## Remarques comparatives | |
| 96 | + | ||
| 97 | + | D'autres compilateurs tels que [[GNU Pascal/fr|GNU Pascal (GPC)]] ou [[Delphi/fr|Delphi]] utilise des constructions similaires, mais à des degrés divers, et l'unité système n'est pas nécessairement nommée `system.pp`. | |
| 98 | + | ||
| 99 | + | ## Voir aussi | |
| 100 | + | ||
| 101 | + | - FPC RTL [`system` unit reference](https://www.freepascal.org/docs-html/rtl/system/index.html) | |
| 102 | + | - [[System unit structure/fr|Structure de l'unité System]], quelques explications sur l'unité system distribuée. | |
| 103 | + | - [[Minimal RTL|RTL minimale (en)]] | |
| 104 | + | - [[RTL development articles|Articles de développement RTL (en)]] | |
| 105 | + | ||
| 106 | + | --- | |
| 107 | + | *From the Free Pascal wiki, page "System unit/fr", as it stood on 2022-08-06 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
