IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Interpréteur de scripts


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Par défaut Interpréteur de scripts
    Bonjour,


    Avant tout je tiens à préciser que je vous sollicite afin d'avoir quelques pistes, un aiguillage plutôt qu'une solution clé en main.

    Je dispose d'une application développée en C++ que je contrôle par son interface graphique.

    Dans un souci d'automatisation de tâches, je veux créer un langage script très simple pour contrôler mon application non plus par son interface graphique mais par des commandes que j'écrirai dans un fichier texte.
    Je souhaite donc ajouter à mon application un interpréteur de scripts qui lise le fichier en question et qui effectue les actions demandées par les mots clés qui s'y trouvent.

    En ce moment je cherche des conseils pour adopter le meilleur design possible.

    D'avance merci pour votre aide.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Peut être devrais tu, tout simplement, te tourner vers les bibliothèques de "scripting" existantes, telles que lua...

    Autrement, il te reste toujours, pourquoi pas, la possibilité de te tourner, presque de manière tout aussi simple, vers un script shell, ou batch, selon le système d'exploitation que tu utilise
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Par défaut
    Bonsoir et merci pour ta réponse,

    Je ne connaissais pas lua. Il s'agit d'un langage déjà existant avec son interpréteur.

    Ce n'est pas une solution qui me convient puisque je souhaite moi même définir mon propre langage (avec mes propres mot clés) et intégrer "l'interpréteur de scripts", que je dois donc réaliser, à l'application existante.

    Donc, ce qui pourrait m'intéresser ce serait d'avantage de trouver un diagramme UML d'un interpréteur de scripts existant pour voir comment il est "designé", comment il lit les différentes chaines de caractères, et tout et tout...

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Des solutions à base de lua ou python utilisent certes un langage déjà existant, mais quand tu l'intègres dans ton programme, il peuvent accéder directement à des objets que tu as défini toi, en fonction des particularité de ton code.

    Tu bénéficies donc de la puissance d'un vrai langage, de plein de bibliothèques externes, et d'un temps de développement réduit.

    Si maintenant, tu veux vraiment définir ton propre langage, pour une raison que je ne connais pas (curiosité, par exemple) dans ce cas, tu vas devoir te tourner vers la notion de lexeur/parseur pour analyser le code écrit. Tu devrais trouver pas mal de choses en cherchant lex/yacc, flex/bison, antlr, et boost::spirit.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par levit Voir le message
    Bonsoir et merci pour ta réponse,

    Je ne connaissais pas lua. Il s'agit d'un langage déjà existant avec son interpréteur.

    Ce n'est pas une solution qui me convient puisque je souhaite moi même définir mon propre langage (avec mes propres mot clés) et intégrer "l'interpréteur de scripts", que je dois donc réaliser, à l'application existante.

    Donc, ce qui pourrait m'intéresser ce serait d'avantage de trouver un diagramme UML d'un interpréteur de scripts existant pour voir comment il est "designé", comment il lit les différentes chaines de caractères, et tout et tout...
    Sinon, pour répondre à ces questions spécifiques, des recherches google sur les mots clef "analyse lexicale", "analyse syntaxique", "générateur de parser" et les équivalent en anglais de ces termes te fourniront un ensemble de réponses que tu pourras exploiter.

    Ceci-dit, je te conseilles d'utiliser un langage existant, tu auras au moins l'assurance que ça marche. lua est très simple d'utilisation, et te permet de définir dans ton programme un environnement d'exécution qui est partagé avec les scripts.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Par défaut
    Disons que le langage que je souhaite créer se veut d'une simplicité extrême, avec un nombre réduit de mots.

    Les différentes pistes que vous m'avez données me semblent très intéressantes, je creuse dans ce sens pour faire mon choix.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    TCL est, à mon avis, aussi à considérer. Par certains aspects il est moins agréable que d'autres langages de script, mais il n'a pas été conçu comme langage de programmation mais comme langage de commande (TCL -> tool command language). Dans un sens, c'est un vrai langage de script tandis que Python etc sont des langages de programmation.

    Vur l'aspect historique de l'utilisation du mot, voir aussi http://www.developpez.net/forums/sho...95&postcount=3.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Par défaut
    - lua
    - script shell
    - script batch
    - TCL
    - lex/yacc
    - flex/bison
    - antlr
    - boost::spirit
    - AngelScript
    - Qt.script
    - Coco/R
    - LAPG

    Comprenez que je me retrouve avec plus d'interrogations que j'en avais au début. J'imagine que l'une de ces solutions correspond mieux à mon souhait que les autres.

    Je rappelle brièvement, pour recadrer le sujet, ce que je souhaite faire en reprenant et en complétant l'exemple de la page précédente :

    Je prends l'exemple classique d'une application qui manipule des images via une classe TImage.

    En l'état actuel des choses, si je souhaite réaliser un seuillage sur une image, je peux modifier le contenu de mon main comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     int main (void)
    {
       TImage I;
       I.lire("monImage.jpg");
       I.seuillage(128);
       I.sauvegarde("monImageBis.jpg");
       return(0);
    };
    Dans ce cas, au lieu de modifier ainsi mon main, mon idée serait de pouvoir avoir un fichier script dans lequel j'écrirais par exemple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NEW IMAGE 
    IMAGE LOAD "monImage.jpg"
    IMAGE SEUIL 128
    IMAGE SAVE "monImageBis.jpg"
    Mon main ressemblerait alors à ceci ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     int main (void)
    {
       lire_interpreter_executer("monFichierScript");
    };
    L'objet est donc bien la stratégie à adopter pour créer cette fonction lire_interpreter_executer().

  9. #9
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Beaucoup de choses ont été citées. Un petit décryptage:

    - lua -> langage de script existant; peut être intégré dans une application. Simple, rapide, puissant et facile à intégrer.
    - script shell -> intrepréteur de script externe à ton application
    - script batch -> intrepréteur de script externe à ton application
    - TCL -> langage de script existant; peut être intégré dans une application
    - lex/yacc -> outils permettant de générer des lexeurs et de parseurs; les code sources générés sont écrits dans le langage C.
    - flex/bison -> versions GNU de lex (flex) et yacc (bison)
    - antlr -> outil permettant de générer des lexeurs et de parseurs; les code sources générés sont écrits dans le langage Java, C# ou C.
    - boost::spirit -> bibliothèque C++ "simplifiant" l'écriture de lexeurs et de parseurs
    - AngelScript -> langage de script existant; peut être intégré dans une application
    - Qt.script -> langage de script existant; peut être intégré dans une application
    - Coco/R -> outil permettant de générer des lexeurs et de parseurs; les code sources générés sont écrits dans de multiples langages, y compris C++.
    - LAPG -> outil permettant de générer des lexeurs et de parseurs; les code sources générés sont écrits dans de multiples langages, y compris C++.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Haha, un sujet parlant de la théorie des langages, génial.
    Bon, on a déjà cité plusieurs documents mais bizarrement aucun qui figure sur developpez. C'est bien dommage vu qu'il sont assez bien faits et ont le mérite d'être en français. On en trouve notamment la et la et il y a aussi un bouquin sur lequel je lorgne depuis un bout de temps ici.

    Ensuite, je ne pense pas que ce soit une bonne chose de catapulter un néophyte d'entrée de jeux vers lex/flex yacc/bison. Tout d'abord parce que leur utilisation ne dispense absolument pas de la théorie nécessaire et ensuite parce que je trouve beaucoup plus instructif de commencer par un lexer hardcodé et un parser descendant full-hardcodé lui aussi. Ca permet de comprendre beaucoup mieux le fonctionnement, de mieux assimiler le BNF (ho, pourquoi il est ambigu mon langage?) et surtout c'est plus ludique (à partir du moment où on peut concevoir que la programmation puisse s'avérer être une activité ludique, beaucoup me contrediraient sur ce point).

    Ca c'était mon avis sur la façon d'apprendre la théorie des langages. Maintenant, pour ce qui est des motivations, je n'en vois que deux:
    - pour s'amuser, parce qu'on trouve ça intéressant
    - pour concevoir un langage nouveau, avec de bon concepts et qui sera utilisé par des milliers de personnes, en sachant que l'investissement en temps et en personnes pour obtenir un truc vaguement potable est considérable. Pour te dire, dans mon cours de théorie du langage nous avons du réaliser un compilateur/interpréteur. Il fait à peu près 2200 lignes de codes en excluant la partie génération d'assembleur (pour un programme d'école c'est pas rien), a demandé le travail de quatre personnes chacun se concentrant sur un partie de la théorie. Au final ce langage permet tout au plus de calculer une factorielle et une suite de fibonnaci (des exemples triviaux), et je l'estimerais deux cents fois plus lent que le Java (je suis gentil). Pour autant, c'est loin d'être le plus mauvais de la classe

    Alors pour conclure, si ta motivation est la première bonne chance. Si c'est la seconde passe ton chemin, le scripting est un besoin récurrent dans beaucoup de domaines, voila pourquoi il existe une foule de langages prêts à l'emploi pour ça. C'est un parfait exemple de tâche où il est ridicule de réinventer la roue.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Par défaut
    Merci pour le récapitulatif Emmanuel.

    Pour en revenir à Coco/R, son avantage sur Lex/Yacc est donc sa capacité à travailler avec C++. Par contre il me semble moins répandu que Lex/Yacc.
    J'ai vu que Flex/Bison propose une version C++ que j'ai commencé à tester brièvement. Pensez vous que ce soit une solution viable ?

    J'en profite pour demander à quel point Lex/Yacc (ou leurs pendant GNU) est présent "d'origine" sur les différents unix ?

  12. #12
    Membre chevronné
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NEW IMAGE 
    IMAGE LOAD "monImage.jpg"
    IMAGE SEUIL 128
    IMAGE SAVE "monImageBis.jpg"
    Il faudrait plus d'exemples de ce que tu comptes faire avec ce langage.
    Il n'y a aucun sens à vouloir utiliser des outils aussi complexes que Lex et Yacc pour un langage qui à priori a l'air aussi simple que celui présenté.

Discussions similaires

  1. Interpréteur de langage de script spécifique
    Par sinaps1618 dans le forum C++
    Réponses: 8
    Dernier message: 01/10/2009, 09h42
  2. Créer son interpréteur de "script perso"
    Par fredu dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 28/02/2009, 06h43
  3. [VBS] Lancer plusieurs script dans le même interpréteur
    Par intrud3r dans le forum VBScript
    Réponses: 4
    Dernier message: 12/07/2006, 15h26
  4. Créer un interpréteur de langage inspiré du Basic
    Par Picasso dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 11/05/2002, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo