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

Derniers journaux de Salagnac :

Journal : Astuce pour compiler du C à la volée

Posté par Salagnac () le 06 août 2003
Cher journal. Je ne sais pas comment poster une astuce dans linuxfr alors je m'adresse à toi. Voilà comment programmer en "script C" (compilé à la volée). C'est suffisament rustique pour passer n'importe où (par exemple, dans mon école, ya des A.I.X. de la guerre 14... alors ruby, tu oublies), et c'est vraiment pratique.
#!/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ête
ensuite 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).  

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.

Re: Astuce pour compiler du C à la volée

Posté par shelton2 (page perso, ) le 06/08/2003 à 18:11. (lien). Évalué à 3.

Tu peux poster une astuce sur: http://linuxfr.org/tips/submit.html(...)

tcc

Posté par free2.org (page perso, ) le 06/08/2003 à 18:50. (lien). Évalué à 3.

"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

Posté par Boa Treize (page perso, ) le 06/08/2003 à 21:01. (lien). Évalué à 2.

#!/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

Posté par Damien Metzler () le 07/08/2003 à 08:20. (lien). Évalué à 3.

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

Posté par MrTout (page perso, ) le 07/08/2003 à 09:25. (lien). Évalué à 2.

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

Posté par Wallou Wally () le 11/02/2004 à 15:10. (lien). Évalué à 1.

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");

Revenir en haut de page