Difference between revisions of "System unit/fr"
(Creating and titles translation) |
|||
Line 6: | Line 6: | ||
== Compilation des unités système == | == Compilation des unités système == | ||
− | + | Pour compiler une unité system, on doit appeler FPC avec le commutateur <syntaxhighlight lang="bash" enclose="none">-Us</syntaxhighlight>. | |
− | + | 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|<syntaxhighlight lang="pascal" enclose="none">integer</syntaxhighlight>]] ne seront pas disponibles. | |
=== Tâches obligatoire pour l'unité system === | === Tâches obligatoire pour l'unité system === | ||
− | + | 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 : | |
<syntaxhighlight lang="pascal" line start="1"> | <syntaxhighlight lang="pascal" line start="1"> | ||
unit system; | unit system; | ||
Line 18: | Line 18: | ||
interface | interface | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | La définition de type de <syntaxhighlight lang="pascal" enclose="none">hresult</syntaxhighlight>. | |
<syntaxhighlight lang="pascal" line start="5"> | <syntaxhighlight lang="pascal" line start="5"> | ||
type | type | ||
hresult = longint; | hresult = longint; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | L'identificateur <syntaxhighlight lang="pascal" enclose="none">operatingsystem_result</syntaxhighlight> doit être déclaré. | |
− | + | Les données stockées à cette position sont communiquées au système d'exploitation comme valeur de retour. | |
− | + | ||
− | + | Que <syntaxhighlight lang="pascal" enclose="none">hresult</syntaxhighlight> et <syntaxhighlight lang="pascal" enclose="none">operatingsystem_result</syntaxhighlight> soient définis dans la section <syntaxhighlight lang="pascal" enclose="none">interface</syntaxhighlight> n'est pas pertinent. | |
+ | |||
+ | Pourtant, il est très plausible de les mettre dans la section <syntaxhighlight lang="pascal" enclose="none">interface</syntaxhighlight>, ainsi les programmes utilisant cette unité <syntaxhighlight lang="pascal" enclose="none">system</syntaxhighlight> peuvent les manipuler. | ||
+ | |||
<syntaxhighlight lang="pascal" line start="8"> | <syntaxhighlight lang="pascal" line start="8"> | ||
var | var | ||
Line 33: | Line 36: | ||
implementation | implementation | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | 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'<syntaxhighlight lang="pascal" enclose="none">initialization</syntaxhighlight>]]. | |
− | + | Pour cela, l'étiquette <syntaxhighlight lang="pascal" enclose="none">FPC_INITIALIZEUNITS</syntaxhighlight> doit être définie. | |
− | |||
<syntaxhighlight lang="pascal" line start="13"> | <syntaxhighlight lang="pascal" line start="13"> | ||
procedure initializeUnits; alias: 'FPC_INITIALIZEUNITS'; | procedure initializeUnits; alias: 'FPC_INITIALIZEUNITS'; | ||
Line 41: | Line 43: | ||
end; | end; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | L'étiquette <syntaxhighlight lang="pascal" enclose="none">FPC_DO_EXIT</syntaxhighlight> doit également être définie. Ici, les programmeurs d'unités system ont la possibilité de finaliser les unités. | |
− | |||
<syntaxhighlight lang="pascal" line start="17"> | <syntaxhighlight lang="pascal" line start="17"> | ||
procedure doExit; alias: 'FPC_DO_EXIT'; | procedure doExit; alias: 'FPC_DO_EXIT'; | ||
Line 50: | Line 51: | ||
end. | end. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | De plus, FPC se plaindra peut-être que l'unité <syntaxhighlight lang="bash" enclose="none">fpintres.pp</syntaxhighlight> était manquante. | |
− | + | Créez donc un fichier <syntaxhighlight lang="pascal" enclose="none">fpintres.pas</syntaxhighlight>: | |
− | |||
<syntaxhighlight lang="pascal" line start="1"> | <syntaxhighlight lang="pascal" line start="1"> | ||
unit FPIntRes; | unit FPIntRes; | ||
Line 60: | Line 60: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Après avoir fait cela, vous pouvez compiler votre unité System avec <syntaxhighlight lang="bash" enclose="none">fpc -Us system.pas</syntaxhighlight>, 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. | |
− | + | ||
− | + | Le grand compromis n'est pas pratique. Toute la fonctionnalité qui peut être "implémentée" par le compilateur est partie. | |
+ | |||
For example {{Doc|package=RTL|unit=system|identifier=addr|text=<syntaxhighlight lang="pascal" enclose="none">addr</syntaxhighlight>}} or {{Doc|package=RTL|unit=system|identifier=ord|text=<syntaxhighlight lang="pascal" enclose="none">ord</syntaxhighlight>}} still work, while {{Doc|package=RTL|unit=system|identifier=sin|text=<syntaxhighlight lang="pascal" enclose="none">sin</syntaxhighlight>}} or {{Doc|package=RTL|unit=system|identifier=random|text=<syntaxhighlight lang="pascal" enclose="none">random</syntaxhighlight>}} are not available. | For example {{Doc|package=RTL|unit=system|identifier=addr|text=<syntaxhighlight lang="pascal" enclose="none">addr</syntaxhighlight>}} or {{Doc|package=RTL|unit=system|identifier=ord|text=<syntaxhighlight lang="pascal" enclose="none">ord</syntaxhighlight>}} still work, while {{Doc|package=RTL|unit=system|identifier=sin|text=<syntaxhighlight lang="pascal" enclose="none">sin</syntaxhighlight>}} or {{Doc|package=RTL|unit=system|identifier=random|text=<syntaxhighlight lang="pascal" enclose="none">random</syntaxhighlight>}} are not available. | ||
Revision as of 22:20, 2 May 2020
│
English (en) │
français (fr) │
Dans FPC l'unité system
est celle qui est inclue par tout programme.
La 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 plateforme disponible.
Compilation des unités système
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
ne seront pas disponibles.
Tâches obligatoire pour l'unité system
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 :
1unit system;
2
3interface
La définition de type de hresult
.
5type
6 hresult = longint;
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.
Que hresult
et operatingsystem_result
soient définis dans la section interface
n'est pas pertinent.
Pourtant, il est très plausible de les mettre dans la section interface
, ainsi les programmes utilisant cette unité system
peuvent les manipuler.
8var
9 exitCode: hresult = 0; export name 'operatingsystem_result';
10
11implementation
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 routines d'initialization
.
Pour cela, l'étiquette FPC_INITIALIZEUNITS
doit être définie.
13procedure initializeUnits; alias: 'FPC_INITIALIZEUNITS';
14begin
15end;
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.
17procedure doExit; alias: 'FPC_DO_EXIT';
18begin
19end;
20
21end.
De plus, FPC se plaindra peut-être que l'unité fpintres.pp
était manquante.
Créez donc un fichier fpintres.pas
:
1unit FPIntRes;
2interface
3implementation
4end.
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.
Le grand compromis n'est pas pratique. Toute la fonctionnalité qui peut être "implémentée" par le compilateur est partie.
For example addr
or ord
still work, while sin
or random
are not available.
Remarque: Depending on what your program uses, there might other mandatory tasks, too.
Especially OOP won't work without a functionalobjpas
unit.Initialisation et finalisation des unités
For those who are curious, how to implement FPC_INITIALIZEUNITS
:
FPC puts into every program's data section a INITFINAL
table.
Compiling a program with the -al
flag will retain the assembler file.
Examining it you will encounter something like:
33.section .data.n_INITFINAL
34 .balign 8
35.globl INITFINAL
36 .type INITFINAL,@object
37INITFINAL:
38 .quad 1,0
39 .quad INIT$_$SOMEUNIT
40 .quad FINALIZE$_$SOMEUNIT
For further investigations have a glimpse at an actual implementation helps: rtl/inc/system.inc.
Remarque: In general, implementing an “own” system unit is a stupid idea. There is “smartlinking” if size matters.
Remarques comparatives
D'autres compilateurs tels que GNU Pascal (GPC) ou Delphi utilise des constructions similaires, mais à des degrés divers, et l'unité système n'est pas nécessairement nommée system.pp
.
Voir aussi
- FPC RTL
system
unit reference - Structure de l'unité System, quelques explications sur l'unité system distribuée.
- RTL minimale (en)
- Articles de développement RTL (en)