PHPTour 2017 : TaguaVM

Au cours du PHPTour 2017, Ivan Enderlin nous a présenté un projet sur lequel il travaille en collaboration avec Julien Bianchi et Sébastien Houzé depuis février 2016 : TaguaVM, une machine virtuelle expérimentale pour le PHP.

Quoi de mieux que ses propres mots pour présenter l'outil :

L'objectif du projet Tagua VM est de fournir une VM PHP qui garantie un haut niveau de sûreté et de qualité en supprimant des larges classes de vulnérabilités, grâce à des outils appropriés comme Rust et LLVM.
Rust est un langage remarquable qui apporte des garanties fortes à propos de la sûreté de la mémoire. C'est aussi un langage très rapide qui rivalise avec C.
LLVM est une infrastructure de compilateur célèbre qui apporte de la modernité, des algorithmes à la pointe, des performances, une suite d'outils pour développeur etc.
Ce projet va résoudre trois problèmes en une fois :

    1. Fournir un niveau haut niveau de sûreté et de qualité en supprimant des larges classes de vulnérabilité, et ainsi éviter des coûts de bugs dramatiques ;
    2. Fournir de la modernité, une nouvelle expérience développeur et des algorithmes à la pointe de la recherche, donc des performances ;
    3. Fournir un ensemble de bibliothèques qui vont composer la VM et qui pourront être réutilisées en dehors du projet (comme le parseur, les analyseurs, les extensions etc.).

Il nous a été présenté qu'il y a plus de 500 vulnérabilités actuellement recensées sur le langage PHP dont une cinquantaine avec un score CVE (Common Vulnerabilities and Exposures) supérieur à 9 sur 10. Il s'agit notamment de corruption de la mémoire ainsi que d'erreurs dans les parsers. Il ne s'agit pas d'un soucis lié au PHP, les mêmes sont présents en Python ou Java.
Le réel soucis vient du fait qu'implémenter un tel langage est quelque chose de compliqué, que l'on peut s'interconnecter avec beaucoup de technologies exotiques et que le php est écrit en C et C++.

Tagua VM propose une grande qualité et sécurité en enlevant un grand nombre de classes de vulnérabilités ce qui supprime ainsi les bugs attenants.
De plus, Tagua apporte de la modernité et une nouvelle expérience de développement. Il s'agit, ou s'agira, de bien plus que d'une VM. Il s'agit d'un set de bibliothèques composant cette VM, il s'agit de parser, analyser, d'extensions qui peuvent être réutilisées en dehors de ce projet.

Architecture d'un compileur

Prenons l'exemple d'un :
echo 'hello', 'world';

Le front end

    analyser lexicalement, identifier chaque lemme de la commande;

[echo] -> ['hello'] -> [,] -> ['world'] -> [;]

    analyser syntaxiquement, vérifier la grammaire de la commande;

statement: ( echo | ... | ... ) ";"
echo : "echo" expression+ ","
expression : string | ... | ...
string : ...

    composer un arbre syntaxique des lemmes de la commande

Dans Tagua VM, la partie lexicale et syntaxique sont réalisées lors d'une même passe en s'appuyant sur un parser sûr et rapide, nom associé au projet Hoa\Compiler.

Le middle end

    transformer en MIR (middle intermediate representation)
    transformer ou vérifier le code (intégrité des données, supprimer les branches mortes, simplifier les boucles...)
    transformer en LIR (low intermediate representation)

Dans Tagua VM, l'arbre syntaxique correspond au HIR (high intermediate representation), le graphe de contrôle de flow associé au php simplifié forment le MIR ce qui devrait être "simplement" transformé en LIR.
Ceci n'est pas encore implémenté dans Tagua VM.
Cela peut être plus coûteux mais gagnera du temps pour lors de la transformation du MIR en LIR, les passes et optimisations seront plus simples ainsi que la gestion du cache. Le tout étant une question d'équilibre.

Le back end

"online" (exécutant le LIR directement ou le transformant en code natif, réaliser une compilation Just In Time)

"offline" (transformer le LIR dans un autre langage puis une compilé en Ahead Of Time, avant l'exécution ).

Par exemple, en PHP, nous avons la source qui est compilée en opcode pour être exécutée, c'est un exemple de JIT compilation.
Le Java part d'une source qui est compilée en bytecode avec une AOT compilation puis une exécution JIT plus tard.
Le Rust quant à lui part d'une source qui est transformée en IRs et il y a une AOT compilation qui permettra ensuite l'exécution.

Tagua VM a fait le choix de LLVM IR pour le LIR, le moteur d'exécution sera assuré par le moteur LLVM (actuellement MCJIT mais OrcJIT est à venir et enfin le débugger sera assuré par LLDB.

Pour conclure

Sur Tagua VM, leur optique est de mettre en avant la sécurité de leur outil, de proposer une suite de tests unitaires, d'intégrations, de documentations, testés sur MacOs, Linux Ubuntu et Windows. Tout est documenté.

Pour l'utilisateur, il n'y aura rien de plus à faire car ce sera à 100% compatible avec les spécifications du langage PHP et presque à 100% avec le moteur Zend. La question se pose (et Ivan précise que ce n'est pas un troll) sur le fait de dupliquer, ou non, les bugs du moteur Zend..
Les outils mis en place comprendront un serveur HTTP avec de grandes performances, un débugger puissant, des analyseurs poussés de mémoire, cpu, performances, énergie ainsi que la possibilité d'enregistrer et rejouer.
Actuellement, 47 plateformes sont compatibles avec Tagua VM. Ou plutôt, Tagua VM a ciblé 47 plateformes pour lesquelles il tourne.

Le modèle économique sera basé sur des interfaces graphiques supplémentaires facultatives et payantes, Tagua VM étant gratuit et sous licence BSD.

Si vous souhaitez aider cette équipe, plus que de faire des PRs, ils souhaiteraient que nous leurs partagions nos envies et frustrations actuelles.
Deux campagnes de levées de fonds seront également lancées pour démarrer une entreprise derrière Tagua VM.

Un commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *