OVH Cloud OVH Cloud

BPL: version C de la STL

28 réponses
Avatar
Marc Boyer
Bonjour à tous,

suite à des réflexions suscitées sur ce forum, j'ai réflechi
à une librairie inspirée de la STL qui offre en C des containers
génériques, efficaces et typés.

Le premier jet est disponible à l'URL:
http://www.enseeiht.fr/~boyer/BPL/
C'est un tout premier jet, mais je suis à la recherches d'avis,
de marques d'intérêt et de critiques avant de partir plus avant
dans les développements.

Merci d'avance de vos remarques,

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

10 réponses

1 2 3
Avatar
Bertrand Mollinier Toublet
Marc Boyer wrote:
Bonjour à tous,

suite à des réflexions suscitées sur ce forum, j'ai réflechi
à une librairie inspirée de la STL qui offre en C des containers
génériques, efficaces et typés.

Le premier jet est disponible à l'URL:
http://www.enseeiht.fr/~boyer/BPL/
C'est un tout premier jet, mais je suis à la recherches d'avis,
de marques d'intérêt et de critiques avant de partir plus avant
dans les développements.

Merci d'avance de vos remarques,

Perso, mon avis, je te l'ai deja donne, c'est que tu contactes Bjorn

Augestad (boa at metasystems dot no) ou Hallvard Furuseth (h.b.furuseth
at usit dot uio dot no), qui sont tous les deux responsables du projet
libclc (http://libclc.sourceforge.net), qui beneficierait grandement
d'une contribution telle que la tienne.

Maintenant, pour les remarques techniques, il faut d'abord que je jette
un coup d'oeil a ton code ;-)

--
Bertrand Mollinier Toublet
Currently looking for employment in the San Francisco Bay Area
http://bmt-online.dapleasurelounge.com/

Avatar
Marc Boyer
Bertrand Mollinier Toublet wrote:
Perso, mon avis, je te l'ai deja donne, c'est que tu contactes Bjorn
Augestad (boa at metasystems dot no) ou Hallvard Furuseth (h.b.furuseth
at usit dot uio dot no), qui sont tous les deux responsables du projet
libclc (http://libclc.sourceforge.net), qui beneficierait grandement
d'une contribution telle que la tienne.


J'ai noté l'URL, j'ai jeté un coup d'oeil.
J'ai pour le moment du mal avec le modèle de développement,
et entre autre le copyright (orienté GPL) dont je ne sais
pas si mon employeur sera très content.

Maintenant, pour les remarques techniques, il faut d'abord que je jette
un coup d'oeil a ton code ;-)


J'avoue que je suis surtout demandeur de remarque "utilisateur",
ie en tant que développeur, serais-tu intéressé par utiliser
cette librairie (si elle dépassait le stade du prototype).

Merci,
Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Bertrand Mollinier Toublet
Marc Boyer wrote:
Bertrand Mollinier Toublet wrote:

Perso, mon avis, je te l'ai deja donne, c'est que tu contactes Bjorn
Augestad (boa at metasystems dot no) ou Hallvard Furuseth (h.b.furuseth
at usit dot uio dot no), qui sont tous les deux responsables du projet
libclc (http://libclc.sourceforge.net), qui beneficierait grandement
d'une contribution telle que la tienne.



J'ai noté l'URL, j'ai jeté un coup d'oeil.
J'ai pour le moment du mal avec le modèle de développement,
et entre autre le copyright (orienté GPL) dont je ne sais
pas si mon employeur sera très content.

Problemes de copyright mis-a-part, qu'est ce qui te gene avec le modele

de developpement ? Si c'est le manque de contributeurs, il ne tient qu'a
toi de faire changer ca ;-)

Maintenant, pour les remarques techniques, il faut d'abord que je jette
un coup d'oeil a ton code ;-)



J'avoue que je suis surtout demandeur de remarque "utilisateur",
ie en tant que développeur, serais-tu intéressé par utiliser
cette librairie (si elle dépassait le stade du prototype).

Apres lecture de ta doc, et jeter un petit coup d'oeil aux contraintes,

je dirais non.

Desole, mais autant la solution technique adoptee m'est relativement
indifferente, autant l'interface que tu proposes, les contraintes pour
la compilation (sed ? option de gcc ? inclure sans inclure tout en
incluant ?) me refroidissent un petit peu.

Sans ressasser tout les debats autour du developpement d'un conteneur
generique, aujourd'hui, je ne suis pas pret a sacrifier la facilite de
compilation et d'ecriture pour avoir un type checking pris en charge par
le langage (plutot que ma responsabilite), et une eventuelle
optimisation du code.

--
Bertrand Mollinier Toublet
Currently looking for employment in the San Francisco Bay Area
http://bmt-online.dapleasurelounge.com/


Avatar
DINH Viêt Hoà

Sans ressasser tout les debats autour du developpement d'un conteneur
generique, aujourd'hui, je ne suis pas pret a sacrifier la facilite de
compilation et d'ecriture pour avoir un type checking pris en charge par
le langage (plutot que ma responsabilite), et une eventuelle
optimisation du code.


Le but n'est pas uniquement le "type-checking" il s'agit également d'avoir
un peu d'optimisation au niveau de l'utilisation mémoire du composant,
par exemple, lorsqu'on stocke un tableau d'entier, éviter d'avoir des
multiples petites allocations.

--
DINH V. Hoa,

"écrire 'dsl' au lieu de 'désolé', c'est pas un problème d'orthographe,
c'est un problème de capillarité palmaire" -- ed

Avatar
Marc Boyer
In article <bdsc1i$, Martinez Jerome wrote:
Marc Boyer wrote:
Au dernieres nouvelles, la licence de libclc n'a rien a voir avec GPL...
Mais alors rien puisque c'est une license BSD, qui ne t'oblige a pas
grand chose...
En quoi ca generai ton entreprise?


Je bosse dans la recherche publique, et on aime bien avoir
un "retour" en terme de notoriété ou financier.
Faut voir si j'arrive à le valoriser en interne ou pas.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Bertrand Mollinier Toublet
Marc Boyer wrote:
Bertrand Mollinier Toublet wrote:

Marc Boyer wrote:

Bertrand Mollinier Toublet wrote:


Problemes de copyright mis-a-part, qu'est ce qui te gene avec le modele
de developpement ? Si c'est le manque de contributeurs, il ne tient qu'a
toi de faire changer ca ;-)



Le fait de devoir faire valider toutes les orientations sur clc,
ça donne pas lieu à d'interminables discussions ?

Oui, comme disait Richard Heathfield sur c.l.c en reponse a une remarque

similaire de ma part (quoi, qui a dit "proselytisme" ?): le terme
colletif pour "programeur" est "conflits" :-)

Apres lecture de ta doc, et jeter un petit coup d'oeil aux contraintes,
je dirais non.

Desole, mais autant la solution technique adoptee m'est relativement
indifferente, autant l'interface que tu proposes, les contraintes pour
la compilation (sed ? option de gcc ? inclure sans inclure tout en
incluant ?) me refroidissent un petit peu.



C'est peut-être une erreur de présentation de ma part.
La solution "standart", c'est d'avoir un fichier qui recense
les instanciations courantes.
#ifdef VECTOR_INT
#include "VectorInt.h"
#else
#ifdef VECTOR_STRING
#include "VectorInt.h"
#endif
#endif

C'est rédibitoire à ton avis ?

En comparaison d'autres solutions, un petit peu, oui. Pour etre honnete,

je ne suis pas un grand fan du preprocesseur.

Sans ressasser tout les debats autour du developpement d'un conteneur
generique, aujourd'hui, je ne suis pas pret a sacrifier la facilite de
compilation et d'ecriture pour avoir un type checking pris en charge par
le langage (plutot que ma responsabilite), et une eventuelle
optimisation du code.



Ben, c'est bien le coeur du problème.
Y a-t-il une demande pour une telle solution ? Passer plusieurs
semaines à écrires quelques milliers de lignes de codes qui ne
seront jamais utilisée, cela ne me tente pas trop.

Note que mon opinion est a prendre avec une pincee de sel. Je suis tout

au plus un amateur interesse, pas du tout un professionel du langage,
et mon experience en developpement en C de niveau industriel est d'un an
seulement...

--
Bertrand Mollinier Toublet
"Reality exists" - Richard Heathfield, 1 July 2003



Avatar
Marc Boyer
Bertrand Mollinier Toublet wrote:
Le fait de devoir faire valider toutes les orientations sur clc,
ça donne pas lieu à d'interminables discussions ?

Oui, comme disait Richard Heathfield sur c.l.c en reponse a une remarque

similaire de ma part (quoi, qui a dit "proselytisme" ?): le terme
colletif pour "programeur" est "conflits" :-)


Et sur un sujet aussi polémique que la généricité à base de
macros, je n'ose imaginer.
Je crois que je préfère avancer un peu encore pour avoir
un truc qui marche (j'ai du mal a faire proprement les vecteurs
de vecteurs).

