System unit/fr
│
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 :
unit system;
interface
La définition de type de hresult
.
type
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.
var
exitCode: hresult = 0; export name 'operatingsystem_result';
implementation
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.
procedure initializeUnits; alias: 'FPC_INITIALIZEUNITS';
begin
end;
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.
procedure doExit; alias: 'FPC_DO_EXIT';
begin
end;
end.
De plus, FPC se plaindra peut-être que l'unité fpintres.pp
était manquante.
Créez donc un fichier fpintres.pas
:
unit FPIntRes;
interface
implementation
end.
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.
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 :
.section .data.n_INITFINAL
.balign 8
.globl INITFINAL
.type INITFINAL,@object
INITFINAL:
.quad 1,0
.quad INIT$_$SOMEUNIT
.quad FINALIZE$_$SOMEUNIT
Pour des recherches plus avancées, jeter un oeil à l'implémentation actuelle aide : rtl/inc/system.inc.
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
- 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)