Tiny C Compiler
Tiny C Compiler software | |
---|---|
Tiny C Compiler in esecuzione su Windows | |
Genere | Compilatore |
Sviluppatore | Fabrice Bellard |
Data prima versione | 2002 |
Ultima versione | 0.9.26 (15 febbraio 2013) |
Sistema operativo | Multipiattaforma |
Linguaggio | C linguaggio assembly |
Licenza | LGPL (licenza libera) |
Sito web | bellard.org/tcc/ |
Tiny C Compiler (noto anche come TCC, tCc o TinyCC) è un compilatore C per piattaforme x86 e ARM creato da Fabrice Bellard e distribuito sotto licenza LGPL. È un compilatore minimale, che si presta bene all'uso su sistemi lenti e con poche risorse di memoria e archiviazione. Nato per sistemi Unix-like, con la versione 0.9.23 (17 giugno 2005) gli è stato aggiunto il supporto a Windows.
Secondo la documentazione, TCC implementa interamente lo standard ANSI C (C89/C90),[1] buona parte dello standard ISO C99[2] e molte delle estensioni GNU C, tra le quali l'inserimento di assembly inline.
Caratteristiche
[modifica | modifica wikitesto]TCC ha alcune caratteristiche peculiari che lo differenziano da molti compilatori C:
- Ha dimensioni contenute (circa 100 KB per l'eseguibile del compilatore x86) e un'impronta di memoria ridotta, al punto da poter essere usato su un singolo floppy disk da 1.44 M, come ad esempio un disco di ripristino.
- TCC è concepito per generare codice nativo x86, x86-64 e ARM molto rapidamente: secondo Bellard, compilazione, assemblaggio e linking sono circa nove volte più veloci di GCC.[3]
- TCC ha alcune funzionalità aggiuntive che lo rendono pratico, come ad esempio il bound check.
- TCC consente di eseguire direttamente i programmi a compile time grazie ad uno switch, consentendo di eseguire script in C nelle shell che supportano la direttiva shebang.
- La libreria libtcc.so consente di creare funzioni C a runtime all'interno di programmi C o C++: il codice, contenuto in una stringa, viene compilato tramite le funzioni fornite dalla libreria e il codice macchina corrispondente viene caricato in una porzione di memoria con permessi di esecuzione, della quale viene restituito un puntatore che consente di invocare la funzione.
Performance del codice generato
[modifica | modifica wikitesto]TCC ha tempi di compilazione molto rapidi, tuttavia questo comporta un compromesso con l'efficienza del codice generato da esso. Il compilatore esegue un numero limitato di ottimizzazioni, come constant folding per tutte le operazioni, ottimizzazione di moltiplicazioni e divisioni tramite shift aritmetico quando possibile, ottimizzazione degli operatori di confronto tramite l'uso di una specifica cache, e una semplice register allocation che consente di risparmiare cicli di save/load all'interno di una singola istruzione ad alto livello.
In generale TCC punta maggiormente a compattezza e velocità piuttosto che all'ottimizzazione, generando il codice in un unico passaggio e senza eseguire molte delle ottimizzazioni praticate comunemente dai principali compilatori ottimizzanti. In particolare, TCC compila ogni istruzione individualmente, riportando i valori dei registri sullo stack al termine di ognuna e richiedendo una nuova lettura degli stessi se l'istruzione successiva li riutilizza. TCC inoltre non usa tutti i registri disponibili, ad esempio nell'architettura x86 non impiega mai i registri ebx, esi e edi, perché devono essere preservati dalle chiamate di funzione.[4]
In un benchmark effettuato usando una versione modificata di TCC, capace di compilare GCC, l'esecuzione di cc1 (il compilatore C di GCC) su sé stesso, usando un livello di ottimizzazione -O1 o equivalente, ha richiesto 518 secondi quando compilato con GCC 3.4.2, 558 secondi con GCC 2.95.3, 545 con il compilatore C Microsoft e 1145 con TCC.[5]
Impiego
[modifica | modifica wikitesto]Tra gli impiegi di TCC:
- TCCBOOT,[6] che impiega TCC per caricare ed eseguire il kernel Linux da sorgenti. È una sorta di bootloader che legge i sorgenti da disco, scrive le corrispondenti istruzioni macchina in memoria e le esegue.
- TCC è stato usato per mostrare un meccanismo di difesa rispetto alla vulnerabilità Trusting Trust.[7]
- TCC è stato impiegato per compilare GCC, anche se allo scopo sono necessarie alcune patch.[8]
- Cinpy[9] è una libreria Python che consente di implementare funzioni C nei moduli Python, che vengono compilate a runtime con TCC e rese richiamabili dal Python tramite la libreria ctypes.
Storia
[modifica | modifica wikitesto]TCC è l'evoluzione di Obfuscated Tiny C Compiler (OTCC), un programma scritto da Bellard con il quale ha vinto l'International Obfuscated C Code Contest (IOCCC) del 2001 come Best abuse of the rules.[10] Bellard ha in seguito esteso e de-offuscato il programma, ottenendo TCC.[11]
Stato del progetto
[modifica | modifica wikitesto]TCC ha una mailing list attiva e la versione del software di Bellard è disponibile su un repository Git. Tuttavia, lo sviluppo di TCC è discontinuo, per via dell'impegno di Bellard in altri progetti.[3]
Rob Landley ha creato un fork di TCC[12] per includere svariate patch di terze parti, tramite Mercurial.[13] Il progetto è stato abbandonato il 4 ottobre 2004 ed è rinato in un fork il 27 ottobre 2007 [12] fino al 5 settembre 2008.[14] Da allora, TCC ha ricevuto solo due aggiornamenti, il 20 maggio 2009 e il 15 febbraio 2013.
Altri programmatori hanno distribuito patch o versioni estese di TCC, come la collezione di patch di terze parti di Dave Dodge,[15] le patch dei progetti Debian e kfreebsd,[16] e di grischka.[5] Il repository pubblico di grischka[17] contiene un branch[18] con contributi più recenti e alcune funzionalità aggiuntive.
Note
[modifica | modifica wikitesto]- ^ Tiny C Compiler Reference Documentation accessed on 2008-08-07
- ^ According to the project's TODO list complex types are the only missing C99 feature. Variable Length Arrays have been added in TCC 0.9.26
- ^ a b Tiny C Compiler homepage
- ^ Glöckner, Daniel. Re: Tinycc-devel (no subject), September 8, 2006.
- ^ a b grischka, GCC by TCC (some fixes), 29 Sep 2005
- ^ TCCBOOT
- ^ Wheeler, David A. Countering Trusting Trust through Diverse Double-Compiling Archiviato l'8 ottobre 2011 in Internet Archive.. ACSAC.
- ^ tinycc-devel (thread)
- ^ Cinpy Archiviato il 20 novembre 2008 in Internet Archive.
- ^ Previous IOCCC Winners, su ioccc.org. URL consultato il 28 maggio 2016 (archiviato dall'url originale il 9 aprile 2009).
- ^ Bellard, Fabrice. Obfuscated Tiny C Compiler
- ^ a b Rob Landley's TCC fork that went inactive
- ^ Landley's Mercurial branch
- ^ tinycc-devel (message)
- ^ Dave Dodge's collection of unofficial tcc patches Archiviato il 31 marzo 2007 in Internet Archive.
- ^ Debian and kfreebsd downstream patches
- ^ grischka, Public Git Hosting for tcc
- ^ grischka, mob branch for tcc