Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
* Gestion des librairies
@ 1997-11-26 12:29 Emmanuel Engel
  1997-12-02 15:03 ` Xavier Leroy
  0 siblings, 1 reply; 2+ messages in thread
From: Emmanuel Engel @ 1997-11-26 12:29 UTC (permalink / raw)
  To: caml-list

Je  me pose une  question sur le  cout, en terme  de place, des gros
modules en Caml. 

  Dans  un langage de  programmation  comme C,  lorsque  l'on souhaite
ecrire  une librairie, une  bonne pratique est  de  mettre chacune des
fonctions  de la librairie  dans  un fichier  separe et de transformer
l'ensemble de  tous ce  fichiers en une  seule  unite a l'aide  de  la
commande  "ar".  L'interet, par rapport au  fait d'avoir tout mis dans
un  seul et meme fichier est   de permettre a   "ld" de ne mettre dans
l'executable final que les fonctions qui sont reellement utiles.

Pour Ocaml la situtation  est differente et pas  aussi favorable.  Une
telle pratique se heurte a la gestion  des modules en Ocaml (un module
doit  etre  defini dans  un seul  fichier). Supposons que  je souhaite
reimplementer   le module  list.   Suivant    le  meme principe    que
precedement, je vais mettre une fonction par fichier:

------- list_lenght.ml ------------
let rec length_aux len = function
    [] -> len
  | a::l -> length_aux (len + 1) l

let f l = length_aux 0 l
-----------------------------------

------- list_tl.ml ----------------
let f = ...
-----------------------------------

etc... 

Je me retrouve donc avec un module par fonction.   Pour voir mes liste
comme une seule  et meme librairie, je suis  ammene a  creer le module
suivant:

module List = 
  struct
   let length = List_length.f
   and tl     = List_tl.f
   and ....	
  end

et a engendrer la libraire (ocamlopt -a  -o list.cmxa ...) qui enferme
tous   les fichiers.    Notons   au  passage que   je suis   incapable
d'interdire l'acces direct au fonctions List_lenght.f List_tl.f etc...
Cela peut etre problematique si la librairie  defini un type abstrait:
pour que chaque  fonction de la librairie  puisse acceder librement et
concretement au type je  suis ammene a le  rendre publique et je n'ais
aucun moyen de la cacher par la suite.

Sur ce principe, je me pose plusieurs questions.

 1)  Quels sont  les  benefices  que   je peut   attendre d'une  telle
pratique?

 2)  N'est-il pas envisageable  que   le compilateur (natif) fasse  ce
genre de travail pour moi, au vol ? (i.e. genere un fichier assembleur
par fonction  et me  retourne  un couple  de fichier x.cmx/x.a  plutot
qu'un couple de  fichier x.cmx/x.o).  Cela presenterait  l'avantage de
cacher les  modules  List_lenght  List_tl   etc.... et  de   permettre
d'appliquer  la technique  a des  modules  qui  definissent des  types
abstraits.




-- 

- Emmanuel Engel





^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Gestion des librairies
  1997-11-26 12:29 Gestion des librairies Emmanuel Engel
@ 1997-12-02 15:03 ` Xavier Leroy
  0 siblings, 0 replies; 2+ messages in thread
From: Xavier Leroy @ 1997-12-02 15:03 UTC (permalink / raw)
  To: Emmanuel Engel; +Cc: caml-list

>   Dans  un langage de  programmation  comme C,  lorsque  l'on souhaite
> ecrire  une librairie, une  bonne pratique est  de  mettre chacune des
> fonctions  de la librairie  dans  un fichier  separe et de transformer
> l'ensemble de  tous ce  fichiers en une  seule  unite a l'aide  de  la
> commande  "ar".  L'interet, par rapport au  fait d'avoir tout mis dans
> un  seul et meme fichier est   de permettre a   "ld" de ne mettre dans
> l'executable final que les fonctions qui sont reellement utiles.
> Pour Ocaml la situtation  est differente [...]

En fait, le linker OCaml fonctionne exactement comme le linker C:
lorsqu'on linke un fichier .cma regroupant A.cmo, B.cmo, etc,
il elimine les .cmo qui ne sont pas references dans le reste du
programme.  L'unite de linking est donc le fichier .cmo, tout comme en
C l'unite de linking est le fichier .o.

Ceci dit, meme en C, mettre une fonction par fichier .o est une
granularite trop faible.  Il est largement suffisant de mettre un .o
par groupe de fonctions logiquement reliees.  Vu la taille des disques
modernes, quelques kilo-octets de code mort ne font de mal a personne.

Autrement dit: le decoupage d'un programme en fichiers doit suivre sa
structure logique.  Il n'y a pas lieu de compliquer le decoupage pour
un hypothetique gain en taille du code.

>  1)  Quels sont  les  benefices  que   je peut   attendre d'une  telle
> pratique? [une fonction par fichier + un fichier reexportant le tout]

Aucune.  Le .cmo reexportant toutes les fonctions va etre lie des que
l'une de ses fonctions est referencee, entrainant tous les autres .cmo
avec lui.

>  2)  N'est-il pas envisageable  que   le compilateur (natif) fasse  ce
> genre de travail pour moi, au vol ? (i.e. genere un fichier assembleur
> par fonction  et me  retourne  un couple  de fichier x.cmx/x.a  plutot
> qu'un couple de  fichier x.cmx/x.o).

Cela couterait cher en temps de compilation: appels repetes de
l'assembleur, manipulations de nombreux petits fichiers.  Ceci pour un
benefice douteux.

- Xavier Leroy





^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~1997-12-02 16:40 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1997-11-26 12:29 Gestion des librairies Emmanuel Engel
1997-12-02 15:03 ` Xavier Leroy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox