Salut à toi Journal !
Je t'écris pour te poser une question "technique", limite philosophique.
Suite à ce journal : http://linuxfr.org/~Montaigne/24628.html, je me suis demandé comment pourrait faire une application sous linux en user-space, pour auto-générer son code. Je cherchais une solution efficace et performante (en c par exemple).
La première solution à laquelle j'ai pensé est relativement sale : j'écris du code dans un .c (fwrite...), je le compile avec un appel à gcc (system...) sous forme de .so que j'ouvre avec dlopen.
En deuxième solution, je voyais "smasher" la stack de mon propre programme, mais là je trouve ça... inqualifiablement affreux.
Cher lecteur, connais-tu une solution à cet épineux problème ? A noter que je n'y vois pas d'intérêt pratique, c'est juste pour la culture.
Merci !
# en Java
Posté par Nicolas Dumoulin (site web personnel) . Évalué à 4.
Au delà des solutions de script, tu peux compiler une classe à partir d'une chaîne de caractère et la charger par la suite. Un exemple :
http://www.javaworld.com/javatips/jw-javatip131.html
Bon courage pour la suite :-)
# Les gouts et les couleurs
Posté par Sébastien Koechlin . Évalué à 4.
Nous n'avons pas les mêmes gouts.
Le développement en C est maitrisé et connu; maintenable, on trouve des compilateurs pour pratiquement toutes les architectures.
Je trouve particulièrement sale un mécanisme qui génèrerait directement du code binaire en mémoire; qui devrait être exécuter. Ca oblige à jouer avec les segments de données et de code; à contourner le résolveur de lien; a mettre tout un tas d'artifice qui vont être propre à l'architecture et à l'OS, sans garantie même d'une version à l'autre.
En plus de cela, ça oblige à intégrer au minimum un assembleur et un résolveur de liens directement dans ton programme, tache qui sera mal fait par rapport à un assembleur maintenu.
Bref, une vrai usine à gaz.
[^] # Re: Les gouts et les couleurs
Posté par ribwund . Évalué à 7.
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 2.
Ce commentaire a été supprimé par l’équipe de modération.
# a la volé...
Posté par fabien . Évalué à 2.
si tu veux faire des choses assez simple et determiné, tu peu imaginer ton propre language et ta propre pile; ton programme ne serait qu'un interpreteur.
exemple typique : un emulateur de calculatrice (je pense a une hp par exemple).
imagine ton programme (un interpreteur d'un language simple tel que le RPN), il attends des evenements ou il interagit avec je ne sais quoi...
et quand il recoit certains evenement, il ponds dans la pile des instructions...
quand je parle de pile, je ne parle pas de la pile systeme, je parle d'une pile emulé par une classe en C par exemple avec des pop() drop() et companie.
et ensuite, il interprete les instructions de la pile (là c'est important d'avoir un language simple et determiné, voir specifique)
voilà, ca peut être un peu lourds, mais ce qui est bien c'est que l'execution du code à la volé se fait à l'interieur de l'interpreteur et sans bidouiller la stack "systeme"...
mais tout depends des actions que tu souhaite faire faire à to ncode generé à la volé (par exemple si c'est un truc hyper generaliste, il faudra definir sans doute pas mal d'instruction). c'est pas utilisable dans toutes sorte de situation, et demande pas mal de boulot.
[^] # À la volée...
Posté par Christophe Chailloleau-Leclerc . Évalué à 1.
[^] # Re: À la volée...
Posté par Christophe Chailloleau-Leclerc . Évalué à 2.
Les voici :
Perl : http://perl.enstimac.fr/DocFr/perlembed.html
Python : http://www.python.org/doc/ext/embedding.html
Ruby : http://www.sourcepole.ch/2004/1/21/embedding-ruby-in-c
QtScript : http://doc.trolltech.com/4.3/qtscript.html
Ok... Je vois... Les liens sont "découverts" automatiquement, il ne faut pas mettre les balises... J'essayerais de m'en rappeler ;-)
[^] # Re: À la volée...
Posté par Gabriel Linder . Évalué à 3.
[^] # Re: À la volée...
Posté par BAud (site web personnel) . Évalué à 1.
Plus d'éléments sur http://wiki.eagle-usb.org/wakka.php?wiki=SuggestionsLecteurL(...)
[^] # Re: À la volée...
Posté par fabien . Évalué à 3.
bon, ma solution c'est un peu le synrome "je réinvente tout tout seul" mais bon c'est une maladie courante en informatique ;)
Merci pour les liens sinon...
# Si j'étais un vrai homme ...
Posté par Anonyme . Évalué à 5.
Je bidouillerais gcc pour qu'il puisse avoir ses entrées sorties directement en mémoire, c'est a dire par exemple, de lui passez une chaine de caratère et qu'il te retourne un pointeur sur le code compilé écrit sur le tas (pas la peine d'aller péter ta pile :) ).
Le top du top serait d'avoir le code compilé en flux continu, avec une callback appelée a chaque fois qu'un sous arbre de l'arbre de compilation est terminé (par exemple, pour chaque fonction, lorsque tout est défini bien sûr). La blague c'est le link, qui sera ultra funky mais y'a vraiment moyen de se marrer.
Bon le truc c'est que les segments de code sont en lecture seule, et qu'à l'avenir en se verra de plus en plus souvent interdire l'exécution sur la pile (tant mieux) et sur le tas (un peu plus balot, mais c'est bien quand même). L'avantage de dlopen() et consorts, c'est que ca passe par des privilèges noyaux pour rajouter des segments de code.
(bon j'espère que j'ai pas dit de bêtises, mais je crois que non)
Pour ma part, entre un appel a gcc ou de l'écriture de code en mémoire, et même en général en informatique, la philosophie qui convient est "tu peux faire ce que tu veux, a partir du moment que tu le maîtrise et que tu peux le justifier, honnêtement"
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 2.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: Si j'étais un vrai homme ...
Posté par Matthieu Moy (site web personnel) . Évalué à 2.
# Mouais
Posté par Gabriel Linder . Évalué à 2.
Sinon il reste la possibilité de t'interfacer avec un interpréteur de script, comme dit plus haut.
[1] : http://pax.grsecurity.net/
[2] : http://www.grsecurity.net/
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 7.
Ce commentaire a été supprimé par l’équipe de modération.
# dynamique
Posté par Krunch (site web personnel) . Évalué à 3.
http://sourceware.org/libffi/
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
# Scheme
Posté par Axioplase ıɥs∀ (site web personnel) . Évalué à 7.
Bon, c'est pas très hype car ca marche depuis avant ta naissance. Néanmoins, si tu remplaces les S-expressions par du XML, ca fait tout de suite vachement plus cool, et ca marche aussi bien.
# tcc
Posté par Mildred (site web personnel) . Évalué à 2.
Il y a un module pour le langage lua qui l'utilise
désolée, pas le temps de développer
[^] # Re: tcc
Posté par Mildred (site web personnel) . Évalué à 6.
L'exemple : http://cvs.savannah.gnu.org/viewvc/tinycc/tinycc/libtcc_test(...)
[^] # Re: tcc
Posté par Mildred (site web personnel) . Évalué à -2.
L'exemple : http://cvs.savannah.gnu.org/viewvc/tinycc/tinycc/libtcc_test(...)
# Gnu Lightning
Posté par PenPen . Évalué à 3.
Reste à faire un parser pour produire du code dans leur format.
http://www.gnu.org/software/lightning/lightning.html
Cela dit, pourquoi tu veut compiler le code à la volée? Ce serait plus simple de prendre un truc comme lua, que tu peut binder assez facilement avec du c.
[^] # Re: Gnu Lightning
Posté par Val1472 . Évalué à 1.
J'ai un mauvais à priori concernant les performances d'une solution qui embarque du lua, du python ou du script en règle générale. Ca reste qu'un à priori. Un jour, je prendrais le temps de faire des benchs pour me faire une idée plus précise.
[^] # Re: Gnu Lightning
Posté par briaeros007 . Évalué à 2.
(temps de code).
Ensuite si ta fonction est appelé 15 millions de fois en une seconde, oui il est preferable de bien l'optimiser celle la;)
# lex et yacc
Posté par Joris Dedieu (site web personnel) . Évalué à 3.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.