Tiny C Compiler: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Corretto collegamento ipertestuale
 
(13 versioni intermedie di 7 utenti non mostrate)
Riga 12:
|Licenza = LGPL
|SoftwareLibero = si
|SitoWeb = http://bellard.org/tcc/
}}
'''Tiny C Compiler''' (noto anche come '''TCC''', '''tCc''' o '''TinyCC''') è un [[compilatore]] [[C (linguaggio)|C]] per piattaforme [[x86]] e [[architettura ARM|ARM]] creato da [[Fabrice Bellard]] e distribuito sotto licenza [[GNU Lesser General Public License|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 [[Microsoft Windows|Windows]].
 
Secondo la documentazione, TCC implementa interamente lo standard [[ANSI C]] (C89/C90),<ref>[http://bellard.org/tcc/tcc-doc.html#SEC6 Tiny C Compiler Reference Documentation] accessed on 2008-08-07</ref> buona parte dello standard ISO [[C99 (linguaggio di programmazione)|C99]]<ref>According to the project's [http://repo.or.cz/w/tinycc.git/blob/HEAD:/TODO TODO list] complex types are the only missing C99 feature. Variable Length Arrays have been added in TCC 0.9.26</ref> e molte delle estensioni GNU C, tra le quali l'inserimento di [[Assembler inline|assembly]] inline]].
 
== Caratteristiche ==
Riga 30 ⟶ 29:
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 sullaa compattezza e velocità piuttosto che sullall'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.<ref>Glöckner, Daniel. [httphttps://lists.gnu.org/archive/html/tinycc-devel/2006-09/msg00028.html Re: Tinycc-devel (no subject)], September 8, 2006.</ref>
 
In un [[benchmark (informatica)|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.<ref name="grischka"/>
Riga 36 ⟶ 35:
== Impiego ==
Tra gli impiegi di TCC:
* TCCBOOT,<ref>[http://bellard.org/tcc/tccboot.html TCCBOOT]</ref> 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 memoramemoria e le esegue.
* TCC è stato usato per mostrare un meccanismo di difesa rispetto alla vulnerabilità Trusting Trust.<ref>Wheeler, David A. ''[http://www.dwheeler.com/trusting-trust Countering Trusting Trust through Diverse Double-Compiling] {{Webarchive|url=https://web.archive.org/web/20111008035532/http://www.dwheeler.com/trusting-trust |date=8 ottobre 2011 }}''. ACSAC.</ref>
* TCC è stato impiegato per compilare GCC, anche se allo scopo sono necessarie alcune patch.<ref>[httphttps://lists.gnu.org/archive/html/tinycc-devel/2005-09/threads.html tinycc-devel (thread)]</ref>
* Cinpy<ref>[httphttps://www.cs.tut.fi/~ask/cinpy/ Cinpy] {{webarchive|url=https://web.archive.org/web/20081120164629/http://www.cs.tut.fi/~ask/cinpy/ |data=20 novembre 2008 }}</ref> è 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 ==
TCC è l'evoluzione di Obfuscated Tiny C Compiler (OTCC), un programma scritto da Bellard percon il quale ha vinto l'[[International Obfuscated C Code Contest]] (IOCCC) del 2001 come ''Best abuse of the rules''.<ref>{{cita web|url=http://www.ioccc.org/years.html#2001_bellard|titolo=Previous IOCCC Winners|accesso=28 maggio 2016|urlarchivio=https://web.archive.org/web/20090409235720/http://www.ioccc.org/years.html#2001_bellard|dataarchivio=9 aprile 2009|urlmorto=sì}}</ref> Bellard ha in seguito esteso e de-offuscato il programma, ottenendo TCC.<ref>Bellard, Fabrice. [http://bellard.org/otcc/ Obfuscated Tiny C Compiler]</ref>
 
== Stato del progetto ==
TCC ha una [[mailing list]] attiva e la versione del software di Bellard è disponibile su un [[repository]] [[Git (software)|Git]]. Tuttavia, lo sviluppo di TCC è discontinuo, per via dell'impegno di Bellard in altri progetti.<ref name="tccHome" />
 
Rob Landley ha creato un fork di TCC<ref name="tccfork" /> per includere svariate patch di terze parti, tramite [[Mercurial]].<ref>[http://www.landley.net/hg/tinycc Landley's Mercurial branch]</ref> Il progetto è stato abbandonato il 4 ottobre 2004 ed è rinato in un fork il 27 ottobre 2007 <ref name="tccfork">[http://landley.net/code/tinycc/ Rob Landley's TCC fork that went inactive]</ref> fino al 5 settembre 2008.<ref>[httphttps://lists.gnu.org/archive/html/tinycc-devel/2008-09/msg00013.html tinycc-devel (message)]</ref> 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,<ref>[http://www.dododge.net/tcc/patches.html Dave Dodge's collection of unofficial tcc patches] {{webarchive|url=https://web.archive.org/web/20070331221112/http://www.dododge.net/tcc/patches.html |data=31 marzo 2007 }}</ref> le patch dei progetti Debian e kfreebsd,<ref>[httphttps://packages.debian.org/unstable/devel/tcc Debian and kfreebsd downstream patches]</ref> e di grischka.<ref name="grischka">grischka, [httphttps://lists.gnu.org/archive/html/tinycc-devel/2005-09/msg00054.html GCC by TCC (some fixes)], 29 Sep 2005</ref> Il repository pubblico di grischka<ref>grischka, [http://repo.or.cz/w/tinycc.git Public Git Hosting for tcc]</ref> contiene un branch<ref>grischka, [http://repo.or.cz/w/tinycc.git/shortlog/refs/heads/mob mob branch for tcc]</ref> con contributi più recenti e alcune funzionalità aggiuntive.
 
== Note ==
<references />
{{reflist}}
 
== Voci correlate ==
Riga 61 ⟶ 60:
== Collegamenti esterni ==
*[http://bellard.org/tcc/ Sito ufficiale]
*[httphttps://lists.nongnu.org/mailman/listinfo/tinycc-devel Mailing list]
*[http://repo.or.cz/w/tinycc.git Repository Git]