Les Plaisirs de la Programmation visuelle (ou : comment "dessiner" vos codes)
Caen, Novembre 2016
Jerzy Karczmarczuk
Ce diagramme est un programme (XCos). Je veux vous montrer comment coder de cette manière, par l'assemblage d'un "circuit" composé de "boîtiers" connectés.
Pourquoi?... L'essentiel de toute création logicielle (du "coeur" d'informatique...) est l'écriture des programmes : pour la simulation, analyse des données économiques ou des flots de communication, synthèse d'images / musique / animation, etc.
On les écrit dans un langage de programmation, compréhensible par le système d'un ordinateur, qui le convertit en code exécutable. Il y a plusieurs centaines de langages. Chez nous, on en enseigne environ 6 (+ quelques spécialisés).
Le "sens" des programmes est similaire dans ces langages : il faut transmettre les données (textes, nombres, images, sons) aux modules de traitement, qui les changent, combinent, et passent ailleurs. Depuis 80 ans les ingénieurs dessinaient cette transmission sous forme graphique, avant d'écrire le code.
On a découvert, que les diagrammes décrivant les programmes, peuvent être "compris" et exécutés par les ordinateurs ! La "programmation visuelle" est née, et des dizaines de systèmes ont vu le jour ; les écoles d'ingénieurs les enseignent souvent.
Paquetages comme Matlab / Simulink ou Scilab / XCos.
Le système de noeuds dans Blender (synthèse d'images) pour la texturation (décoration des surfaces).
Assemblage des paysages décorés dans Terragen.
Simulation des instruments musicaux et la synthèse des sons/mélodies dans les logiels comme MAX ou PureData.
... et encore plusieurs dizaines...
Ce sont des réalisations logicielles de l'idée d'objets connectés.
On raisonne en terme de "choses" plutôt que de "commandes"...
Exemple de simulation (XCos)
Un ressort , ou un autre mécanisme vibrant satisfait les équations de Newton, l'accélération \(a = \dot{v}\) (la dérivée de la vitesse) est proportionnelle au déplacement \(x\) dont la vitesse est la dérivée : \(\r v = \dot{x}=\Delta x/\Delta t\), et inclut la friction, proportionnelle à la vitesse : \(\r a = -kx -f v\). Le coefficient \(\r k\) détermine la fréquence, et \(\r f\) : le freinage.
Si on a la dérivée, \(v\), on en reconstruit le déplacement par l'intégration : \(\g x = \int v\), et les procédures d'intégration peuvent être placées dans des librairies. Les paquetages de simulation les exploitent comme des "blocs" prêts à l'usage.
On convertit l'équation en : \(\g v = -k\int x - f x\). Il suffit de dessiner et paramétrer le diagramme et y ajouter des dispositifs d'affichage des résultats sous forme graphique.
Voici notre modèle [Src/oscil.xcos, expérience interactive].
Les lignes dénotent les transferts des séquences de données, pompées une par une à chaque "tick" de l'horloge (synchronie). Une boucle dans un langage classique, devient ici une boucle dessinée. Les sorties animées ici sont : un graphique du \(\r x\) comme fonction du temps, et le graphique 2-dimensionnel "\(\r v\) contre \(\r x\)".
D'autres blocs réalisent des conditions, par ex.:, fonctions utilisateur, stockage, etc.
Des véritables éléments des programmes habituels...
La carrière de ce style a été facilitée par ses valeurs pédagogiques. On voit les dépendances des données et leurs séquences (flots), on raisonne en terme de "choses", (objets), les codes deviennent plus lisibles. Mais ce style : visuel / dataflow demande beaucoup d'expérience et de discipline !
Le système Scilab/XCos reste largement académique, mais les commerciaux : Matlab/Simulink et Labview servent à piloter des grands équipements industriels, et engendrent beaucoup d'argent !
Nous allons parler un peu de l'usage des techniques visuelles dans le domaine de multi-média...
Musique synthétique et Pure Data de Miller Puckette
Observez que un tel style d'assemblage des programmes n'est pas forcément le meilleur dans toutes les circonstances, mais il est particulièrement adapté au "pompage" des séquences de données : signaux d'une "boîte de traitement" vers l'autre, comme les vrais boîtiers électroniques (ou mécaniques, hydrauliques, etc.).
En particulier, ceci est reconnu comme adapté à la musique électronique...
Un synthétiseur a des déclencheurs (le clavier), oscillateurs (générateurs du son), filtres, réverbérateurs, mixeurs, transposeurs, etc.
Exemple dynamique (YouTube)
L'amas de connections peut être effrayant...
... Mais on peut exploiter le modèle d'objets communicants, clients et serveurs qui leur envoient des messages "à distance". On parle aussi de communication par des sockets.
Voici un générateur d'un simple son, ainsi que sa récupération "distante" par la carte sonore, et l'affichage du graphique de cette onde comme un bonus supplémentaire.
J'y ai ajouté des boutons qui allument et éteignent le son et le graphique. (Patches patches/sendrec et sendrec1)
Synthèse d'images 3D avec Blender et texturation avec Nodes
Blender est un de plus populaires – et libre – créateurs des scènes et des animations 3D.
Les animations, comme la simulation (les trajectoires sont des séquences des données géométriques engendrées dans le temps) s'adaptent bien à ce style de codage, mais nous aborderons un autre schéma : la génération et transformation d'images. Ici, les séquences de données sont des ensembles de pixels. Pas besoin d'horloge ; souvent les zones dans les images peuvent être traitées en parallèle (distribuées sur plusieurs processeurs).
Voici un de mes exercices en correction d'images : la restauration (imparfaite...) d'une photo abîmée par le temps...
Il fallait montrer comment on le fait. (Exp. : obibcor)
Cet amas de noeuds a l'avantage par rapport aux techniques de présentation "classiques" on voit que le canal Cyan a été détruit, on l'a remplacé par une couche synthétique (les imagistes sont des tricheurs intelligents), et un réglage cosmétique, final, améliore un peu le résultat. On peut facilement faire des expériences interactives (et amusantes) en classe.
L'exemple suivant montre comment on créé et transforme des matériaux qui décorent la surface des objets. [suzan.blend]
L'essentiel à retenir est : la mythique "efficacité" des programmes est accessoire. Le temps humain est considérablement plus précieux que celui du processeur. Maîtrisez d'abord les techniques qui facilitent la compréhension et le partage des codes, et profitent des concepts humains, plutôt que la manipulation des données charabia de bas niveau.
Autres choses intéressantes...: Terragen
Création des terrains artificiels, avec l'atmosphère, l'eau, des forêts, etc. Contrôlable par un réseau de "noeuds". [Tgen/First] Hiérarchie d'objets dépendants, mais gére aussi l'animation.
Microsoft Visual Programming Language
(Dans MS Robotics Studio. Gratuit, pour Windows. Très riche.)
Ceci [VPLTutorial41]est le pilotage d'un robot...
D'autres choses?
Cherche, et tu trouveras...
Le langage visuel Scratch (utilisé dans l'enseignement) disponible aussi sur Raspberry PI. Voir aussi Blockly.
Etoys, un autre environnement visuel pour les enfants, né du Smalltalk/Squeak.