V sobotu 2. listopadu proběhla mohutná oslava naší plnoletosti !!
Multimediaexpo.cz je již 18 let na českém internetu !!

Tiny C Compiler

Z Multimediaexpo.cz

Verze z 21. 10. 2013, 20:05; Sysop (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)

Tiny C Compiler (též TCC, tCc, TinyCC) je v informatice překladač jazyka C pro platformy x86 a x86-64. Původním autorem je Fabrice Bellard. Byl navržen pro starší (pomalejší) počítače s omezeným diskovým prostorem (například záchranné disky). Od verze 0.9.23 (17. července 2005) obsahuje podporu pro operační systém Microsoft Windows. TCC je šířen pod licencí GNU Lesser General Public License (LGPL).

Dokumentace tvrdí, že TCC plně podporuje ANSI C (C89/90),[1] mnoho vlastností ISO C99 a též mnoho GNU rozšíření (včetně vkládaného assembleru).

Obsah

Vlastnosti

Vlastnosti odlišující TCC od jiných běžných překladačů jazyka C:

  • Velikost samotného překladače (velikost spustitelného souboru TCC na x86 je přibližně 100 KiB) a paměťové nároky umožňují použití i ze záchranné diskety.
  • TCC je určen k rychlému překladu do nativního x86 a x86-64 kódu. Podle Bellarda je schopen přeložit prohlížeč Links přibližně devětkrát rychleji než GCC.
  • TCC má řadu specifických vlastností, které mají za účel vylepšit reálné použití; například kontrolu přístupu do paměti (pro snazší diagnostiku chyb).
  • Podpora pro automatickou kompilaci a spuštění. Program ve formě zdrojového kódu může být spustitelný podobně jako třeba shell skript. Na začátku takového souboru je pak shebang (například #!/usr/bin/tcc -run).

Ukázka automaticky kompilovaného programu

Následující kód ukazuje Hello world s počátečním shebang řádkem. Bude-li mít takový soubor práva na spuštění (a bude-li v /usr/bin/tcc opravdu TCC), bude možno takový soubor přímo spustit.

#!/usr/bin/tcc -run
 
#include <stdio.h>
 
int main(int argc, char ** argv)
{
    puts("Hello, world!");
    return 0;
}

Rychlost zkompilovaných programů

Přestože samotný překladač je velice rychlý a vytváří malé spustitelné soubory, je tato rychlost vykoupena rychlostí přeložených programů (kompromis mezi složitostí/velikostí překladače a rychlostí výsledného kódu).

TCC provádí několik druhů optimalizací, například propagaci konstant u všech operací. Násobení a dělení jsou ve vhodných případech nahrazeny posuvy. Dále provádí jednoduchou alokaci registrů pro zrychlení přístupu k často používaným proměnným.

Obecně je ovšem důraz kladen především na rychlost překladu a velikost výsledného kódu. TCC zpracuje kód v jednom průchodu, nemůže tedy použít většinu optimalizací, které jinak aplikují ostatní překladače. Každý příkaz (výraz) se překládá odděleně, na jeho konci se registry vloží na zásobník a potom musí být znovu ze zásobníku načteny i v případě, že následující příkaz používá tyto hodnoty. Dále TCC nevyužívá všech dostupných registrů (například na x86 nepoužívá ebx, esi a edi, protože jejich hodnota musí být zachována mezi jednotlivými voláními funkci).[2]

Následují dva pokusné benchmarky:

  • Výkon rekurzivního Fibonacciho algoritmu na 1.8 GHz mobilním procesoru Intel Centrino s 512 MiB RAM ukazuje znatelný rozdíl při kompilaci v TCC oproti kódu z překladače Microsoft Visual C++. Výpočet 49. fibonacciho čísla trval u TCC kódu přibližně 110 sekund, u kódu z VC++ to bylo jen 93 sekund.
  • TCC byl upraven tak, aby mohl kompilovat GCC. Takto zkompilované GCC pak kompilovalo sebe sama za 1145 sekund. Když bylo stejné GCC kompilováno překladačem GCC verze 3.4.2, trval překlad jen 518 sekund. U GCC 2.95.3  sekund a nakonec překladačem VC++ bylo toto GCC zkompilováno za 545 sekund. Vždy byl použit první stupeň optimalizací (-O1 atp.).

Reference

  1. Tiny C Compiler Reference Documentation, verze z 2011-05-23
  2. Glöckner, Daniel. Re: Tinycc-devel (no subject), September 8, 2006.

Externí odkazy