Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Langage de programmation][VM][Scripting] Kafe

Un Java-like, en mieux (je troll mais au moins ça attire des gens)

Anonyme
    18 mars 2018 à 14:28:33

    Salut à tous ! Cela faisait longtemps que je n'étais pas venu ici dis donc

    J'aimerais vous présenter un projet qui me tient à coeur (déjà parce que je commence enfin à avoir quelque chose de potable et ensuite parce que des retours sur le code, je dirais pas non :p) : Kafe. Kafe est un langage de programmation (oui, encore un, parmi plusieurs milliers déjà existants, je vous explique après pourquoi je bosse dessus) fonctionnant sur machine virtuelle (VM), comme Java (d'où mon inspiration), codé en C++ (comme Java m'a-t-on dit). Le but est de faire grosso modo un langage de programmation utilisable comment langage de scripting pour jeux vidéo.

    Alors, pourquoi un n-ieme langage ? Petite liste de réponses :

    1/ pour apprendre comment fonctionne une VM dans la pratique, se confronter aux problèmes lors de la conception d'une telle chose (optimisations et tout)

    2/ je voulais pouvoir dire "oh la la regardez j'ai fait un langage de programmation" même s'il est nul, c'est toujours sympa sur un portfolio et (je l'ai déjà dit) on apprend beaucoup en faisant des projets (ce point est un peu anecdotique oui, mais c'est souvent comme ça quand je démarre un projet, ça part sur un coup de tête et j'ai envie de le mettre sur mon portfolio)

    3/ c'est drôle je trouve :)

    4/ pour l’utiliser dans des jeux vidéos en lieu et place de Lua (qui d’après moi manque de classes et de tableaux convenables (comprendre: qui ne commencent pas à 1)) ;)

    Avancement

    Actuellement, je travaille beaucoup sur la VM (implémentation de byte codes comme ceux de la gestion des listes, des classes...) et le parser, qui doit pouvoir lire du code, le transformer en AST et en faire un bytecode.

    Ce qui fonctionne très bien, c'est la VM, le parser n'est pas fonctionnel mais je bosse dessus ;)

    C'est pas la partie la plus passionnante en effet (l'avancement je veux dire, par contre coder ça c'est trop cool).

    Les technologies utilisées

    Le projet est en C++ (17) de A à Z, la VM est terminée à quasiment 90% et faite entièrement à la main (pas de LLVM ou quoi). Pour le parser, j'ai opté pour ANTLR (Another Tool for Language Recognition) qui me génère lexer, parser et visistor (plein de trucs assez long à écrire, et sources d'erreurs de façon récurrente quand on les fait mal) à partir d'une grammaire (un fichier décrivant le langage, comment on doit écrire un if, une boucle while, une fonction...). Cela me permet de ne me concentrer que sur la construction du bytecode (si vous voulez des détails techniques : j'hérite d'un visitor qui permet d'explorer de façon récursive un AST généré par le parser, et de là je génère le bytecode).

    Côté fonctionnement interne, j'explique des choses plus "poussées" si ça vous intéresse, histoire de pas grossir le pavé et de pas perdre des gens, je vous laisse seulement un lien : https://kafe-lang.github.io/documentation/vm/bytecode.html 

    Bon sinon, ça ressemble à quoi ?

    cls Character
        dyn name
        dyn life
    
        fun __init__(self)
            self.name = "georges"
            ret
    
        fun update(self dt)
        # creating and adding attributes on the go
        self.dt = dt
            # we need to tell the compiler the function has ended
            ret
    end
    
    dyn player = new Character("John Doe" 120)
    dyn mob = new Character("Rabbit" 15)
    
    # comma in arg list is optionnal
    fun update(dt component)
        dyn status = 0
    
        if component == "player" then
            print("updating player")
            player.update(dt)
        elif component == "mob" then
            print("updating mob")
            mod.update(dt)
        else
            print("unknow component : " component)
            status = 1  # an error occured
        end
    
        ret status
    
    update(0.005 "player")
    
    while player.name == "John Doe" do
        player.name = input("What's your name? ")
    end

    L'héritage n'est pas prévu, mais cela reste faisable.

    La différence de création de classes / valeurs :

    dyn a = 10  # le parser lira 10 et le mettra dans la catégorie Int, donc le visitor en construisant le bytecode déclarera a comme un entier
    
    dyn b = Obj MonObjet(argument1 argument2)  # la syntaxe n'est pas la même car on défini un objet

    Des liens pour la route

    Le site "officiel" du projet (je mets officiel entre guillemets parce que je suis pas une organisation donc je ne sais pas trop si la dénomination peut s'appliquer, mais c'est tout de même le seul site avec des informations sur Kafe (un peu logique en soit ahah)) : https://kafe-lang.github.io/ 

    Le dépôt Github : https://github.com/Kafe-lang/Kafe

    Sur ce, je vous souhaite de passer une agréable journée !

    -
    Edité par Anonyme 20 août 2018 à 13:44:31

    • Partager sur Facebook
    • Partager sur Twitter
      18 mars 2018 à 20:56:18

      (Re)salut !

      Très beau projet, bravo :)

      Je t'avoue que je suis assez "impressionné" de la complexité et complétude du byte code. Ce qui doit sans doute rendre performante l'interprétation. Si ce n'est pas de la compilation.

      Tu dis que ton langage est prévu pour "le scripte de jeux vidéo". Mais pourrais-tu en dire un peu plus ? Un exemple concret par exemple :) 

      • Partager sur Facebook
      • Partager sur Twitter

      Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

      Anonyme
        18 mars 2018 à 21:20:12

        Hey ! Merci :honte:

        Je vise toujours des perfs meilleures, pour donner un idée voici un gist avec le résultat des tests que je fais tourner régulièrement (compilé en Release) : https://gist.github.com/SuperFola/8933931e0f42bb87224663160fba1d38 

        On voit que le calcul de la factorielle (ici de 18) (version de l'algorithme récursive) prend tout de même >80µs (sur un interpréteur java en ligne, il faut moins de 6µs), ce qui est assez long je trouve, mais déjà pas mal pour un début.

        Effectivement, je le conçois dans l'optique de l'utiliser dans des jeux vidéos, c'est pourquoi je travaille sur un système de plugin (chargement de DLL au runtime pour ajouter des fonctions externes (C++ only) à la librairy chargée par la VM). Conceptuellement, plus tard on pourra demander à la VM de charger la DLL plugin-sfml.dll par exemple, la VM ira chercher des fonctions précises et complètera sa "collection" de méthodes (de type string => fonction acceptant un vector<Value> (c'est un type utilisé par la VM) en arguments), de façon à ce que le bytecode puisse, s'il a été généré pour (là aussi j'ajouterai des options à la compilation du code kafe en bytecode pour permettre de dire qu'il faut une dll précise), utiliser des fonctions de la DLL.

        Après, je ne sais pas si tu connais kaguya (binding lua en C++), mais je me suis inspiré de l'interface pour concevoir la mienne et pouvoir plus tard intégrer kafe dans un projet pour exécuter du code *on the go* (on crée un parser, on compile en bytecode, on exécute : pas besoin de lancer un processus pour exécuter la VM kafe en gros) : https://github.com/SuperFola/Kafe/tree/master/src/kafe/state 

        Je n'ai pas encore testé parce que je n'ai fait que la base mais l'idée est là.

        Pour donner un exemple de code C++ utilisant le binding kafe <->, à terme ca devrait ressembler grosso modo à ceci :

        kafe::State state;
        state.execFile("path/to/kafe.script");
        
        state(
            "fun main(argc:int, argv:list) -> int" \
            "    if len(argv) == argc then" \
            "        ret 0" \
            "    end" \
            "    ret 1" \
        );  // load and execute
        
        // only load, do not execute
        kafe::Function f1 = state.loadFile("path/to/kafe.script");
        f1();
        // only load, do not execute
        kafe::Function f2 = state.loadString("dyn a : str = \"hello world from Kafe\"");
        f2();
        kafe::RefVar a = state["a"]<kafe::str_t>();
        static_assert(a == "hello world from Kafe");
        
        auto ret = state["main"].call<kafe::int_t>(1, {"mainscript"});
        static_assert(ret == 0);

        J'espère avoir répondu correctement à tes questions :)

        • Partager sur Facebook
        • Partager sur Twitter
          18 mars 2018 à 21:45:11

          Oui, merci. Ca à l'aire pas mal :)

          Par contre je ne pense pas que l'on soit obligé d'utiliser un '\' pour définir un retour à la ligne après une chaine de caractère en C++. Ça ressemble un peu à lua d'ailleurs.

          Mais, pour pousser un peu plus loin (:D), est-ce que grâce à ton langage, il serait possible de créer des projets quand même assez "conséquent" ? Par exemple, créer un jeu comme Pac-man, ou même Minecraft... je sais pas.

          -
          Edité par vanaur 18 mars 2018 à 21:45:31

          • Partager sur Facebook
          • Partager sur Twitter

          Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

          Anonyme
            18 mars 2018 à 21:54:34

            Pour les "\", oui, je dois confondre avec le Python x) les vieilles habitudes ahah

            Le premier projet qu'on a avec Kafe (et des amis sur discord) c'est d'écrire notre propre suite Office (ça part d'un gros troll). Le concept serait de charger un plugin (une interface pour la SFML en Kafe par exemple) et de s'en servir pour générer vite fait une zone de texte et récupérer des appuis clavier.

            Actuellement c'est pas encore faisable (je me répète un peu) parce que le transpileur est encore d'écriture, que le système de plugin existe mais n'est pas relié à la VM, et qu'il manque des trucs dans le bytecode (Objets et listes, et pis faut l'optimiser encore et toujours plus).

            Mais oui, à terme, ça serait sympa de pouvoir faire des applis entièrement en Kafe (le fait qu'on ai du bytecode est un argument génial parce que ça veut dire qu'on code une fois et ça marche partout) ! :)

            • Partager sur Facebook
            • Partager sur Twitter
              18 mars 2018 à 22:13:27

              Yaalval a écrit:

              Le premier projet qu'on a avec Kafe (et des amis sur discord) c'est d'écrire notre propre suite Office (ça part d'un gros troll).

              xD. Si vous êtes plusieurs à travailler sur le projet, ça ne devrait pas être trop compliqué. Mais bonne chance quand même.

              Yaalval a écrit:

              le fait qu'on ai du bytecode est un argument génial parce que ça veut dire qu'on code une fois et ça marche partout

              C'est vrai. De plus en plus de système se tourne vers cette optique. De plus passé par un langage intermédiaire permet énormément d'optimisations de performance, notamment liées au typage.
              • Partager sur Facebook
              • Partager sur Twitter

              Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

              Anonyme
                19 mars 2018 à 8:43:43

                Yep, ça peut être rigolo et puis ça permettra de déboguer le langage et de continuer à l'améliorer. Mais sinon actuellement je suis seul sur le développement du langage en lui-même :')

                Sur ce, je vais continuer mon exposé d'économie, j'espère pouvoir continuer le développement de Kafe jeudi après-midi pour entamer correctement le parser et corriger différentes choses relatives au bytecode (j'ai des gros doutes sur la gestion interne des Obj par la VM, et les listes sont toujours manquantes à l'appel), ainsi que rajouter divers tests (on n'a pas assez de tests pour la VM pour avoir des statistiques sur la vitesse d'exécution qui soient fiables).

                Excellente journée !

                • Partager sur Facebook
                • Partager sur Twitter
                  19 mars 2018 à 20:30:42

                  Merci, à toi aussi !

                  J’attends donc les avancées, mais ne te presse pas ;)

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

                  Anonyme
                    30 avril 2018 à 17:45:28

                    Bonjour à tous !


                    Je reviens vers vous après un mois sans nouvelle(s), après avoir corrigé pas mal de petites choses sur Kafe. Entre autre j'ai fait un fork d'ANTLR parce que je commençais à en avoir un peu marre d'avoir des erreurs avec le ERROR dans l'ATN (une variable est nommée ainsi dans leur code et est remplacée par la macro ERROR de windows.h, enfin bref) et j'ai appliqué ce fork à Kafe pour m'éviter de futurs ennuis.


                    Sinon j'ai ajouté des benchmarks (je dois encore les adapter pour Linux) : https://github.com/SuperFola/Kafe/tree/master/benchmarks, des tests, et Kafe compile enfin sur Linux (testé sur Lubuntu 17.10 avec gcc-7.2.0) !


                    Je vais travail ma VM de façon à supporter les listes, et sûrement commencer à bosser sur le parser qui se fait pas mal désirer, je vous tiens au jus ! ;)

                    -
                    Edité par Anonyme 30 avril 2018 à 17:47:18

                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 avril 2018 à 22:33:15

                      Bonnes avancées ;)

                      Je n'ai pas grand-chose à ajouter, mais je voulais savoir, au passage, pourquoi avoir appelé ton langage "Kafe" ?

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

                      Anonyme
                        3 mai 2018 à 14:38:21

                        Ca, c'est un troll par rapport à Java, qui tourne sur une VM en C++ comme mon langage, nommé ainsi à cause de la marque de café vendue par javacoffee (http://javacoffee.com/) que consommait énormément son créateur. Si tu vas sur un site "homonyme" (http://javacoffee.rs/) ils vendent du Kafe (ou Kafa, mais j'ai un peu modifié pour que ça sonne mieux)
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          20 août 2018 à 13:45:05

                          Salut à tous !

                          J’ai mis à jour le post principal (syntaxe et documentation).

                          Concernant les nouveautés, voici donc :

                          • j’ai tout passé sur https://github.com/Kafe-lang, le nombre de dépôts augmentant un peu trop, pour centraliser tout ça

                          • on a donc un site de présentation du projet, et un début de documentation

                          • par rapport au dernier point: j’aimerai écrire la documentation relative au langage de façon succincte pour fixer la grammaire avant de continuer mon travail sur le compilateur

                          • à propos de la VM, je viens de rentrer de vacances avec un classeur plein d’idées et de descriptifs techniques, il va donc y avoir du mouvement (sur la doc en premier lieu, que je puisse définir exactement ces nouveautés pour m’y reporter lors de l’implémentation), dès que j’aurais fini mon rapport de stage :p

                          Je vous remets les nouveaux liens ici :

                          • Partager sur Facebook
                          • Partager sur Twitter

                          [Langage de programmation][VM][Scripting] Kafe

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown