Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Langage][Jeu vidéo] ArkScript

Un langage de scripting fonctionnel

    25 juillet 2019 à 19:28:24

    Salut à tous!

    Je viens vous présenter mon dernier projet en date (et cette fois-ci, un projet qui fonctionne), ArkScript!

    Qui suis-je?

    Un petit développeur qui a commencé à apprendre le C puis s'est lancé dans du Python, avant de retourner au langage bas niveau, mais cette fois avec le C++. Je continue de faire du Python (3) et du C++ en parallèle, à chaque besoin son langage. J'aime beaucoup tout ce qui est backend (ce qui explique pourquoi j'ai du mal à finir mes sites web et jeux vidéos sans aide extérieure) et qui bien souvent n'intéresse pas les autres (comme les API, les OS, les langages de programmation, les moteurs de jeux...).

    Les origines du projet

    L'an dernier, je me suis lancé dans un projet fou: créer un langage de programmation (Kafe). Quel échec cuisant! En effet je suis parti (pas comme un bourrin mais presque) directement coder une VM, en sautant l'étape parsing/compilation en pensant que c'était facile, ayant déjà eu à faire ce genre de choses pour d'autres projets. Que neni! Ma VM était ""bien"" mais j'ai lâché le projet, je n'arrivais pas à me lancer dans ce compilo, et cette VM était mal conçue (très mauvaise gestion de la mémoire et des objets).

    J'ai tenté de relancer le projet récemment, je me suis arrêté au parsing. Quelque chose n'allait pas. Peu de temps après je me suis lancé dans toy language, Ark. Juste un petit lisp like tout con, interprété, en 2 semaines. Puis j'ai poussé le délire toujours plus loin, souhaitant faire ce compilo puis une VM. Et ça a marché! J'avais enfin réussi à faire ce que Kafe aurait dû pouvoir faire.

    Des objectifs rigolos

    (mettre un titre qui change souvent ça attire le regard, vous me direz si je me trompe :p )

    Pour ne pas partir trop n'importe comment, je me suis fixé des objectifs bien différents (en quelque sorte) de ceux de Kafe:

    • les features avant les performances (même si elles sont pas laissées en arrière plan)
    • un langage fonctionnel, sans classes
    • le moins de mots clés possibles, la concision avant tout! Personne n'aime apprendre un n-ieme langage avec 57'786 keywords
    • une VM oui, mais pas d'OutOfMemory!
    • un langage de scripting qui doit être utilisable dans des jeux vidéos

    Ark s'est par la suite renommé ArkScript (pour mettre l'emphase sur le côté scripting et aussi parce qu'un autre langage avait le même nom) (cf la discussion sur reddit)

    Des exemples

    Un exemple qui utilise les closures, la capture explicite via &, ainsi que le closure field reading via la dot notation, pour répliquer des classes uniquement avec des fonctions, et ce en fonctionnel:

    {
        (let create-human (fun (name age weight) {
            # functions can be invoked in the closure scope
            (let set-age (fun (new-age) (set age new-age)))
    
            # this will be our "constructor"
            (fun (&set-age &name &age &weight) ())
        }))
    
        (let bob (create-human "Bob" 0 144))
        (let john (create-human "John" 12 15))
    
        (print bob.age)
        (bob.set-age 10)
        (print bob.age)
    
        (print john.age)
    }

    La fonction d'Ackermann qui me sert pour mes benchmarcks, comme elle est récursive non primitive:

    {
        (let ackermann (fun (m n) {
            (if (> m 0)
                # then
                (if (= 0 n)
                    # then
                    (ackermann (- m 1) 1)
                    # else
                    (ackermann (- m 1) (ackermann m (- n 1)))
                )
                # else
                (+ 1 n)
            )
        }))
    
        (print (ackermann 3 6))
    }
    

    Vous aurez remarqué que le langage est très lisp like, je trouve ça très bien même si je sais que ça peut ne pas plaire à tout le monde, ce qui n'est pas mon but après tout.

    L'intérêt d'un langage lisp like c'est la concision (tout ce qui est après une parenthèse ouvrante est une fonction) et la magie: le code lui même est l'AST (arbre syntaxique abstrait) manipulé par le compilateur.

    Je vous laisse le GitHub du projet: https://github.com/SuperFola/Ark et le discord du projet où on discute de la spécification ainsi que des évolutions du langage: https://discord.gg/YT5yDwn

    -
    Edité par SuperFola 27 octobre 2019 à 22:21:37

    • Partager sur Facebook
    • Partager sur Twitter

    GitHub | ArkScript, mon langage

      27 octobre 2019 à 22:30:29

      Bonsoir !

      Depuis le dernier post, beaucoup de changements ont eu lieu, que vous pouvez tous retrouver ici: https://github.com/SuperFola/Ark/blob/dev/CHANGELOG.md

      Le gros des changements, c'est:

      * une équipe qui grossi ! J'étais seul quand j'ai fait le premier post, et maintenant nous sommes 6 !
      * un code plus clair, qui sépare exécution (VM) et données (State)
      * un REPL (la sauvegarde de scope est en train d'être faite par un de nos contributeurs)
      * une bibliothèque standard qui grossi de jour en jour
      * une réduction des fonctions standard compile time ! (+ 1 2 3 4) est traité comme (+ 1 (+ 2 (+ 3 4)))
      * des améliorations notables en terme de performance
      * toujours plus de détections d'erreurs, essentiellement sur les importations cycliques, mais aussi des erreurs plus claires au runtime

      Le langage est désormais suffisamment mature pour que l'on puisse coder un forEach directement en ArkScript, sans toucher au code C++, et ça c'est beau quand même

      {
      (let forEach (fun (L code) {
          (mut i 0)
          (while (< i (len L)) {
              (mut element (@ L i))
              (code)
              (set i (+ 1 i))
          })
      }))
      
      (forEach [1 2 3 4] '{
          (print element)
      })
      }
      • Partager sur Facebook
      • Partager sur Twitter

      GitHub | ArkScript, mon langage

      [Langage][Jeu vidéo] ArkScript

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      • Editeur
      • Markdown