kanze wrote on 20/07/2006 11:55:
je n'essaierais jamais de passer le moindre template entre 2 codes
distincts, c'est perdre son temps et finalement inefficace (par
comparaison à 2 méthodes foo(char*) et foo(wchar_t*) plus pereines par
exemple).
kanze wrote on 20/07/2006 11:55:
je n'essaierais jamais de passer le moindre template entre 2 codes
distincts, c'est perdre son temps et finalement inefficace (par
comparaison à 2 méthodes foo(char*) et foo(wchar_t*) plus pereines par
exemple).
kanze wrote on 20/07/2006 11:55:
je n'essaierais jamais de passer le moindre template entre 2 codes
distincts, c'est perdre son temps et finalement inefficace (par
comparaison à 2 méthodes foo(char*) et foo(wchar_t*) plus pereines par
exemple).
Déjà, là, on passe par des pointeurs, donc risque de corruption mémoire.
Déjà, là, on passe par des pointeurs, donc risque de corruption mémoire.
Déjà, là, on passe par des pointeurs, donc risque de corruption mémoire.
Je ne suis pas sûr de comprendre. Sous Unix, et sous les Windows
classiques pré-.NET, il n'y a pas de bibliothèques dynamiques ;
malgré leur nom, une DLL se comporte comme un fichier objet en
partie pré-linké.
Par focément. On peut se lier statiquement avec une DLL, par
l'intermédiaire par exemple d'un .lib d'import, mais on peut
aussi s'y lier dynamiquement (avec des fonction LoadLibrary,
GetProcAdress...).
Et il faut bien quelque chose du genre d'un
éditeur de liens pour les construire. (Sous Unix, c'est bien
l'éditeur de liens classique, ld, qui le fait. J'ai l'impression
que c'est aussi ce qui se passe quand je donne l'option /LD à
cl : il invoque link avec l'option /DLL.)
Ou est-ce que .NET fonctionne un peu comme Java, où les
fichiers .jar sont réelement des bibliothèques, et que les
composants en sont réelement extraits et linkés lors de
l'exécution, sans jamais avoir été linkés entre eux avant ?
(C'est un des grands défauts de Java, qui fait qu'on ne peut
pas s'en servir dans certaines applications, où la sécurité
ou la fiabilité sont des critères importants.)
Je ne connais pas vraiment Java, aussi il y a des chances que
je réponde à côté.
Les DLL externes sont utilisée à l'exécution, bien évidemment,
mais aussi à la compilation, où elles ont pour seul(*) but de
permettre par de l'introspection de publier leur contenu,
remplaçant ainsi les .h.
Et il est aussi possible de se lier avec des DLL.NET dont on
ne connait rien a priori, puisqu'on peut en obtenir tout un
tas d'information au run-time (genre : Bon, donne moi toutes
les classes qui implémententtelle interface et on un
constructeur sans paramètre, puis contruit moi une instance de
celles-ci).
Le problème est que les modules (les DLL) définissent la
granularité de base des certains points du framework, comme le
partage de code, un certain aspect de visibilité,... Ce qui
incite presque dans certains cas à avoir un module par classe.
Et là, ça fait beaucoup de DLL...
Donc, il n'y a pas un module par fichier ou par classe
obligatoirement, mais les modules on tendance à être assez
petits si on veut faire du code réutilisable, et il manque un
outil permettant de packager plusieurs modules en un seul,
afin d'éviter les problèmes d'installation.
Je ne suis pas sûr de comprendre. Sous Unix, et sous les Windows
classiques pré-.NET, il n'y a pas de bibliothèques dynamiques ;
malgré leur nom, une DLL se comporte comme un fichier objet en
partie pré-linké.
Par focément. On peut se lier statiquement avec une DLL, par
l'intermédiaire par exemple d'un .lib d'import, mais on peut
aussi s'y lier dynamiquement (avec des fonction LoadLibrary,
GetProcAdress...).
Et il faut bien quelque chose du genre d'un
éditeur de liens pour les construire. (Sous Unix, c'est bien
l'éditeur de liens classique, ld, qui le fait. J'ai l'impression
que c'est aussi ce qui se passe quand je donne l'option /LD à
cl : il invoque link avec l'option /DLL.)
Ou est-ce que .NET fonctionne un peu comme Java, où les
fichiers .jar sont réelement des bibliothèques, et que les
composants en sont réelement extraits et linkés lors de
l'exécution, sans jamais avoir été linkés entre eux avant ?
(C'est un des grands défauts de Java, qui fait qu'on ne peut
pas s'en servir dans certaines applications, où la sécurité
ou la fiabilité sont des critères importants.)
Je ne connais pas vraiment Java, aussi il y a des chances que
je réponde à côté.
Les DLL externes sont utilisée à l'exécution, bien évidemment,
mais aussi à la compilation, où elles ont pour seul(*) but de
permettre par de l'introspection de publier leur contenu,
remplaçant ainsi les .h.
Et il est aussi possible de se lier avec des DLL.NET dont on
ne connait rien a priori, puisqu'on peut en obtenir tout un
tas d'information au run-time (genre : Bon, donne moi toutes
les classes qui implémententtelle interface et on un
constructeur sans paramètre, puis contruit moi une instance de
celles-ci).
Le problème est que les modules (les DLL) définissent la
granularité de base des certains points du framework, comme le
partage de code, un certain aspect de visibilité,... Ce qui
incite presque dans certains cas à avoir un module par classe.
Et là, ça fait beaucoup de DLL...
Donc, il n'y a pas un module par fichier ou par classe
obligatoirement, mais les modules on tendance à être assez
petits si on veut faire du code réutilisable, et il manque un
outil permettant de packager plusieurs modules en un seul,
afin d'éviter les problèmes d'installation.
Je ne suis pas sûr de comprendre. Sous Unix, et sous les Windows
classiques pré-.NET, il n'y a pas de bibliothèques dynamiques ;
malgré leur nom, une DLL se comporte comme un fichier objet en
partie pré-linké.
Par focément. On peut se lier statiquement avec une DLL, par
l'intermédiaire par exemple d'un .lib d'import, mais on peut
aussi s'y lier dynamiquement (avec des fonction LoadLibrary,
GetProcAdress...).
Et il faut bien quelque chose du genre d'un
éditeur de liens pour les construire. (Sous Unix, c'est bien
l'éditeur de liens classique, ld, qui le fait. J'ai l'impression
que c'est aussi ce qui se passe quand je donne l'option /LD à
cl : il invoque link avec l'option /DLL.)
Ou est-ce que .NET fonctionne un peu comme Java, où les
fichiers .jar sont réelement des bibliothèques, et que les
composants en sont réelement extraits et linkés lors de
l'exécution, sans jamais avoir été linkés entre eux avant ?
(C'est un des grands défauts de Java, qui fait qu'on ne peut
pas s'en servir dans certaines applications, où la sécurité
ou la fiabilité sont des critères importants.)
Je ne connais pas vraiment Java, aussi il y a des chances que
je réponde à côté.
Les DLL externes sont utilisée à l'exécution, bien évidemment,
mais aussi à la compilation, où elles ont pour seul(*) but de
permettre par de l'introspection de publier leur contenu,
remplaçant ainsi les .h.
Et il est aussi possible de se lier avec des DLL.NET dont on
ne connait rien a priori, puisqu'on peut en obtenir tout un
tas d'information au run-time (genre : Bon, donne moi toutes
les classes qui implémententtelle interface et on un
constructeur sans paramètre, puis contruit moi une instance de
celles-ci).
Le problème est que les modules (les DLL) définissent la
granularité de base des certains points du framework, comme le
partage de code, un certain aspect de visibilité,... Ce qui
incite presque dans certains cas à avoir un module par classe.
Et là, ça fait beaucoup de DLL...
Donc, il n'y a pas un module par fichier ou par classe
obligatoirement, mais les modules on tendance à être assez
petits si on veut faire du code réutilisable, et il manque un
outil permettant de packager plusieurs modules en un seul,
afin d'éviter les problèmes d'installation.
Loïc Joly wrote on 20/07/2006 21:38:Je ne suis pas sûr de comprendre. Sous Unix, et sous les
Windows classiques pré-.NET, il n'y a pas de bibliothèques
dynamiques ; malgré leur nom, une DLL se comporte comme un
fichier objet en partie pré-linké.
Par focément. On peut se lier statiquement avec une DLL, par
l'intermédiaire par exemple d'un .lib d'import, mais on peut
aussi s'y lier dynamiquement (avec des fonction LoadLibrary,
GetProcAdress...).
statique ou dynamique peut être trompeur;
comme vous en parlez, il s'agit dans les 2 cas d'un même
fichier (.dll), distinct de l'appli et construit d'une seule
façon. il peut être "dynamiquement" remplacé (s'il est buggé
ou incomplet) du moment qu'il respecte la même table d'export.
une "librairie statique" au sens M$ (un fichier ".lib
d'implémentation") est un simple pool de .obj pré-linkés.
la différence est simplement qu'une DLL liée statiquement (par
import de son ".lib d'export") est montée d'autorité par le
code de démarrage de l'appli - qui plante donc avec une alerte
système si la DLL est absente ou invalide - alors que monter
dynamiquement une DLL permet de le faire à la demande et avec
une gestion plus souple des cas d'erreurs (absente, trop
vieille, etc).
Et il faut bien quelque chose du genre d'un éditeur de
liens pour les construire. (Sous Unix, c'est bien l'éditeur
de liens classique, ld, qui le fait. J'ai l'impression que
c'est aussi ce qui se passe quand je donne l'option /LD à
cl : il invoque link avec l'option /DLL.)
dans le cas d'un DLL statique, un .lib (table d'export) est
contruit avec la librairie et pris en entrée du linker de
l'appli; on peut alors avoir accès à des classes ou des
méthodes "C statiques" exportées.
pour une DLL dynamique, on se paluche le travail à la main
pour récupérer des pointeurs de fonctions - sauf erreur, on ne
peut importer de la lib la définition d'une classe;
on peut par contre mettre le code de la classe de base dans
l'appli (le dupliquer!)
et utiliser une factory statique pour obtenir de la lib. une
instance concrête de type inconnu (connu de la lib seule).Ou est-ce que .NET fonctionne un peu comme Java, où les
fichiers .jar sont réelement des bibliothèques, et que les
composants en sont réelement extraits et linkés lors de
l'exécution, sans jamais avoir été linkés entre eux avant ?
(C'est un des grands défauts de Java, qui fait qu'on ne
peut pas s'en servir dans certaines applications, où la
sécurité ou la fiabilité sont des critères importants.)
non Java repose sur un class loader pour charger depuis un
.class ou un .jar le code d'une classe connue au moment où le
client a été compilé.
java-beans a ajouté la réflectivité pour permettre de charger
des choses inconnues et les utiliser ensuite (de manière
tordue et dispendieuse).
le class loader peut être supplanté si des besoins
sécuritaires impose le chargement des classes depuis une
source sure; le chargement à l'aveugle du premier fichier
ayant le bon nom existe pareillement en C++ (sous linux comme
Wintel).
Les DLL externes sont utilisée à l'exécution, bien
évidemment, mais aussi à la compilation, où elles ont pour
seul(*) but de permettre par de l'introspection de publier
leur contenu, remplaçant ainsi les .h.
dans le cas de .NETDonc, il n'y a pas un module par fichier ou par classe
obligatoirement, mais les modules on tendance à être assez
petits si on veut faire du code réutilisable, et il manque
un outil permettant de packager plusieurs modules en un
seul, afin d'éviter les problèmes d'installation.
je dirais les problèmes de pollution (création d'une plétore
de fichiers sur la machine de l'utilisateur final) plus que
d'installation stricte (si on peut installer 1 DLL, on peut en
installer N);
le découpage permet également de patcher à moindre frais de
transfert (une petite DLL de qlq centaines de Ko plutôt qu'une
assemblie de plusieurs mégas).
Loïc Joly wrote on 20/07/2006 21:38:
Je ne suis pas sûr de comprendre. Sous Unix, et sous les
Windows classiques pré-.NET, il n'y a pas de bibliothèques
dynamiques ; malgré leur nom, une DLL se comporte comme un
fichier objet en partie pré-linké.
Par focément. On peut se lier statiquement avec une DLL, par
l'intermédiaire par exemple d'un .lib d'import, mais on peut
aussi s'y lier dynamiquement (avec des fonction LoadLibrary,
GetProcAdress...).
statique ou dynamique peut être trompeur;
comme vous en parlez, il s'agit dans les 2 cas d'un même
fichier (.dll), distinct de l'appli et construit d'une seule
façon. il peut être "dynamiquement" remplacé (s'il est buggé
ou incomplet) du moment qu'il respecte la même table d'export.
une "librairie statique" au sens M$ (un fichier ".lib
d'implémentation") est un simple pool de .obj pré-linkés.
la différence est simplement qu'une DLL liée statiquement (par
import de son ".lib d'export") est montée d'autorité par le
code de démarrage de l'appli - qui plante donc avec une alerte
système si la DLL est absente ou invalide - alors que monter
dynamiquement une DLL permet de le faire à la demande et avec
une gestion plus souple des cas d'erreurs (absente, trop
vieille, etc).
Et il faut bien quelque chose du genre d'un éditeur de
liens pour les construire. (Sous Unix, c'est bien l'éditeur
de liens classique, ld, qui le fait. J'ai l'impression que
c'est aussi ce qui se passe quand je donne l'option /LD à
cl : il invoque link avec l'option /DLL.)
dans le cas d'un DLL statique, un .lib (table d'export) est
contruit avec la librairie et pris en entrée du linker de
l'appli; on peut alors avoir accès à des classes ou des
méthodes "C statiques" exportées.
pour une DLL dynamique, on se paluche le travail à la main
pour récupérer des pointeurs de fonctions - sauf erreur, on ne
peut importer de la lib la définition d'une classe;
on peut par contre mettre le code de la classe de base dans
l'appli (le dupliquer!)
et utiliser une factory statique pour obtenir de la lib. une
instance concrête de type inconnu (connu de la lib seule).
Ou est-ce que .NET fonctionne un peu comme Java, où les
fichiers .jar sont réelement des bibliothèques, et que les
composants en sont réelement extraits et linkés lors de
l'exécution, sans jamais avoir été linkés entre eux avant ?
(C'est un des grands défauts de Java, qui fait qu'on ne
peut pas s'en servir dans certaines applications, où la
sécurité ou la fiabilité sont des critères importants.)
non Java repose sur un class loader pour charger depuis un
.class ou un .jar le code d'une classe connue au moment où le
client a été compilé.
java-beans a ajouté la réflectivité pour permettre de charger
des choses inconnues et les utiliser ensuite (de manière
tordue et dispendieuse).
le class loader peut être supplanté si des besoins
sécuritaires impose le chargement des classes depuis une
source sure; le chargement à l'aveugle du premier fichier
ayant le bon nom existe pareillement en C++ (sous linux comme
Wintel).
Les DLL externes sont utilisée à l'exécution, bien
évidemment, mais aussi à la compilation, où elles ont pour
seul(*) but de permettre par de l'introspection de publier
leur contenu, remplaçant ainsi les .h.
dans le cas de .NET
Donc, il n'y a pas un module par fichier ou par classe
obligatoirement, mais les modules on tendance à être assez
petits si on veut faire du code réutilisable, et il manque
un outil permettant de packager plusieurs modules en un
seul, afin d'éviter les problèmes d'installation.
je dirais les problèmes de pollution (création d'une plétore
de fichiers sur la machine de l'utilisateur final) plus que
d'installation stricte (si on peut installer 1 DLL, on peut en
installer N);
le découpage permet également de patcher à moindre frais de
transfert (une petite DLL de qlq centaines de Ko plutôt qu'une
assemblie de plusieurs mégas).
Loïc Joly wrote on 20/07/2006 21:38:Je ne suis pas sûr de comprendre. Sous Unix, et sous les
Windows classiques pré-.NET, il n'y a pas de bibliothèques
dynamiques ; malgré leur nom, une DLL se comporte comme un
fichier objet en partie pré-linké.
Par focément. On peut se lier statiquement avec une DLL, par
l'intermédiaire par exemple d'un .lib d'import, mais on peut
aussi s'y lier dynamiquement (avec des fonction LoadLibrary,
GetProcAdress...).
statique ou dynamique peut être trompeur;
comme vous en parlez, il s'agit dans les 2 cas d'un même
fichier (.dll), distinct de l'appli et construit d'une seule
façon. il peut être "dynamiquement" remplacé (s'il est buggé
ou incomplet) du moment qu'il respecte la même table d'export.
une "librairie statique" au sens M$ (un fichier ".lib
d'implémentation") est un simple pool de .obj pré-linkés.
la différence est simplement qu'une DLL liée statiquement (par
import de son ".lib d'export") est montée d'autorité par le
code de démarrage de l'appli - qui plante donc avec une alerte
système si la DLL est absente ou invalide - alors que monter
dynamiquement une DLL permet de le faire à la demande et avec
une gestion plus souple des cas d'erreurs (absente, trop
vieille, etc).
Et il faut bien quelque chose du genre d'un éditeur de
liens pour les construire. (Sous Unix, c'est bien l'éditeur
de liens classique, ld, qui le fait. J'ai l'impression que
c'est aussi ce qui se passe quand je donne l'option /LD à
cl : il invoque link avec l'option /DLL.)
dans le cas d'un DLL statique, un .lib (table d'export) est
contruit avec la librairie et pris en entrée du linker de
l'appli; on peut alors avoir accès à des classes ou des
méthodes "C statiques" exportées.
pour une DLL dynamique, on se paluche le travail à la main
pour récupérer des pointeurs de fonctions - sauf erreur, on ne
peut importer de la lib la définition d'une classe;
on peut par contre mettre le code de la classe de base dans
l'appli (le dupliquer!)
et utiliser une factory statique pour obtenir de la lib. une
instance concrête de type inconnu (connu de la lib seule).Ou est-ce que .NET fonctionne un peu comme Java, où les
fichiers .jar sont réelement des bibliothèques, et que les
composants en sont réelement extraits et linkés lors de
l'exécution, sans jamais avoir été linkés entre eux avant ?
(C'est un des grands défauts de Java, qui fait qu'on ne
peut pas s'en servir dans certaines applications, où la
sécurité ou la fiabilité sont des critères importants.)
non Java repose sur un class loader pour charger depuis un
.class ou un .jar le code d'une classe connue au moment où le
client a été compilé.
java-beans a ajouté la réflectivité pour permettre de charger
des choses inconnues et les utiliser ensuite (de manière
tordue et dispendieuse).
le class loader peut être supplanté si des besoins
sécuritaires impose le chargement des classes depuis une
source sure; le chargement à l'aveugle du premier fichier
ayant le bon nom existe pareillement en C++ (sous linux comme
Wintel).
Les DLL externes sont utilisée à l'exécution, bien
évidemment, mais aussi à la compilation, où elles ont pour
seul(*) but de permettre par de l'introspection de publier
leur contenu, remplaçant ainsi les .h.
dans le cas de .NETDonc, il n'y a pas un module par fichier ou par classe
obligatoirement, mais les modules on tendance à être assez
petits si on veut faire du code réutilisable, et il manque
un outil permettant de packager plusieurs modules en un
seul, afin d'éviter les problèmes d'installation.
je dirais les problèmes de pollution (création d'une plétore
de fichiers sur la machine de l'utilisateur final) plus que
d'installation stricte (si on peut installer 1 DLL, on peut en
installer N);
le découpage permet également de patcher à moindre frais de
transfert (une petite DLL de qlq centaines de Ko plutôt qu'une
assemblie de plusieurs mégas).
je n'essaierais jamais de passer le moindre template entre 2
codes distincts, c'est perdre son temps et finalement
inefficace (par comparaison à 2 méthodes foo(char*) et
foo(wchar_t*) plus pereines par exemple).
Déjà, là, on passe par des pointeurs, donc risque de
corruption mémoire. Rien ne t'empêche de fournir une
interface foo (std::string ) et foo(std::wstring). Il faut
juste savoir que ton client devra utiliser le même compilateur
avec les mêmes options.
je n'essaierais jamais de passer le moindre template entre 2
codes distincts, c'est perdre son temps et finalement
inefficace (par comparaison à 2 méthodes foo(char*) et
foo(wchar_t*) plus pereines par exemple).
Déjà, là, on passe par des pointeurs, donc risque de
corruption mémoire. Rien ne t'empêche de fournir une
interface foo (std::string ) et foo(std::wstring). Il faut
juste savoir que ton client devra utiliser le même compilateur
avec les mêmes options.
je n'essaierais jamais de passer le moindre template entre 2
codes distincts, c'est perdre son temps et finalement
inefficace (par comparaison à 2 méthodes foo(char*) et
foo(wchar_t*) plus pereines par exemple).
Déjà, là, on passe par des pointeurs, donc risque de
corruption mémoire. Rien ne t'empêche de fournir une
interface foo (std::string ) et foo(std::wstring). Il faut
juste savoir que ton client devra utiliser le même compilateur
avec les mêmes options.