En comparaison d'autres solutions, un petit peu, oui. Pour etre honnete,
je ne suis pas un grand fan du preprocesseur.


Je suis pas non plus grand fan du preprocesseur. Mais j'aime
encore moins void*...

Ben, c'est bien le coeur du problème.
Y a-t-il une demande pour une telle solution ? Passer plusieurs
semaines à écrires quelques milliers de lignes de codes qui ne
seront jamais utilisée, cela ne me tente pas trop.

Note que mon opinion est a prendre avec une pincee de sel. Je suis tout

au plus un amateur interesse, pas du tout un professionel du langage,
et mon experience en developpement en C de niveau industriel est d'un an
seulement...


Oui, mais il y a pas cohue de réponses de professionels du
langage autour de ma proposition pour le moment.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
AG
As tu vu :
http://groups.google.com/groups?hl=fr&lr=&ie=UTF-8&threadm:B5D0AD.6EB15E9E%40cern.ch&rnum=5&prev=/groups%3Fq%3DPOO%2Bfr.comp.lang.c%26hl%3Dfr%26lr%3D%26ie%3DUTF-8%26selm%3D3AB5D0AD.6EB15E9E%2540cern.ch%26rnum%3D5

et le lien cité : http://home.cern.ch/ldeniau/html/oopc/oopc.html

?
Avatar
Marc Boyer
EpSyLOn wrote:
On 30 Jun 2003 13:05:27 GMT, Marc Boyer
wrote:

Apres avoir jeté une rapide coup d'oeil, il apparait certaines choses
qui peuvent etre genantes :
"Notice that, from the BPL point of view, a constructor should never
fail. "


En effet, je réalise que la notion d'objet est difficilement
séparable de la notion d'exception (toute contradiction étant
la bienvenue) à cause de la possibilité d'échec de la construction.

Je devrais le préciser dans la doc. Quand je dis que le
constructeur ne peut pas échouer, c'est que si malloc retourne
NULL par exemple, ce n'est pas un échec au sens objet.
Si je déclare un objet "chaine de caractère" dont la
représentation est un char*. Une fois initialisé, soit
il pointe sur une mémoire allouée, soit il vaut NULL, les
deux valeurs étant considérées comme "valide" par le
conteneur (ce qui est invalide, c'est pointer sur
n'importe quoi d'autre).

ou encore dans VectorString.h
--
#include <string.h>
[...]
#define COPY_TYPE(X,Y) (free(X),(X)=strdup(Y))
--
Si l'on passe que strdup n'est pas standard, elle peut en outre
echouer.


Le fait que ce soit pas standard est un compromis (c'est un
prototype pour le moment) entre temps de développement et
compréhension.
Sinon, je dis que, du point de vue du conteneur, strdup
n'échoue pas: NULL est une valeur valide pour une chaine
de caractère. Les macros de copie, affichage and co doivent
pouvoir manipuler cette valeur.

Bien sur, tu préconises dans la doc l'utilisation des exceptions
(d'ailleurs je suis sur que tu ne manqueras pas de remplacer bientot
ce strdup par une fonction de ta fabrication).


Disons que mon questionnement est: les exceptions sont elles
un mécanisme trop complexe ou non ? Mon travail vient de la
découverte que de nombreuses boites re-codent à coup de macros
les listes, files and co. Ma proposition est d'avancer un cran
dans l'écriture. Mais j'ai peur qu'en mettant l'utilisation des
exceptions comme une condition de l'utilisation de la BPL,
cela ne rebutte nombre de programmeurs, qui resteront à leur
version à base de (void*).

Par ailleurs, en
regardant un peu l'interface, je vois que tu proposes malgré tout une
gestion d'erreur, mais pas sous forme d'exceptions, sous forme de
valeurs de retour simples.


Comment traiter les erreurs ? Il me semble que les idiomes
du C sont basés sur les valeurs de retour.
if ( var= foo() && bar(var) ){...}

Donc je suppose que c'est par facilité que tu as choisi de ne pas
traiter les erreur d'echec de construction :


Facilité oui, pour commencer.
Mais aussi une question plus générale. Si je pensais que
l'approche globale de la POO était la bonne, je me contenterais
de faire de la pub pour l'OOPC de L. Deniau sur ma page Web.

