Origines
Je joue avec javascript depuis les premières versions de Spidermonkey une des premières api en C par Mozilla. Et avec Typescript depuis les toutes premières versions. La carte sur laquelle je travaille (que j’ai conçue) tourne avec un esp32-s3 (devkit-c). Elle intègre plus de 25 E/S diverses (uart/i2c/io expander/onewire/wifi/réseau filaire…) et j’utilise un afficheur Nextion pour l’interface utilisateur.
Problématique
En général, le développement sur esp32 se fait en C/C++ grâce à IDF ou Arduino L’idée d’un interpréteur n’est absolument pas nouvelle et je voulais tester quelques pistes.
Parmi les pistes évaluées:
-
micro-python. Venant du C, python manque pour moi singulièrement d’accolades (humour) D’autre part, l’extensibilité de micro-python n’est possible qu’avec des extensions en C et il faut recompiler complètement le noyau pour en ajouter.
-
Mongoose Super librairie mais soit GPL2 soit payant (par device/famille de device/société)
-
v7 Cesanta licence gpl / commerciale
-
Espruino licence mplv2
-
DukTape licence mit Javascript ecma5 : manque de classes
-
Jerryscript licence apache v2 ecma5.1
-
MuJs licence free ecma262
-
Quickjs licence libre es2020
Ayant déjà utilisé QuickJS sur d’autres projets, il était naturel pour moi d’expérimenter son utilisation sur ESP. Créer de nouveaux objets et les exposer est ultra simple.
Infrastructure
Afin de réaliser ceci, j’ai créé un noyau (corejs) qui expose tous les périphériques au javascript (je suis développeur C/C++ depuis plus de 30 ans). Ensuite, j’ai développé mon application en javascript.
Le code est stocké dans une partition de l’esp
- soit sous forme claire
- soit sous forme bytecodée
Développement
Le développement est réalisé sur VSCode. Il est possible de travailler en Javascript ou TypeScript (compilé vers JS). Pour les connaisseurs, les interfaces sont décrites par un fichier index.d.ts ce qui permet l’assistance intelligente dans le code. J’ai créé un débugger qui me permet d’éxecuter le code en pas à pas sur l’esp (on pourrait meme débugger en remote sur le net). J’ai créé un webserver sur l’esp qui me permet d’éditer en live le Javascript sur l’esp. Le système embarque de l’OTA pour le noyau, de l’OTA pour le code JS et de l’OTA pour l’UI.
Gain
Le gain est remarquable, en effet:
- on se concentre sur l’applicatif et le javascript est vraiment adapté pour ça (et laisse le gros du travail au core en C)
- pas de compilation
- le temps d’upload du javascript est négligeable
- le debugging est simple
-
Compilation d’une modification mineure: * compilation du C: 9s link: 10s upload: 24s total: 43s
-
Modification du code en javascript (hors edition du code en live): * compilation: 0 link: 0 upload: 8s total: 8s Gain 5.4x
Gain ++
Le test est vraiment simple à mettre en œuvre sur ce genre de plateforme. Le développement en javascript est beaucoup plus simple qu’en C/C++ Simplification d’écriture donc de maintenance Par exemple faire varier la led comme un battement de cœur en tâche de fond prend plusieurs bonnes dizaines de lignes en C ; ceci se peut se faire en une ligne en JS.
Pour finir
Deux choses:
-
Pour l’instant je n’ai implémenté que le minimum pour un esp-s3. La librairie va s’étoffer (mqtt, websockets, display…)
-
RP2040 est dans les tuyaux
-
Un émulateur sous windows aussi
-
Pour rigoler un JIT sur quickjs ?
90% de ce que je connais sur le développement, je le dois à des solutions open sourcées aussi j’espère pouvoir proposer cette lib en open source moi aussi. (peut être que certaines parties comme le debugger ou l’IDE seront en mode payant)