Sign in Join
Wiki copytemporary

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

OldNewLine
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).*

Back to history