bool INST(initWithSize)(Vector* item, size_t size){
item->start= malloc( size * sizeof(Type));
if ( item->start ) {
size_t i;
item->size = item->reserved = size;
for(i = 0; i < size ; ++i ){
INIT_TYPE(item->start[i]);
}
typeInvariant(*item);
return true;
} else {
item->size = item->reserved = 0;
typeInvariant(*item);
return false;
}
}

Une gestion d'erreur eut été simple a mettre en place il me semble.
Pour gérer ca, je pense qu'il faudrait rajouter une macro permettant
de savoir si telle operation a échoué, par exemple pour des strings :
#define COPY_TYPE(X,Y) (free(X),(X)=strdup(Y))
#define COPY_HAS_FAILED(X) ((X)==NULL)


Oui, OK, et en cas d'échec, je redétruis tout le vecteur
et je retourne false.
Et pour les programmeurs optimistes, la valeur par défaut
de COPY_HAS_FAILED(X) serait false.

Bon, en y ayant refléchi 5 minutes c'est ce que je ferais (il y a
peut-être des choses à revoir/améliorer dans ma solution).


Mouaip, je vais rajouter ça dans la "TO DO list".

Cela dit, il serait peut etre interessant que ta librairie propose
comme tu le suggere dans la doc un gestion des exceptions complete, et
qui soit utilisable pour les types gérés l'utilisateur :
En effet, si par exemple la fonction de copie devait lever une
exception, tu pourrais definir un exception standard (genre
CopyFailureException), qui serait attrapée et gérée pour libérer
eventuellement les ressources puis re-levée pour l'utilisateur.
(Mais bon je vais pas t'apprendre la POO non plus, tu est très
certainement bien plus savant que moi dans ce domaine, après tout je
ne suis qu'un "Padawan").


Disons que c'est vraiment une question de conception que je me pose.
Je ne désire pas re-coder C++. Si on veut faire du C++, il existe
des compilateurs, et pour cveux qui se plaignent de ne pas
avoir de compilateur C++ sur leur plateforme, il paraît qu'il
existe des traducteurs C++ -> C, donc, le problème est clot.

Suite a plusieurs threads sur la généricité et les types sur fclc,
j'avais moi aussi décidé d'écrire une bibliotheque de structures de
données génériques (et plein d'autres choses utiles, une sorte de
compilation de plein de choses utiles et que l'on peut ecrire en C
portable) et cette vision la (utiliser des macros pour utiliser le
typage "fort" du C) me plait bien. Cela dit, j'ai structuré ma
bibliotheque de maniere différente de ta BPL, plutot comme Java, avec
des "interfaces", qui pourront etre implémentees de maniere différente
par des structures de plus bas niveau, mais le tout sans besoin
d'exceptions (j'ai choisi mon camp camarade ;-)). J'ai deja établi une
partie de l'interface des types proposés pour la premiere version,
j'ai aussi ma gestion d'erreurs et mes conventions de nommage (ca m'a
pris un petit bout de temps deja). Il se pourrait cependant que je
reprenne une partie des astuces de ta technique de compilation s'il
s'avere que c'est ce que je recherche (j'espere que tu ne m'en voudras
pas trop :)). Si j'arrive à la finir un jour (pour l'instant je doit
en être a 15% de la premiere version release que je souhaiterais), je
l'utiliserais sans doute pour mon prochain "gros projet" (une
modification de jeu, mais je suis meme pas encore sur de la faire). Je
le fais aussi pour essayer de voir un peu ce que je vaut en C. En tout
cas si je mene ca a bien je manquerais pas de le faire partager comme
tu l'a fait avec ta BPL.


Ben, je serais curieux de voir ça alors.

Donc mon impression finale, c'est que c'est du bon taf a priori que
cette BPL, meme s'il y a encore pas mal d'améliorations a apporter je
pense. Sur ce, je retourne finir de lire la doc et fouiner le code...


OK, merci beaucoup de tes remarques.

Marc BOyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Bertrand Mollinier Toublet
Emmanuel Delahaye wrote:
In 'fr.comp.lang.c', Marc Boyer wrote:


Je m'adresse plus à des gens qui font du C procédural
"classique", qui manipulent déjà des listes à coup de
macros qui castent tout en void*.



void* est indispensabple pour faire de la programmation générique. Même
l'idiome:

typedef struct obj obj_s;

<...>

obj_s *p_obj;

definit en fait un

void *p_obj;

sans le dire. Ca fait partie du langage.

La, il va falloir que tu clarifies, parce que j'ai pas suivi.



--
Bertrand Mollinier Toublet
"Reality exists" - Richard Heathfield, 1 July 2003


1 2 3