Xavier Petit
2015-10-10 14:09:54 UTC
Bonjour,
Je m'appelle Xavier et je suis débutant autodidacte en Ada, c'est mon
premier message sur un groupe de discussion.
Je suis en train de développer une bibliothèque graphique
multiplateforme avec comme objectif de pouvoir faire du "dessin"
facilement, une application graphique minimale, voire une GUI.
Les trois idées directrices pour ce projet sont dans l'ordre :
simplicité, minimalisme, efficacité.
Multiplateforme signifie dans ce cas pouvoir fonctionner sur Linux,
Windows et Mac.
Seulement je me pose des questions sur l'organisation du code source et
si mes recherches internet m'ont aidé, je souhaiterais faire appel à vos
avis et expériences.
Actuellement la hiérarchie ressemble à ça :
- adada
- adada-linux (private)
- adada-window
- adada-window-draw
- adada-window-event
adada-linux est un paquetage privé qui est utilisé par les
implémentations de adada-window et de ses paquetages enfants.
Ainsi les spécifications de adada, adada-window, adada-window-draw et
adada-window-event sont identiques aux différentes plateformes et les
implémentations de adada-window, adada-window-draw et
adada-window-event diffèrent.
Si je m'autorisais à présenter des spécifications différentes d'une
plateforme à une autre au niveau de leur partie privée uniquement, je
pourrais supprimer le paquetage privé adada-linux (et ceux à venir).
Mais est-ce là une bonne pratique de programmation en Ada ? Écrire des
couples spécifications/corps différents pour chaque OS, avec seulement
la partie publique des spécifications commune..
En ayant structuré la bibliothèque adada en 3 paquetages enfants
(window, window-draw, window-event) et étant confronté au fait qu'ils
doivent faire appel aux mêmes données de l'API bas niveau des OS, il a
fallu rassembler et séparer ces données et sous-programmes, en
l'occurrence dans le paquetage privé linux.
J'aimerais aussi bien pouvoir me passer de gprbuild et des moyens
externes au langage de faire du développement multiplateforme (gprbuild
par exemple). J'en arrive à un bazar comme ça :
- adada
- linux
- linux-window
- linux-window-draw
- linux-window-event
adada.ads contient :
-- begin
with Linux;
package Adada renames Linux;
-- end
Mais le renommage peut aussi se faire au niveau du programme de
l'utilisateur, l'idée est qu'il n'y aurait ensuite qu'un ou deux mots à
changer dans les sources pour passer d'une plateforme à une autre (un
peu comme modifier un fichier gpr), bon ça ne reproduit pas le
comportement de l'appel d'un gprbuild qui détermine la plateforme.
L'ennui est entre autre qu'il y a visibilité sur les paquetages de
toutes les plateformes... Ça me semble contraire à la philosophie Ada.
J'aimerais bien des conseils, et savoir comment vous voyez les choses à
ce niveau là.
Si vous avez des questions concernant la bibliothèque elle-même, les
choix techniques, les API sous-jacentes, ce qu'elle ne permettra (pas)
de faire, n'hésitez pas à me les poser, ça me permettrait de remettre en
question certains choix assez drastiques que j'ai fait :
adada-window.ads ne contient que 10 lignes et va sans doute évoluer en
diminuant, il n'y a aucun appel de création/destruction de fenêtre, la
fenêtre ne se créée que lorsqu'on souhaite afficher du contenu (via
adada-window-draw) et sa destruction est automatique (via finalisation).
Le rafraîchissement et le tampon sont gérés en interne, on indique juste
où et de quelle couleur sont les pixels que l'on veut dessiner (le
dessin vectoriel, l'affichage de texte viendront ensuite).
adada-window-event.ads a une seule fonction (qui retourne le prochain
événement, à utiliser dans une "event loop").
Merci d'avance !
Je m'appelle Xavier et je suis débutant autodidacte en Ada, c'est mon
premier message sur un groupe de discussion.
Je suis en train de développer une bibliothèque graphique
multiplateforme avec comme objectif de pouvoir faire du "dessin"
facilement, une application graphique minimale, voire une GUI.
Les trois idées directrices pour ce projet sont dans l'ordre :
simplicité, minimalisme, efficacité.
Multiplateforme signifie dans ce cas pouvoir fonctionner sur Linux,
Windows et Mac.
Seulement je me pose des questions sur l'organisation du code source et
si mes recherches internet m'ont aidé, je souhaiterais faire appel à vos
avis et expériences.
Actuellement la hiérarchie ressemble à ça :
- adada
- adada-linux (private)
- adada-window
- adada-window-draw
- adada-window-event
adada-linux est un paquetage privé qui est utilisé par les
implémentations de adada-window et de ses paquetages enfants.
Ainsi les spécifications de adada, adada-window, adada-window-draw et
adada-window-event sont identiques aux différentes plateformes et les
implémentations de adada-window, adada-window-draw et
adada-window-event diffèrent.
Si je m'autorisais à présenter des spécifications différentes d'une
plateforme à une autre au niveau de leur partie privée uniquement, je
pourrais supprimer le paquetage privé adada-linux (et ceux à venir).
Mais est-ce là une bonne pratique de programmation en Ada ? Écrire des
couples spécifications/corps différents pour chaque OS, avec seulement
la partie publique des spécifications commune..
En ayant structuré la bibliothèque adada en 3 paquetages enfants
(window, window-draw, window-event) et étant confronté au fait qu'ils
doivent faire appel aux mêmes données de l'API bas niveau des OS, il a
fallu rassembler et séparer ces données et sous-programmes, en
l'occurrence dans le paquetage privé linux.
J'aimerais aussi bien pouvoir me passer de gprbuild et des moyens
externes au langage de faire du développement multiplateforme (gprbuild
par exemple). J'en arrive à un bazar comme ça :
- adada
- linux
- linux-window
- linux-window-draw
- linux-window-event
adada.ads contient :
-- begin
with Linux;
package Adada renames Linux;
-- end
Mais le renommage peut aussi se faire au niveau du programme de
l'utilisateur, l'idée est qu'il n'y aurait ensuite qu'un ou deux mots à
changer dans les sources pour passer d'une plateforme à une autre (un
peu comme modifier un fichier gpr), bon ça ne reproduit pas le
comportement de l'appel d'un gprbuild qui détermine la plateforme.
L'ennui est entre autre qu'il y a visibilité sur les paquetages de
toutes les plateformes... Ça me semble contraire à la philosophie Ada.
J'aimerais bien des conseils, et savoir comment vous voyez les choses à
ce niveau là.
Si vous avez des questions concernant la bibliothèque elle-même, les
choix techniques, les API sous-jacentes, ce qu'elle ne permettra (pas)
de faire, n'hésitez pas à me les poser, ça me permettrait de remettre en
question certains choix assez drastiques que j'ai fait :
adada-window.ads ne contient que 10 lignes et va sans doute évoluer en
diminuant, il n'y a aucun appel de création/destruction de fenêtre, la
fenêtre ne se créée que lorsqu'on souhaite afficher du contenu (via
adada-window-draw) et sa destruction est automatique (via finalisation).
Le rafraîchissement et le tampon sont gérés en interne, on indique juste
où et de quelle couleur sont les pixels que l'on veut dessiner (le
dessin vectoriel, l'affichage de texte viendront ensuite).
adada-window-event.ads a une seule fonction (qui retourne le prochain
événement, à utiliser dans une "event loop").
Merci d'avance !
--
Xavier Petit
Xavier Petit