FAQ

Un article de SmartEiffelWiki, l'encyclopéde libre.


Foire aux questions

Sommaire

Questions d'ordre général à propos du projet SmartEiffel

Existe il une liste de diffusion pour les utilisateurs de SmartEiffel ?

Oui bien sûr ! Les utilisateurs et les développeurs de SmartEiffel peuvent partager leur expérience ainsi que leurs idées en s'abonnant à la liste de diffusion de SmartEiffel (http://SmartEiffel.loria.fr/support/mailing-list.html).

Attention, cette liste n'est absolument pas censurée. Nous vous prions de rester polis et corrects les uns avec les autres. Merci.

Les codes source de SmartEiffel sont ils disponibles ?

Depuis que SmartEiffel est le compilateur Eiffel GNU, l'ensemble des codes source fait partie de la distribution. En plus du code des outils de compilation, de nombreuses bibliothèques d'intérêt général font également partie de la distribution. Voir aussi cette question FAQ relative aux différentes licences utilisées.

Est-il possible d'utiliser SmartEiffel pour de gros programmes/des applications commerciales ?

Il est en effet possible d'utiliser SmartEiffel pour de gros programmes. Un compilateur Eiffel est vraiment un gros projet et SmartEiffel lui-même est entièrement écrit en Eiffel. SmartEiffel est entièrement libre et toute entreprise privée peut l'utiliser librement, et distribuer (ou vendre) librement les produits fabriqués avec SmartEiffel. Elles n'ont pas besoin de payer de royalties.

Notez également que seules les classes qui sont en étroite relation avec le compilateur lui-même sont sous GPL (actuellement, seules les classes du répertoire SmartEiffel/tools sont sous GPL). Les autres classes ne sont pas sous GPL pour laisser entière liberté aux utilisateurs (c'est-à-dire toutes les classes de SmartEiffel/lib).

Gardez toujours à l'esprit que SmartEiffel ne propose aucune garantie (lisez le fichier COPYING fourni dans la distribution). Comme expliqué dans l'en-tête des fichiers qui ne sont pas sous GPL, la seule chose importante est de laissé l'en-tête sans l'altérer lorsque le fichier source correspondant est distribué avec votre produit. Pour un support étendu, les dons comme le consulting (voir ici (http://SmartEiffel.loria.fr/support/support.html)) sont les bienvenus.

Qu'est SmallEiffel par rapport à SmartEiffel ?

SmallEiffel est l'ancien nom du projet SmartEiffel. Nous avons changé de nom parce que nous pensions que le compilateur était devenu suffisamment intelligent ;)

Vous pouvez trouver une list des changements entre la dernière version de SmallEiffel et la première de SmartEiffel ici (http://SmartEiffel.loria.fr/misc/HISTORY.html#1.0).

Comment puis-je aider ?

Le meilleur moyen d'aider SmartEiffel et ses utilisateurs est probablement de prendre un domaine qui vous intéresse et de développer avec SmartEiffel votre propre librairie, programme, outil, extension, etc., et de le/la fournir aux autres utilisateurs.

Pour éviter de dupliquer les efforts, vous pouvez jeter un oeil à ce que les autres gens sont déjà en train de faire autour de SmartEiffel (http://SmartEiffel.loria.fr/general/repository.html) et de les aider si quelque chose qui vous intéresse est déjà en train d'être fait. Il y a actuellement beaucoup de bonnes choses de faites, et pour certaines, nous n'étions même pas au courant lorsqu'elles étaient en développement ! :)

Vous pouvez aussi aller voir nos plans futurs (http://SmartEiffel.loria.fr/papers/future.html) et jeter un oeil à la base de données des bogues (accès via la page des rapports de bogues).

Au final, vous pouvez considérer commencer le développement d'une fonctionnalité particulière que vous souhaitez avoir.

Un autre très bon moyen de nous aider est de suivre la ligne de conduite des rapports de bogues lorsque vous trouvez un problème avec SmartEiffel

Pourquoi ne pas changer ceci et ajouter cela ?! Ce serait bien mieux/plus cool/etc... !

Les gens doivent comprendre que nous ne pouvons pas toujours tout faire. Nous ne pouvons tout simplement pas, parce que nous n'en avons pas le temps. Que cela nous plaise ou non, nous avons aussi d'autres choses à faire que de fournir du matériel libre, de modifier notre compilateur et/ou nos librairies pour plaire à tout le monde. Nous faisons tout ce que nous pouvons, mais nous ne faisons pas de miracles, désolé.

Depuis que SmartEiffel est gratuit et open-source, les gens qui ont besoin de choses que nous ne fournissons pas peuvent toujours les implanter et en faire bénéficier tout le monde. Un bon moyen de faire ça est de commencer à travailler dessus et de demander à d'autres personnes (c'est-à-dire pas à l'équipe SmartEiffel ;) ) de se joindre à vous et de vous aider. Voir la question Comment puis-je aider ?.

Alternativement, une entreprise ou quelqu'un qui aurait besoin de nous pour implanter quelque chose peut toujours considérer de financer un peu le développement de SmartEiffel... Après tout, nous avons même entendu que certaines personnes vendaient du logiciel et faisaient un peu d'argent avec... ;)))

Comment puis-je rester informé à propos de SmartEiffel?

Le meilleur moyen est de garder un oeil sur nos pages web, plus spécifiquement sur les pages Quoi de neuf ? (http://SmartEiffel.loria.fr/general/whatsnew.html) et Historique des changements (http://SmartEiffel.loria.fr/misc/HISTORY.html).

Les personnes qui veulent des informations détaillées peuvent aussi décider de se tenir informées via la liste de diffusion de SmartEiffel (http://SmartEiffel.loria.fr/support/mailing-list.html) ou même en jetant un oeil au système de traque des bogues (http://SmartEiffel.loria.fr/support/bug_report.html).

Quelle documentation est fournie par SmartEiffel?

La documentation fournie avec SmartEiffel est une transcription de ce que vous pouvez trouver sur le site Internet originel de SmartEiffel, sur http://smarteiffel.loria.fr. Elle ne concerne que l'utilisation et le fonctionnement de SmartEiffel (oui, nous devons envore l'améliorer ;) ).

Pour des informations et de la documentation sur le langage Eiffel, voyez les liens sur notre page des ressources (http://SmartEiffel.loria.fr/general/resources.html). Notez que nous ne sommes pas (encore ?) au courant d'un manuel complet du langage Eiffel qui soit librement accessible sur Internet.

Pourquoi ne postez-vous pas plus de messages dans les groupes de discussion et/ou sur les listes de diffusion ?

Premièrement, parce que nous sommes intimement convaincus que trop d'information tue l'information. Les scientifiques appellent ceci la "surcharge cognitive". :)

Deuxièmement, parce que nous n'avons pas le temps. Cela prend une quantité phénoménale de temps de suivre les discussions, quelle que soit leur qualité. Nous essayons de le faire, mais cela consomme encore plus de temps d'y participer. Nous avons donc souvent à choisir entre poster/envoyer un mail et travailler directement sur SmartEiffel. Et puisque nos boites mails ont tendances à surcharger, nous choisissons généralement la deuxième solution :)

Est-il difficile de passer d'un compilateur Eiffel commercial à SmartEiffel ?

Si votre compilateur de départ n'utilise que les types simples comme INTEGER, STRING, ARRAY, BOOLEAN, CHARACTER et DOUBLE, il est généralement très simple de modifier votre code pour pouvoir utiliser SmartEiffel.

C'est un peu plus compliqué pour les entrées/sorties simples (utilisées avec l'objet prédéfini io) parce que certaines routines ont des noms différents. Par exemple, si votre compilateur de départ repose beaucoup sur la librairie EiffelBase, cela pourrait être très difficile.

Autre exemple : vous devez garder à l'esprit que SmartEiffel.ARRAY hérite de SmartEiffel.COLLECTION et que la librairie d'ISE a également une classe COLLECTION. De plus, les sous-classes de ISE.COLLECTION ne peuvent pas être utilisées. ISE.LINKED_LIST peut être utilisée conjointement avec SmartEiffel.ARRAY parce que ISE.LINKED_LIST n'hérite pas d'ISE.COLLECTION (pas de collision).

Questions d'ordre général sur les langages ou la programmation par objets

Quel est la différence entre type statique et type dynamique?

Le type statique correspond au type de déclaration d'une variable alors que le type dynamique correspond, à un instant donné lors de l'exécution, au type de l'objet effectivement référencé. Par exemple une variable peut être déclarée de type FRUIT et, à un instant donné de l'exécution, avoir pour type dynamique POMME par exemple.

Qu'est-ce que la prédiction de type?

C'est le fait pour un compilateur d'essayer de prédire au moment de la compilation, le type dynamique des expressions.

Questions sur le langage Eiffel du projet SmartEiffel

Pourquoi SmartEiffel fait-il la différence entre majuscules et minuscules ?

En fait, comme la plupart des langages informatique, Eiffel fait effectivement la distinction entre majuscules et minuscules. Ce choix est guidé simplement par but de lisibilité, d'organisation et de simplification.

En ce qui concerne les mot clés, visuellement, il est plus simple de repérer les mot clefs quand ils sont toujours écrits de la même facon. Ainsi, on écrira toujours loop et non pas Loop ou encore LoOp. De même, il faut dès maintenant prendre de bonne habitudes car cette règle va se généraliser pour être de plus en plus stricte à l'avenir. Dès maintenant, prenons tous l'habitude d'écrire: Current, Void ou True par exemple.

Les majuscules servent aussi à distinguer les noms de classe des autres noms. Ainsi, sans devoir regarder ailleurs dans le texte, on sait que FOO est un nom de classe et que foo n'en est pas un.

Enfin, un autre avantage à la distinction majuscule/minuscule est de permettre des messages d'erreur plus précis. Ce qui simplifie le travail pour un humain le simplifie aussi pour les outils de compilation.

Quel est réellement l'effet d'une chaîne de caractères explicite ?

En effet, il peut être important de savoir ce qui se passe vraiment quand, par exemple, vous définissez un attribut constant de type STRING en écrivant :

Message: STRING is "abc"

en fait, la définition d'attribut constant qui précède est une façon plus compacte d'écrire :

Message: STRING is
   once
      create Result.make(3)
      Result.extend('a')
      Result.extend('b')
      Result.extend('c')
   end

Notez bien entendu que la définition de fonction qui précède est une fonction once et que par conséquent une et une seule chaîne sera créée quoi qu'il arrive. Quand on cherche véritablement les performances à l'exécution , il faut aussi connaître la différence entre :

string := "abc"

et

string := once "abc"

Vous l'avez probablement deviné, si l'instruction sans le once est dans une boucle, une nouvelle chaîne est créée à chaque fois que l'on évalue la ligne en question !

La forme d'expression once qui précède n'est valide que dans le cas des STRING explicites et dans le cas des UNICODE_STRING explicites. Exemple de chaîne UNICODE_STRING explicite (notez le grand U):

unicode_string := once U"abc"

L'option -manifest_string_trace de la commande [compile_to_c (http://SmartEiffel.loria.fr/man/compile_to_c.html)] permet de faire la chasse aux chaînes de caractères explicites non-once et non souhaitées.

Pouvez-vous expliquer à nouveau la différence entre conformance et covariance ?

Notre papier Conformance of agents in the Eiffel language (http://SmartEiffel.loria.fr/papers/papers.html#JOT2004) a une note p. 137 qui paraît surprenante.

Notez que les règles précédentes définissent les règles de conformance, cela n'a rien à voir avec la covariance ou la contravariance.

Les concepts sont distincts, même s'il y a une relation entre eux.

La covariance est définie en terme de conformance, mais l'affectation et également définie en terme de conformance.

C'est exactement, et uniquement, ce que notre papier définit : les règles d'affectation. Ces règles n'étaient pas définies ailleurs avant. C'est important : ce n'est pas que nous ne sommes pas d'accord avec une quelconque position antérieure. Nous avons juste comblé un manque dans la spécification.

Notez également que, même si la notation des types agent utilise les crochets, cela n'est absolument pas en relation avec la notation des types de classes génériques ; par conséquent, les règles des classes génériques ne peuvent pas s'appliquer (sauf si on prouve le contraire). Un type agent n'est pas plus un type générique qu'un tuple ne l'est. Ce sont des concepts distincts, avec seulement une notation similaire.

La conformance est fondamentale dans tout langage typé ; d'un autre côté, la covariance est "juste" un bonus d'Eiffel. Important, certes, mais pas aussi fondamentale que la conformance. Notre papier ne parle jamais de covariance, sauf dans la note citée ci-dessus, et l'explication présente. Peut-être que le papier devrait expliquer cette subtilité avec autant de mots.

Qu'est-ce qu'un CATCALL ?

En Eiffel, lorsque l'on parle de CATCALL on fait référence aux trous de sécurité qui existent bel et bien dans le langage Eiffel. En Anglais, dans le domaine Eiffel, CATCALL est un raccourci pour dire Changing Availability or Type of CALLs. Notons qu'en anglais courant, catcall est également utilisé dans le cas ou une foule siffle en signe de mécontentement.

Changing Availability : relatif à un changement du statut d'exportation d'une méthode dans une sous-classe.

Type of CALLs : relatif à une redéfinition covariante d'une méthode.

Qu'est-ce que SCOOP ?

En Eiffel, lorsque l'on parle de SCOOP, c'est pour désigner le support langage pour la programmation distribuée. En Anglais, dans le domaine Eiffel, SCOOP est un raccourci pour dire Simple Concurrent Object-Oriented Programming. Cet aspect n'est pas encore implanté dans SmartEiffel et c'est bien le manque le plus important.

Questions sur la bibliothèque de classes fournie avec SmartEiffel

Comment lire un fichier ?

Pour lire un fichier, il faut lire un caractère et utiliser ensuite last_character SEULEMENT si end_of_input n'a pas été atteint lors de la lecture du caractère.
Avant chaque lecture (sauf la toute première), il faut tester end_of_input, parce que toutes les procédures read_* requièrent not end_of_input. Pourquoi donc ? Cette précondition signifie que si une lecture précédente a échoué parce qu'on a atteint la fin du fichier, il n'est pas valide d'essayer de lire à nouveau. Exemple:

file: TEXT_FILE_READ; file_name: STRING
...
-- Assumming here that `file' and `file_name' are not Void:
file.connect_to(file_name)
if file.is_connected then
   from
      file.read_character
      until
         file.end_of_input
      loop
         io.put_character(file.last_character)
         file.read_character
      end
      file.disconnect
end

Questions sur les outils de SmartEiffel

Est-il possible de faire de la compilation incrémentale avec SmartEiffel?

A cause du mécanisme d'inférence de type de SmartEiffel, tous les fichiers C nécessaires sont regénérés du néant à chaque compilation. Commes les anciens fichiers C sont sauvegardés automatiquement, seuls les fichiers C modifiés sont recompilés. Voir man/compile (http://SmartEiffel.loria.fr/man/compile.html) pour les détails.

Y a-t-il un mécanisme pour pré-compiler les bibliothèques ?

Non, SmartEiffel ne fournit pas un tel mécanisme. Mais si vous êtes préoccupés par la vitesse de compilation, ne vous inquiétez pas. Les bibliothèques pré-compilées ne sont pas la seule manière d'être rapide ! Essayez SmartEiffel et vous verrez :)

Est-il possible d'utiliser le ramasse-miettes Boehm-Demers-Weiser garbage collector avec SmartEiffel ?

Oui.
Vous devez juste désactiver la génération du ramasse-miettes par SmartEiffel (option -no_gc) et le remplacer par la bibliothèque BDW. Notez que le ramasse-miettes BDW peut être facilement ajouté parce que SmartEiffel utilise seulement malloc/realloc/calloc.
Vous pouvez télécharger la bibliothèque BDW depuis : 

http://www.hpl.hp.com/personal/Hans_Boehm/gc/
Comment combiner le ramasse-miette Boehm-Demers-Weiser avec SmartEiffel (d'après un message de Dietmar Wolz) : 

  1. Compilez le fichier gc.a du paquet BDW. Déplacez ensuite ce fichier gc.a vers /usr/lib/libgc.a.  
  2. Déplacez gc.h vers le répertoire courant et ajoutez les lignes suivantes: 

  3. #define malloc(n) GC_malloc(n) 
    #define calloc(m,n) GC_malloc((m)*(n)) 
    #define realloc(p,n) GC_realloc((p),(n)) 
    #define free(p) GC_free(p) 

  4. au lieu de taper 

  5.     "compile -o executable -boost -O root" 
    tapez  
        "compile -o executable -boost -O root -no_gc -lgc -include gc.h" 

Comment adapter le ramasse-miettes à une nouvelle architecture?

Si votre architecture requiert un traitement spécial pour que le ramasse-miettes fonctionne (parce que la pile n'est pas contigüe, parce que certains registres ne sont pas empilés lors d'un `setjmp'...) vous devez implanter la fonction `mark_stack_and_registers' pour votre système dans le fichier SmartEiffel/sys/runtime/c/gc_lib.c.

Si vous obtenez des messages qui disent que la pile est dans le mauvais sens, vous devez changer la macro pour utiliser l'autre code générique (il y a un code générique pour chaque sens de la pile)

Si le ramasse-miettes fonctionne, vous devriez pouvoir exécuter tous les fichiers du répertoire SmartEiffel/misc/benchmarks/gc.

Comment SmartEiffel est-il compilé ?

Avec les options d'optimisation -boost et -no_gc. En effet, le ramasse-miettes est inutile dans les commandes SmartEiffel: SmartEiffel n'incluant pas de ramasse-miettes dans les premières versions, nous avons été attentifs aux problèmes de mémoire lorsque nous l'avons développé.

Il est également compilé avec les options d'optimisation du compilateur C activées (cela dépend du compilateur C, nous utilisons gcc habituellement).

Les exécutables obtenus sont strippés (les symboles qui ne sont pas utiles à l'exécution du compilateur sont retirés des exécutables et des fichiers objets).

Questions à propos du wiki de SmartEiffel

Pourquoi y a il une page "Table des matières" sur le wiki?

Effectivement, pour un wiki, cela peut paraître étrange. En fait, le but consiste à pouvoir dans le futur, produire automatiquement ou presque, un véritable livre en vrai papier contenant toute l'information de ce wiki. Notons que l'outils permettant de produire cette version papier n'est pas encore écrit.

Pourquoi les noms des pages sont ils toujours en Anglais?

Comme vous l'avez remarqué, tous les noms des pages sont en anglais même lorsque, par exemple, on est en train de lire la version française du wiki. Par exemple, le nom de la page qui correspond à la Table des matières est toujours Table of contents et ce, quelquesoit le langage de lecture sélectionné. Ce n'est pas seulement dans un but d'uniformisation que nous avons effectué ce choix arbitraire. L'objectif consiste surtout à simplifier la mise en correspondance entre les pages des différents langages. En fait il suffit simplement, pour passer du Français à l'Anglais de remplacer dans l'URL de la page courante la chaîne "/wiki/fr/" par "/wiki/en/".

Comment fait-on pour ajouter une figure faites avec tgif?

Pour l'instant, toutes les figures du grand livre sont réalisées avec le logiciel tgif car il permet à la fois de produire les fichiers *.png pour la version électronique (le wiki) ainsi que les fichiers *.eps pour la production du document LaTex (i.e. pour la version papier).

Comme les figures doivent être a priori éditables par tous, les fichiers source pour les figures tgif, les fichiers *.obj sont placés sur le serveur. C'est la règle, à chaque fichier Foo.png sur le serveur doit correspondre sur le serveur également, le fichier source tgif correspondant dont le nom est forcément Foo.obj

Pour déposer un fichier sur le serveur, utiliser le bouton Déposer fichier dans le menu de gauche qui correspond en fait à la page de même nom, la page Déposer fichier.

Dans l'autre sens, lorsque l'on souhaite récupérer le fichier source tgif d'une des figures, il faut aller via le bouton Pages spéciales dans le menu de gauche, afin d'arriver sur la page qui donne la Liste des images. Ensuite, il faut aller dans la description du fichier *.obj que l'on souhaite obtenir pour pouvoir enfin faire le Save Link Target As habituel sur le fichier *.obj en question.

Pour les figures, faut-il impérativement utiliser tgif?

Pour l'instant, toutes les figures ont été faites avec tgif pour des raisons principalement historiques mais aussi car ce logiciel marche bien, marche sous Linux, sait transformer à la fois les schémas au format *.png et aussi, ce qui est indispensable, au format *.eps. En outre, le format source de tgif, le format *.obj est un format texte simplement lisible et transportable.

Nous n'avons rien contre l'utilisation d'un autre logiciel à condition que ce logiciel soit lui aussi capable de produire à la fois le format *.png pour le wiki ainsi qu'un format accepté par LaTeX. Il faut également que le format des fichiers source pour ce logiciel soit un format simplement lisible et transportable. Dernier point, le logiciel en question doit aussi marcher sous Linux et ne doit pas être payant.

En fait, vous l'avez compris, surtout pour nous simplifier la vie, nous préférons limiter le nombre d'outils utilisés pour la production des figures. Si vous voulez vraiment qu'un autre logiciel soit utilisable, contactez nous en utilisant la page la plus appropriée de notre Wiki.

Outils personels
Autres langues