El compilador Tiny C (también conocido como TCC, tCc o TinyCC) es un compilador C del procesador x86 , X86-64 y ARM escrito inicialmente por Fabrice Bellard . Está diseñado para funcionar con equipos lentos con poco espacio en disco (por ejemplo, en discos de rescate). La compatibilidad con el sistema operativo Windows se agregó en la versión 0.9.23 (17 de junio de 2005). TCC se distribuye bajo la Licencia Pública General Reducida GNU .
Desarrollador (es) | Fabrice Bellard |
---|---|
Lanzamiento estable | 0.9.27 / 17 de diciembre de 2017 |
Repositorio | repositorio |
Escrito en | C y Asamblea [ cita requerida ] |
Sistema operativo | Linux , Unix , Windows |
Predecesor | OTCC, compilador Tiny C ofuscado [1] |
Tipo | Compilador de C |
Licencia | LGPLv2.1 |
Sitio web | bellard |
TCC afirma implementar todo ANSI C (C89 / C90), [2] gran parte del estándar C99 ISO, [3] y muchas extensiones GNU C, incluido el ensamblaje en línea .
Características
TCC tiene una serie de características que lo diferencian de otros compiladores de C actuales:
- Su pequeño tamaño de archivo (alrededor de 100 KB para el ejecutable x86 TCC) y la huella de memoria permiten que se use directamente desde un solo disquete de 1,44 M , como un disquete de rescate.
- TCC está diseñado para producir código nativo x86, x86-64 y ARM muy rápidamente; según Bellard, compila, ensambla y enlaza unas nueve veces más rápido que GCC . [4]
- TCC tiene una serie de características de lenguaje específicas del compilador destinadas a mejorar su practicidad, como una memoria opcional y un comprobador de encuadernación, para mejorar la estabilidad del código.
- TCC permite que los programas se ejecuten automáticamente en tiempo de compilación mediante un conmutador de línea de comandos. Esto permite que los programas se ejecuten como un script de shell en sistemas similares a Unix que admiten la sintaxis de la directiva de intérprete shebang .
Rendimiento del programa compilado
En general, la implementación de TCC enfatiza la pequeñez en lugar de los resultados de rendimiento óptimo. TCC genera código en una sola pasada y no realiza la mayoría de las optimizaciones realizadas por otros compiladores. TCC compila cada declaración por sí sola, y al final de cada declaración, los valores de registro se vuelven a escribir en la pila y se deben volver a leer incluso si la siguiente línea usa los valores en los registros (creando pares de guardar / cargar extraños entre declaraciones). TCC usa solo algunos de los registros disponibles (por ejemplo, en x86 nunca usa ebx, esi o edi porque deben conservarse en todas las llamadas a funciones). [5]
TCC realiza algunas optimizaciones , como la propagación constante para todas las operaciones, las multiplicaciones y divisiones se optimizan a los cambios cuando es apropiado, y los operadores de comparación se optimizan especialmente (manteniendo una caché especial para las banderas del procesador). También realiza una asignación de registro simple , lo que evita muchos pares de guardar / cargar extraños dentro de una sola declaración .
A continuación, se muestran dos ejemplos de referencia:
- Un algoritmo de Fibonacci recursivo en una computadora portátil Intel Centrino de 1.8 GHz con 512 MB de RAM produce una diferencia notable en los resultados entre el compilador 13.10.3052 de Microsoft Visual C ++ y TCC. Para calcular el número 49 de Fibonacci, un programa de MS Visual C ++ tardó aproximadamente un 18% más que el programa compilado de TCC. [ cita requerida ]
- Con un tcc modificado para compilar GCC, ejecutar cc1 (el compilador GCC C) en sí mismo requirió 518 segundos cuando se compiló usando GCC 3.4.2, 558 segundos usando GCC 2.95.3, 545 usando el compilador Microsoft C y 1145 segundos usando tcc. El nivel de optimización en cada compilador fue -O1 o similar. [6]
Usos
- TCCBOOT, [7] un truco en el que TCC carga y arranca un kernel de Linux desde la fuente en unos 10 segundos. Es decir, es un "cargador de arranque" que lee el código fuente del kernel de Linux desde el disco, escribe instrucciones ejecutables en la memoria y comienza a ejecutarlo. Esto requirió cambios en el proceso de compilación de Linux.
- Se utilizó TCC para demostrar una defensa contra el ataque de confianza . [8]
- TCC se ha utilizado para compilar GCC, aunque se necesitaron varios parches para que esto funcione. [9]
- Cinpy [10] es una biblioteca de Python que le permite implementar funciones con C en módulos de Python. Las funciones se compilan con TCC en tiempo de ejecución. Los resultados se pueden llamar en Python a través de la biblioteca ctypes.
- Viene instalado en JavaScript Linux [11] (también de Bellard).
- Se ha utilizado como referencia para la versión compilada de la fuente del programa de ajedrez super micro-max. [12]
Historia
TCC tiene sus orígenes en Ofuscated Tiny C Compiler (OTCC), [1] un programa que Bellard escribió para ganar el Concurso Internacional de Códigos C ofuscados (IOCCC) en 2001. Después de ese tiempo, Bellard expandió y desofuscó el programa para producir tcc. [1]
En algún momento antes del 4 de febrero de 2012, Fabrice Bellard actualizó la página web oficial del proyecto para informar que ya no estaba trabajando en TCC. [13]
Desde la salida de Bellard del proyecto, varias personas y grupos han distribuido parches o mantenido bifurcaciones de TCC para construir o solucionar problemas con TCC. Esto incluye la colección de parches tcc no oficiales de Dave Dodge, [14] los parches posteriores de Debian y kfreebsd, [15] y los parches gcc de grischka. [6] Grischka también configuró un repositorio público de Git para el proyecto [16] que contiene una rama de mob [17] donde se agregaron numerosas contribuciones, incluida una compilación compartida, compiladores cruzados y compatibilidad con SELinux. El repositorio GIT de Grischka se convirtió más tarde en el repositorio oficial de TCC (vinculado a la página del proyecto Savannah de Fabrice Bellard [18] ).
Estado actual
En diciembre de 2017, tanto la lista de correo oficial de TCC [19] como el repositorio oficial de Git (vinculado a la página del proyecto Savannah de Fabrice Bellard [20] ) muestran una discusión y un desarrollo activos por parte de muchos desarrolladores y usuarios interesados. En diciembre de 2017, grischka anunció en la lista de correo que se lanzó la versión 0.9.27 de TCC. [21]
Ver también
- Colección del compilador GNU
- LCC (compilador)
- Compilador de C portátil (PCC)
- Pequeña-C
Referencias
- ^ a b c Bellard, Fabrice. Compilador Ofuscated Tiny C , entrada ganadora de IOCCC 2001. https://bellard.org/otcc/ y en Internet Archive en https://web.archive.org/web/20130721162702/http://www.ioccc.org / 2001 /
- ^ Documentación de referencia del compilador de Tiny C consultada el 7 de agosto de 2008
- ^ De acuerdo con la lista TODO del proyecto,los tipos complejos son la única característica C99 que falta. Se han agregado matrices de longitud variable en TCC 0.9.26
- ^ Página de inicio del compilador Tiny C
- ^ Glöckner, Daniel. Re: Tinycc-devel (sin tema) , 8 de septiembre de 2006.
- ↑ a b grischka, GCC por TCC (algunas correcciones) , 29 de septiembre de 2005
- ^ TCCBOOT
- ^ Wheeler, David A. Contrarrestar la confianza a través de la doble compilación diversa . ACSAC.
- ^ tinycc-devel (hilo)
- ^ Cinpy Archivado el 20 de noviembre de 2008 en la Wayback Machine.
- ^ JavaScript Linux
- ^ Motor de ajedrez Super Micro-Max
- ^ La instantánea más antigua de archive.org de la página de inicio de TCC que muestra el anuncio de Fabrice Bellard de cesar el trabajo en TCC.
- ^ Colección de parches tcc no oficiales de Dave Dodge Archivado el 31 de marzo de 2007 en la Wayback Machine.
- ^ Parches posteriores de Debian y kfreebsd
- ^ grischka, Alojamiento Git público para tcc
- ^ grischka, rama de la mafia para tcc
- ^ Página oficial del proyecto Savannah
- ^ Lista de distribución oficial de TCC
- ^ Repositorio oficial de código fuente de Git
- ^ Lista de correo oficial de TCC, entrada del 27 de diciembre de 2017
enlaces externos
- Página web oficial
- Lista de correo activa de TCC
- Repositorio de código fuente
- PTSource IDE : entorno de desarrollo integrado que incluye TCC.