[Linuxtrent] Re: domanda di C

  • From: Matteo Ianeselli <m.ianeselli@xxxxxxxxxxx>
  • To: Mailing list linuxtrent <linuxtrent@xxxxxxxxxxxxx>
  • Date: Wed, 15 Dec 2004 14:58:49 +0100

Il giorno mer, 15-12-2004 alle 10:56 +0100, Lele Gaifax ha scritto:

> No, non c'è nulla nella libreria C che interpreti e risolva
> 'espressioni' simboliche. Ci sono dozzine di librerie esterne, e non è
> difficile scriverne una tredicesima, armato di bison e un po' di
> tempo. 

Ci sono diverse strade:

1) Farsi il parser delle espressioni con lex+yacc (o bison).

   La sfiga è che invariabilmente finisci spesso col doverlo estendere
   per includere condizionali, variabili, minchiate varie, e da un
   "semplice" parser di "semplici" espressioni ti ritrovi a manutenere
   un piccolo interprete vero e proprio.

2) Agganciare un interprete esistente.

   Senza scomodare Perl/Python/Tcl, ce ne sono di piccoli e
   interessanti, vedi ad esempio il TinyTcl (60K di libreria):

   http://tinytcl.sourceforge.net/

3) Se i calcoli sono da fare molto velocemente, c'è chi genera
   codice sorgente al volo, chiama al volo un compilatore e
   ne fa una libreria shared che poi manipola con dlopen() e
   soci. 

   I caveat son due: 

   1) ti ci vuole tutta la toolchain esterna (compilatore, linker,
      etc.). O c'è già sul sistema e lo metti come prerequisito,
      o te la porti dietro tu.

      Senza scomodar il GCC, c'è ad esempio TCC
      (http://www.tinycc.org/), che è piccolo e svelto
      a compilare, ma produce codice solo per x86 e praticamente
      senza ottimizzazioni

   2) Solo perchè il codice compila non vuol dire che poi
      non vada in crash, tirandosi dietro anche il codice
      chiamante (a meno di fork() e IPC via pipe/socket/shm), 
      e qui gli interpreti hanno decisamente dei vantaggi 
      (meccanismi di gestione degli errori)



-- 
  |   \    \  | ___|_  |_  |  ianezz a casa sua... :-)
  |  _ \  | \ | _|    /   /   Verba volant, scripta
 _|_/  _\_|  _|____|___|___|  manent, data corrupted


--
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: