Difference between revisions of "System unit/fr"

From Free Pascal wiki
Jump to navigationJump to search
(Creating and titles translation)
 
 
(3 intermediate revisions by one other user not shown)
Line 1: Line 1:
 
{{System_unit}}
 
{{System_unit}}
  
Dans [[FPC/fr|FPC]] l'unité <syntaxhighlight lang="pascal" enclose="none">system</syntaxhighlight> est celle qui est [[Uses/fr|inclue]] par ''tout'' [[Program/fr|programme]].
+
Dans [[FPC/fr|FPC]] l'unité <syntaxhighlight lang="pascal" inline>system</syntaxhighlight> est celle qui est [[Uses/fr|inclue]] par ''tout'' [[Program/fr|programme]].
  
La [[RTL/fr|bibliothèque d'exécution (RTL)]] est livrée avec l'unité <syntaxhighlight lang="pascal" enclose="none">system</syntaxhighlight> où la plupart de ses fonctionnalités, si ce n'est pas toutes, tournent sur ''chaque'' [[Platform list/fr|plateforme]] disponible.
+
La [[RTL/fr|bibliothèque d'exécution (RTL)]] est livrée avec l'unité <syntaxhighlight lang="pascal" inline>system</syntaxhighlight> où la plupart de ses fonctionnalités, si ce n'est pas toutes, tournent sur ''chaque'' [[Platform list/fr|plateforme]] disponible.
  
 
== Compilation des unités système ==
 
== Compilation des unités système ==
To compile a system unit one calls FPC with the <syntaxhighlight lang="bash" enclose="none">-Us</syntaxhighlight> flag.
+
Pour compiler une unité system, on doit appeler FPC avec le commutateur <syntaxhighlight lang="bash" inline>-Us</syntaxhighlight>.
This will tell the compiler that only basic type definitions are being made, and including a system unit is skipped.
+
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
Types such as [[Integer|<syntaxhighlight lang="pascal" enclose="none">integer</syntaxhighlight>]] won't be available.
+
Des types tels que [[Integer/fr|<syntaxhighlight lang="pascal" inline>integer</syntaxhighlight>]] ne seront pas disponibles.
  
 
=== Tâches obligatoire pour l'unité system ===
 
=== Tâches obligatoire pour l'unité system ===
If you attempt to create your own system unit, you'll incrementally notice what the compiler needs or what the generated code expects.
+
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é.
On a Linux target, the minimal system unit has to contain:
+
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>
The type definition of <syntaxhighlight lang="pascal" enclose="none">hresult</syntaxhighlight>.
+
La définition de type de <syntaxhighlight lang="pascal" inline>hresult</syntaxhighlight>.
 
<syntaxhighlight lang="pascal" line start="5">
 
<syntaxhighlight lang="pascal" line start="5">
 
type
 
type
 
hresult = longint;
 
hresult = longint;
 
</syntaxhighlight>
 
</syntaxhighlight>
The identifier <syntaxhighlight lang="pascal" enclose="none">operatingsystem_result</syntaxhighlight> has to be declared.
+
L'identificateur <syntaxhighlight lang="pascal" inline>operatingsystem_result</syntaxhighlight> doit être déclaré.
The data stored at that position are communicated to the operating system as return value.
+
Les données stockées à cette position sont communiquées au système d'exploitation comme valeur de retour.
Whether <syntaxhighlight lang="pascal" enclose="none">hresult</syntaxhighlight> and <syntaxhighlight lang="pascal" enclose="none">operatingsystem_result</syntaxhighlight> are defined in the <syntaxhighlight lang="pascal" enclose="none">interface</syntaxhighlight> section is irrelevant.
+
 
However, it is very plausible to put those into the <syntaxhighlight lang="pascal" enclose="none">interface</syntaxhighlight> section, so programs using this <syntaxhighlight lang="pascal" enclose="none">system</syntaxhighlight> unit can manipulate those.
+
Que <syntaxhighlight lang="pascal" inline>hresult</syntaxhighlight> et <syntaxhighlight lang="pascal" inline>operatingsystem_result</syntaxhighlight> soient définis dans la section <syntaxhighlight lang="pascal" inline>interface</syntaxhighlight> n'est pas pertinent.  
 +
 
 +
Pourtant, il est très plausible de les mettre dans la section <syntaxhighlight lang="pascal" inline>interface</syntaxhighlight>, ainsi les programmes utilisant cette unité <syntaxhighlight lang="pascal" inline>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>
Here comes to light what the system responsibilities are:
+
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" inline>initialization</syntaxhighlight>]].
It has to initialize (or should) initialize units, that means call every unit's [[Initialization|<syntaxhighlight lang="pascal" enclose="none">initialization</syntaxhighlight> routines]].
+
Pour cela, l'étiquette <syntaxhighlight lang="pascal" inline>FPC_INITIALIZEUNITS</syntaxhighlight> doit être définie.
For that the label <syntaxhighlight lang="pascal" enclose="none">FPC_INITIALIZEUNITS</syntaxhighlight> has to be defined.
 
 
<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>
Also the label <syntaxhighlight lang="pascal" enclose="none">FPC_DO_EXIT</syntaxhighlight> has to be defined.
+
L'étiquette <syntaxhighlight lang="pascal" inline>FPC_DO_EXIT</syntaxhighlight> doit également être définie. Ici, les programmeurs d'unités system ont la possibilité de finaliser les unités.
Here, system unit programmers have the chance to finalize units.
 
 
<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" inline>fpintres.pp</syntaxhighlight> était manquante.
Furthermore FPC will possibly complain the unit <syntaxhighlight lang="bash" enclose="none">fpintres.pp</syntaxhighlight> were missing.
+
Créez donc un fichier <syntaxhighlight lang="pascal" inline>fpintres.pas</syntaxhighlight>:
So create a file <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>
  
After doing so, you can compile your system unit with <syntaxhighlight lang="bash" enclose="none">fpc -Us system.pas</syntaxhighlight>, or directly create an empty program and compile it to examine the impact on the binary's size.
+
Après avoir fait cela, vous pouvez compiler votre unité System avec <syntaxhighlight lang="bash" inline>fpc -Us system.pas</syntaxhighlight>, ou directement  créer un programme vide et le compiler pour examiner l'impact sur la taille du binaire.
On a x86-64 Linux target the executable had a size of 2744 bytes.
+
Sur une cible Linux x86-64, l'exécutable a une taille de 2744 octets.
The big trade-off is no convenience.
 
All functionality that can't be “implemented” by the compiler is gone.
 
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.
 
  
{{Note|Depending on what your program uses, there might ''other'' mandatory tasks, too.
+
Le grand compromis n'est pas pratique. Toute la fonctionnalité qui peut être "implémentée" par le compilateur est partie.
Especially OOP won't work without a functional <syntaxhighlight lang="pascal" enclose="none">objpas</syntaxhighlight> unit.}}
+
 
 +
Par exemple, {{Doc|package=RTL|unit=system|identifier=addr|text=<syntaxhighlight lang="pascal" inline>addr</syntaxhighlight>}} ou {{Doc|package=RTL|unit=system|identifier=ord|text=<syntaxhighlight lang="pascal" inline>ord</syntaxhighlight>}} fonctionne encore, alors que {{Doc|package=RTL|unit=system|identifier=sin|text=<syntaxhighlight lang="pascal" inline>sin</syntaxhighlight>}} ou {{Doc|package=RTL|unit=system|identifier=random|text=<syntaxhighlight lang="pascal" inline>random</syntaxhighlight>}} ne sont pas disponibles.
 +
 
 +
{{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é <syntaxhighlight lang="pascal" inline>objpas</syntaxhighlight> fonctionnelle.}}
  
 
=== Initialisation et finalisation des unités ===
 
=== Initialisation et finalisation des unités ===
  
For those who are curious, how to implement <syntaxhighlight lang="pascal" enclose="none">FPC_INITIALIZEUNITS</syntaxhighlight>:
+
Pour ceux qui sont curieux, comment implémenter <syntaxhighlight lang="pascal" inline>FPC_INITIALIZEUNITS</syntaxhighlight> : FPC met dans la section de donnée de chaque programme une table <syntaxhighlight lang="asm" inline>INITFINAL</syntaxhighlight>.
FPC puts into every program's data section a <syntaxhighlight lang="asm" enclose="none">INITFINAL</syntaxhighlight> table.
+
 
Compiling a program with the <syntaxhighlight lang="bash" enclose="none">-al</syntaxhighlight> flag will retain the [[Assembly language|assembler]] file.
+
La compilation d'un programme avec le commutateur <syntaxhighlight lang="bash" inline>-al</syntaxhighlight> maintiendra un fichier [[Assembly language/fr|assembleur]].
Examining it you will encounter something like:
+
En l'examinant, vous rencontrerez quelque chose comme cela :
 
<syntaxhighlight lang="asm" line start="33" highlight="5-8">
 
<syntaxhighlight lang="asm" line start="33" highlight="5-8">
 
.section .data.n_INITFINAL
 
.section .data.n_INITFINAL
Line 85: Line 85:
 
         .quad  FINALIZE$_$SOMEUNIT
 
         .quad  FINALIZE$_$SOMEUNIT
 
</syntaxhighlight>
 
</syntaxhighlight>
For further investigations have a glimpse at an actual implementation helps:
+
Pour des recherches plus avancées, jeter un oeil à l'implémentation actuelle aide : [https://svn.freepascal.org/cgi-bin/viewvc.cgi/tags/release_3_0_4/rtl/inc/system.inc?view=markup#l862 <tt>rtl/inc/system.inc</tt>].
[https://svn.freepascal.org/cgi-bin/viewvc.cgi/tags/release_3_0_4/rtl/inc/system.inc?view=markup#l862 <tt>rtl/inc/system.inc</tt>].
 
  
{{Note|In general, implementing an “own” system unit is a stupid idea.
+
{{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 ;-) ).
<!-- Also, it's a waste of man-hours. -->
+
<!-- Aussi, c'est une perte de jour-homme. -->
There is “smartlinking” if [[Size Matters|size matters]].
+
Il y a le “smartlinking” si [[Size Matters/fr|la taille compte]].
<!-- Help by [[Creating A Patch|creating a patch]] instead. -->}}
+
<!-- Help by [[Creating A Patch/fr|création d'un patch]] à la place. -->}}
  
 
== Remarques comparatives ==
 
== Remarques comparatives ==
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 <syntaxhighlight lang="bash" enclose="none">system.pp</syntaxhighlight>.
+
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 <syntaxhighlight lang="bash" inline>system.pp</syntaxhighlight>.
  
 
== Voir aussi ==
 
== Voir aussi ==
* FPC RTL {{Doc|package=RTL|unit=system|text=<syntaxhighlight lang="pascal" enclose="none">system</syntaxhighlight> unit reference}}
+
* FPC RTL {{Doc|package=RTL|unit=system|text=<syntaxhighlight lang="pascal" inline>system</syntaxhighlight> unit reference}}
 
* [[System unit structure/fr|Structure de l'unité System]], quelques explications sur l'unité system distribuée.
 
* [[System unit structure/fr|Structure de l'unité System]], quelques explications sur l'unité system distribuée.
 
* [[Minimal RTL|RTL minimale (en)]]
 
* [[Minimal RTL|RTL minimale (en)]]
 
* [[RTL development articles|Articles de développement RTL (en)]]
 
* [[RTL development articles|Articles de développement RTL (en)]]

Latest revision as of 16:22, 6 August 2022

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.

Par exemple, addr ou ord fonctionne encore, alors que sin ou random ne sont pas disponibles.

Light bulb  Remarque: 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.

Initialisation et finalisation des unités

Pour ceux qui sont curieux, comment implémenter FPC_INITIALIZEUNITS : FPC met dans la section de donnée de chaque programme une table INITFINAL.

La compilation d'un programme avec le commutateur -al maintiendra un fichier assembleur. En l'examinant, vous rencontrerez quelque chose comme cela :

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

Pour des recherches plus avancées, jeter un oeil à l'implémentation actuelle aide : rtl/inc/system.inc.

Light bulb  Remarque: 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 la taille compte.

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