Derniers journaux de Salagnac :
- [23/05@13:05] Fête des mères
- [09/05@08:04] Poster une astuce
- [23/04@09:01] Nouveaux utilisateurs
- [28/03@13:26] Je ne comprends rien
- [28/03@13:24] rien
Journal : Astuce pour compiler du C à la volée
Posté par Salagnac () le 06 août 2003#!/bin/bash total_lignes=`cat $0 | wc -l` ; ligne_arob=`grep "@""@" -m 1 -n $0 | cut -f1 -d:` cat $0 | tail -$[ $total_lignes - $ligne_arob ] > /tmp/cs.$$.c gcc -Wall -o /tmp/cs.$$ /tmp/cs.$$.c && /tmp/cs.$$ $* ; rm /tmp/*$$* ; exit @@ fin de l'en-têteensuite on met un fichier C des familles (avec main(), et tout), on enregistre ça (j'ai pris l'habitde de nommer les fichiers avec le suffixe .cs), on chmod +x et roulez jeunesse (les arguments passent, ça peut se lancer en démon, tout et tout). Si il y a des gens que ça intéresse (vous êtes tordus !) je peux détailler le fonctionnement de la chose (c'est simple en réalité).
> Lire le journal (21 commentaires, moyenne: 1,5).
Re: Astuce pour compiler du C à la volée
Tu peux poster une astuce sur: http://linuxfr.org/tips/submit.html(...)
tcc
"tiny c compiler" est fait pour ça (et compile très très vite)
y'a aussi de vrais interpréteurs C
-
[^]Re: tcc
Posté par Salagnac () le 06/08/2003 à 19:01. (lien). Évalué à 1.Justement, c'est en voyant une article sur tcc que j'ai eu envie de faire un bricolage qui aie les même fonctionalités mais qui soit portable.
Si tu te balades de machine en machine avec tes scripts, c'est bien quand l'interpréteur est standard (ici, avec gcc, bash, grep, cut, on reste en famille)-
[^]Re: tcc
Posté par free2.org (page perso, ) le 06/08/2003 à 20:44. (lien). Évalué à 2.je crois que tcc est tellement petit que tu peux facilement le mettre sur une disquette avec tes scripts ou le télécharger très rapidement
mais bon je concois que sur certaines machines paranoiaques on puisse pas (mais elles interdisent peut-etre de lancer gcc aussi non ?)-
[+] [^]Re: tcc
Posté par Salagnac () le 06/08/2003 à 22:13. (lien). Évalué à -1.A l'école où je suis (l'Ensimag) on utilise des terminaux X et des gros serveurs unix multi-utilisateurs. Il y a une dizaine de machines d'architectures variées (Sun, IBM..) pour peut-être 500 élèves et je pense qu'aucune ne comporte de lecteur de disquette...
Par portabilité je n'entendais pas transportabilité car là, une disquette roulaize ; mais plutôt foncionnement transparent sur plusieurs architectures, plusieurs systèmes...
(Quant à la paranoïa, c'est une autre affaire. Les gens qui veulent sécuriser sérieusement un ordinateur installent Windows 2000 dessus, avec la gestion des droits poil aux bras)-
[^]Re: tcc
Posté par Boa Treize (page perso, ) le 07/08/2003 à 11:37. (lien). Évalué à 1.Mais non, ils installent OpenVMS.
-
-
-
Bash
#!/bin/bash
Bash fonctionne sur des AIX de la guerre de 14 ?
#! /bin/sh ce serait pas plus portable ?
-
[^]Re: Bash
Posté par Salagnac () le 06/08/2003 à 22:06. (lien). Évalué à 1.$[ $total_lignes - $ligne_arob ]
et j'avais pas envie de me plonger dans awk. mais ça doit pas être insurmontable... (et oui, bash fonctionne ;-)-
[^]Re: Bash
Posté par Pascal Terjan (Jabber id, page perso, ) le 07/08/2003 à 07:07. (lien). Évalué à 3.`expr $total_lignes - $ligne_arob` ou dans le genre ?
-
Re: Astuce pour compiler du C à la volée
J'ai une autre version qui marche avec sh et en plus c plus cours ! (Ne pas oublier le . à la fin du code source ;)
#!/bin/sh
cat <<-. >/tmp/cs.$$.c && gcc -Wall -o /tmp/cs.$$ /tmp/cs.$$.c && /tmp/cs.$$
$*; rm -f /tmp/cs.$$*
#include <stdio.h>
#include <stdlib.h>
int main(void){
printf("Hello World\n");
return 0;
}
.
-
[^]Re: Astuce pour compiler du C à la volée
Posté par Damien Metzler () le 07/08/2003 à 08:28. (lien). Évalué à 2.pardon, il faut lire :
cat <<-. >/tmp/cs.$$.c && gcc -Wall -o /tmp/cs.$$ /tmp/cs.$$.c && /tmp/cs.$$$*; rm -f /tmp/cs.$$*
sur une seule ligne ;)-
[^]Re: Astuce pour compiler du C à la volée
Posté par Salagnac () le 07/08/2003 à 08:53. (lien). Évalué à 1.Je te tire ma révérence. C'est exactement ce que je voulais faire, en plus beau, plus élégant, tout ça...
D'ailleurs ça marche même sans le point à la fin du fichier puisque de base, le cat s'arrêtera sur EOF.
Par contre il y a un problème car le fichier lui-même se fait passer à la moulinette d'interprétation du shell :
printf("%d args $*\n",argc);
for(i=0;i<argc;i++)
printf("arg %d: %s\n",i,argv[i]);
affichera les arguments du programme deux fois... (mais ça doit pas être grand chose à modifier)
Merci beaucoup en tous cas (ta solution est adoptée !)-
[^]Re: Astuce pour compiler du C à la volée
Posté par Damien Metzler () le 07/08/2003 à 09:12. (lien). Évalué à 1.De rien, c'est juste que je trouvais cette idée marrante... après l'implémentation c'est une histoire de goût !
En tout cas l'idée de départ est bien sympa !
A+
-
-
Re: Astuce pour compiler du C à la volée
Bon, pour faire plus simple :
#!/bin/sh
tail +3 $0 >/tmp/cs.$$.c && gcc -Wall -o /tmp/cs.$$ /tmp/cs.$$.c && /tmp/cs.$$ $*; rm -f /tmp/cs.$$*; exit
#include<stdio.h>
int main(int argc, char** argv) {
if (argc <= 1)
puts("Hello Word!");
else
printf("Hello %s!\n", argv[1]);
return 0;
}
le truc c'est le '+' de tail qui simplifie bien les choses. Sinon c'est vraiment se casser la tête car le C n'est pas un magnifique langage de script (c'est plus un macro-assembleur)
-
[^]Re: Astuce pour compiler du C à la volée
Posté par Salagnac () le 07/08/2003 à 09:52. (lien). Évalué à 1.Parfait. Merci beaucoup (merci à tous). Je crois que là c'est le summum : plus aucun problème d'interprétation, un en-tête lisible, que du bonheur (c).
Le C comme langage de script: tu fais comment toi quand, en milieu hostile, tu veux faire un filtre (pour les pipes) qui fasse la moyenne d'une colonne de chiffres ? (le tout en trois minutes chrono) et bien moi je trouve que ça c'est lisible (bien plus que du perl... que je ne sais d'ailleurs pas programmer, poil aux pieds) :int main() { float total=0 , compte=0 , val=0; while(scanf("%f",&val) >0) { total += val; compte ++; } printf("%f\n",total/compte); }-
[^]Re: Astuce pour compiler du C à la volée
Posté par MrTout (page perso, ) le 07/08/2003 à 10:24. (lien). Évalué à 1.en perl c'est un truc du genre
perl -e 'while (<>) {$s+=$_}; print $s;'
en ruby c'est sans doute
ruby -e 's=0; $stdin.each{|l| s+=l.to_i}; print s'
Voila :)-
[^]Re: Astuce pour compiler du C à la volée
Posté par MrTout (page perso, ) le 07/08/2003 à 10:34. (lien). Évalué à 1.en bash c'est
n=0; while read a; do n=$(($n+$a)); done; echo $n-
[^]Re: Astuce pour compiler du C à la volée
Posté par Salagnac () le 07/08/2003 à 11:17. (lien). Évalué à 1.Sauf que je veux faire la moyenne ici, pour faire la division flottante bash c'est pas l'extase. (et je parle même pas de faire des trucs plus compliqués.)
Quant à Ruby et Perl je ne parle aucun de ces deux langages, et (je veux pas troller) je n'ai l'intention d'apprendre ni l'un ni l'autres (pour diverses raisons, respectivement)
Alors C roulaize ; et en plus c'est super puissant (p/r à bash en tout cas) et lisible.
Mais j'aime bien le lego technique alors les one-liners de tous langages me plaisent tout le temps. (PS: comment on dit one-liner dans la langue de Molière ?)-
[^]Re: Astuce pour compiler du C à la volée
Posté par MrTout (page perso, ) le 07/08/2003 à 11:32. (lien). Évalué à 1.moi je traduirai par "en une ligne".
Ah oui, tiens, j'ai cru que c'étais la somme pas la moyenne. Ça m'apprendra à lire trop vite.
Mais C pèche surtout pour la gestion de chaines, des listes, des tables de hashages, des classes, des fonctions lambdas et du méta-niveau reflexif... Enfin, ça dépend sûrement de l'utilité qu'on en a je pense, et généralement moi j'ai besoin de tout ça pour mes scripts (au moins des 3 premiers, le reste c'est pour la frimefacilité de programmation inhérente).-
[^]Re: Astuce pour compiler du C à la volée
Posté par Salagnac () le 07/08/2003 à 12:15. (lien). Évalué à 1.<second degré> Rien ne t'empêche t'appliquer cette méthode de compilation à la volée à C++, voire à Java... </second degré>
Plus sérieusement, ce que j'aime bien dans C/java/php (je n'aime pas le C++ sauf dans l'api BeOS mais c'est une autre histoire) c'est qu'on n'a pas à ré-apprendre à coder à chaque programme/script/page dynamique : la syntaxe est la même, claire, lisible, standard depuis 30 ans (et moi j'ai 20 ans) et donc mes personalisations d'emacs sont les mêmes aussi.
-
-
-
-
-
Re: Astuce pour compiler du C à la volée
Voici l'adaptation pour des tests Java
de l'astuce de Salagnac (voir http://linuxfr.org/tips/197.html(...)). Cette adaptation permet de faire des test en Java sans avoir à compiler puis interpreter, à la JIT shell.
===( Fichier "jit.sh" )===
#! /bin/sh
cat > /tmp/Test.java << EOF
public class Test {
public static void main(String[] args) {
EOF
tail +2 $1 >> /tmp/Test.java
cat >> /tmp/Test.java << EOF
}
}
EOF
javac /tmp/Test.java
rm -f /tmp/Test.java
java -classpath /tmp Test
rm -f /tmp/Test.class
===( Fin fichier "jit.sh" )===
Ensuite à chaque fois que l'on veux tester quelque chose en java en shell il suffit de executer un fichier sh du type :
#! /bin/sh [ABSOLUTE_PATH_TO]/jit.sh
System.out.println("#Test");

Les journaux sont destinés à des informations qui ne sont pas suffisamment intéressantes
pour être validées en dépêche (sinon n'hésitez pas à proposer votre information en
dépêche), qui sont sans rapport avec Linux ou le libre, ou simplement pour donner votre
avis. Si vous désirez poser une question, merci d'utiliser 
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.