Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Liens connexes

Dépêche modérée par

Dépêche éditée par

Développeur : CodeWorker 4.4

Posté par Ontologia (page perso, ). Modéré le 25 novembre 2007.
Technologie
CodeWorker est un outil d'automatisation du développement, sous GNU LGPL. Cet outil se propose d'être un générateur de code universel, capable non seulement de générer du code, mais de générer celui-ci en l'injectant dans du code existant.

Cordeworker se matérialise comme un interpréteur d'un langage de script intégrant la possibilité de définir une grammaire BNF du langage à parser ou du source cible dans lequel on veut injecter du code. La génération se décrit à l'aide de modèles de génération (template-based scripts), décrivant le remplissage d'un graphe de parsing pendant l'analyse. Ce graphe pourra ensuite être manipulé.

Sa force réside dans sa souplesse totale : on peut lui faire lire un source en C++ ainsi que des information en XML, pour injecter du code dans du Java. Partant de là, et de grammaire BNF decrivant XML, Java, etc... on peut imaginer toutes sortes d'outils. Notons le mode JEdit prenant en charge la coloration syntaxique pour CodeWorker.

CodeWorker est donc un outil puissant, stable, qui a sûrement besoin de contributions comme des scripts pour analyser toutes sortes de langages et ainsi permettre de nombreuses manipulations !

> Lire la dépêche (56 commentaires, moyenne: 2,4).  

Le langage de script est un petit langage adapté à la manipulation de graphe.

La définition de variable est assez simple et non typée :

local nombre = 26.7;
local chaine = "vingt six virgule sept";
local booleen = (nombres == chaines);

local dictionnaire;
insert dictionnaire["Requin"] = "Petit poisson marinant dans l'huile";
insert dictionnaire[3.141592] = "Premiers chiffres de Pi";

local jouet;
insert jouet.categorie = "voiture";
insert jouet.alimentation = "piles";
insert jouet.alimentation.quantite = 4;
insert jouet.alimentation.taille = "LR6";
insert jouet.nombrepiece["aileron"] = 1;


La syntaxe, se veut proche des standard C/Java avec une teinte langage de script sans typage.

local especeAnimale;
insert especeAnimale["Mireille"] = "abeille";
insert especeAnimale["Camille"] = "chenille";

function traiteespeceAnimale(esp : node) {
foreach i in esp {
if first(i) {
traceLine("premier élément = '" + i.key() + "'");
} else if last(i) {
traceLine("dernier élément = '" + i.key() + "'");
}
traceLine("clé = '" + key(i) + "' valeur = '" + i + "'");
}
return false;
}


esp : node signifie passage par référence, le comportement par défaut étant de passer par valeur.


Le grand intérêt de ce langage est de permettre de définir une grammaire BNF pour récupérer des données :

nombre ::= #ignore(blanks) flottant | entier;
entier ::= ['-']? ['0'..'9']+;
flottant ::= entier '.' entier ['e' entier]?;
identifiant ::= [lettre | '_'] [lettre | '0'..'9' | '_']*;
lettre ::= 'a'..'z' | 'A'..'Z';

l'intérêt étant ensuite de pouvoir définir des règles de générations :

flottant ::=
#!ignore
entier '.' #continue !'-' entier
[
'e' #continue
entier:iExposant
=> traceLine("valeur de l'exposant = " + iExposant);
]?

Des manipulations beaucoup plus complexes sont décrites dans le tutoriel disponible sur le site Developpez.com

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Parser du C++

Posté par loufoque () le 25/11/2007 à 18:18. (lien). Évalué à 8.

Parser du C++ n'est pas trivial. En particulier, la syntaxe n'est pas LALR et l'analyse sémantique doit se faire en même temps.
Je doute qu'un tel outil en soit capable, étant donné que même le fameux Doxygen n'a qu'un parser C++ approximatif.

...

Posté par Matthieu C () le 25/11/2007 à 19:46. (lien). Évalué à 10.

CodeWorker est donc un outil puissant, stable, qui a surement besoin de contributions comme des scripts pour parser toute sortes de langages et ainsi permettre de nombreuses manipulations !
C'est bien beau, mais j'ai du mal à voir des applications pratiques.

L'article aurait pu cité des exemples concret d'utilisation.

Meta-object protocol?

Posté par Damien (page perso, ) le 25/11/2007 à 21:06. (lien). Évalué à 4.

Toute cette machinerie de parsing, de templates et de manipulation d'AST illustre bien que tout ça fonctionne à un mauvais niveau de représentation des données : celui de la syntaxe au lieu du modèle métier. Quelle est l'avantage de CodeWorker par rapport aux parsers habituels (yacc, antlr, packrat…) ?

D'ailleurs il existe un outil de ce genre appelé Ometa, inspiré d'un autre qui date des années 70 : http://www.cs.ucla.edu/~awarth/ometa/
Voir aussi une implémentation de brainf*ck avec Ometa, pour illustrer le bidule : http://www.swa.hpi.uni-potsdam.de/tutorials/cola/index.html

Sinon pour la manipulation de programmes qui semble l'utilité première de CodeWorker, rien ne vaut un langage réflexif. En Smallltalk pour rajouter programmatiquement une variable d'instance à une classe on fait Foo addInstVarName: 'baz'. Pour ajouter une méthode à une classe :

String compile: 'pan ^ self = ''coin'' ifTrue: [''argh''] ifFalse: [''mm po mal'']'

Et baste, le code est visible dans l'IDE, compilé et committable. Si il y a besoin de faire des traitements plus compliqués l'arbre syntaxique abstrait est dispo, et c'est le même que les refactorings et le compilateur manipulent. En Lisp c'est pareil (voire plus puissant) mais je laisse les experts préciser.

Et pour debugger le code généré?

Posté par reno () le 26/11/2007 à 09:03. (lien). Évalué à 7.

Il y a quelque-chose?

Non parce que c'est toujours le même problème: la génération de code est toujours vendue comme quoi on va beaucoup plus vite pour produire du code, en oubliant commodément de mentionner qu'on va ensuite beaucoup lentement pour debugger le code généré..

Revenir en haut de page