Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Écrire son propre langage !

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →

Écrire son propre langage !

Support de présentation pour l'Apéro PHP du 2/10/2018 à Lille organisé par l'AFUP Hauts-de-France.

Code source du langage réalisé: https://gitlab.com/iamluc/reduc-lang

Avatar for Luc Vieillescazes

Luc Vieillescazes

October 02, 2018

Other Decks in Education

Transcript

  1. Pourquoi ? • Exprimer un domaine d’application particulier (DSL*) ◦

    Ex. décrire les réductions applicables à un panier d’achat • Apporter de la flexibilité tout en définissant des limites ◦ Laissez les commerciaux gérer les réductions... ◦ .... mais empêchez les de faire n’importe quoi ! *DSL = Domain specific language
  2. Pourquoi ? “Si le panier est supérieur à 100 €,

    alors réduire le prix de 10 €” → Expression d’un domaine d’application
  3. Pourquoi ? “Si le panier est supérieur à 100 €,

    alors réduire le prix de 10 €” → Contrôle de l'exécution
  4. Pourquoi ? “Si le panier est supérieur à 100 €,

    alors réduire le prix de 10 €”
  5. Pourquoi ? “Si le panier est supérieur à 100 €,

    alors réduire le prix de 10 €” → S’adapter à un autre système
  6. Lexer (Analyse lexicale) Découper une chaîne de caractères en morceaux:

    des tokens. Exemple: • Token::Public • Token::Variable (name = “toto”) • Token::Equal • Token::String (value = “hello”)
  7. Lexer (Analyse lexicale) Attention de ne pas chercher à être

    plus précis que nécessaire. • “public” peut-il aussi être un nom de constante ? Token::Public Token::Identifier (value = “public”) NON OUI Ne marche pas en PHP !
  8. Lexer (Analyse lexicale) Attention de ne pas chercher à “comprendre”

    le langage ici ! Un token peut avoir plusieurs sens en fonction de son contexte. Token::Import Token::Inherit Token::Use
  9. Lexer (Analyse lexicale) Le code peut être lexicalement correct mais

    syntaxiquement incorrect Lexer content Parser pas content
  10. Parser (Analyse syntaxique) Le travail du Parser: 1. Lire les

    Tokens dans l’ordre 2. Vérifier la grammaire 3. Retourner une représentation exploitable (par exemple un AST)
  11. Parser (Analyse syntaxique) La grammaire définit les règles syntaxiques =>

    c’est à dire les enchaînements de tokens valides Exemple: - Un “if” doit être suivi par: - une parenthèse ouvrante - une “expression” - une parenthèse fermante - Une “expression” commence par une “variable” ou un “chiffre”, suivi optionnellement d’un “opérateur binaire” lui-même suivi d’une “expression” - ...
  12. Parser (Analyse syntaxique) Les cas particuliers - Précédence 2 +

    3 * 4 ⇒ (2 + 3) * 4 vs 2 + (3 * 4) - Association (gauche / droite) 2 ^ 3 ^ 2 ⇒ (2 ^ 3) ^ 2 vs 2 ^ (3 ^ 2)
  13. Abstract Syntax Tree (Arbre syntaxique abstrait) L’AST est une représentation

    du code sous la forme des noeuds d’un arbre. Exemple: Un “if / else” sera représenté par un noeud “ConditionalNode” (ou “TernaryNode”) qui stockera lui-même 3 autres noeuds: • La condition à évaluer (“AbstractNode”) • Le noeud à exécuter si la condition est vraie (“BlockNode”) • Le noeud à exécuter si la condition est fausse (“BlockNode”)
  14. Interpréteur Il va évaluer nos noeuds à partir de la

    racine, en se déplaçant dans l’arbre
  15. Interpréteur Les pièges: - Gestion du “flux de code”: -

    break / return / goto - La gestion des variables - portée des variables / scopes
  16. Gagner du temps ;-) hoa/compiler => compilateur de compilateur →

    Remplace le Lexer et le Parser par un fichier de définition de la grammaire.
  17. Aller plus loin ? Optimiser l’AST - Suppression du code

    mort - Résolution des expressions statiques - 5*60 => 300 - Suppression des variables inutiles - echo ‘salut’;
  18. Aller plus loin ? Ne pas parser plusieurs fois le

    même code: • Serialization de l’AST • Compilation dans un autre langage (ex. générer du code PHP) • Générer un bytecode exploitable par une machine virtuelle ◦ PHP / Opcache ◦ Java ◦ ...
  19. Aller plus loin ? Prévoir un système d’extension: - Nouveau

    mots clés (ou tag) - ex. Balises Twig - Nouvelles fonctions - ex. Fonctions ExpressionLanguage - Outils de debug ou profiling - ex. XDebug / Blackfire
  20. Quelques parsers en PHP https://github.com/iamluc/script Interpréteur Lua-like (fait maison !)

    https://github.com/nikic/PHP-Parser Parser PHP https://github.com/symfony/expression-language Interpréteur simple et extensible, qualité Symfony https://github.com/hoaproject/Compiler Compilateur de compilateur