Articulo de referencia

Compilador C pequeño

Bellard, Fabrice. [https://bellard.org/otcc/ Obfuscated Tiny C Compiler], winning entry of [[IOCCC]] 2001. https://bellard.org/otcc/ and at the Internet Archive at https://web.a...

El compilador Tiny C , TCC, tCc o TinyCC, es un compilador de C para arquitecturas x86 (32 bits), x86-64 y ARM, escrito inicialmente por Fabrice Bellard . Está diseñado para funcionar en ordenadores lentos con poco espacio en disco (por ejemplo, en discos de recuperación ). La compatibilidad con el sistema operativo Windows se añadió en la versión 0.9.23 (17 de junio de 2005). TCC se distribuye bajo la Licencia Pública General Reducida de GNU .

TCC afirma implementar todo el estándar ANSI C (C89/C90), [ 2 ] gran parte del estándar ISO C99 , [ 3 ] y muchas extensiones de GNU C, incluido el ensamblaje en línea .

Características

TCC posee una serie de características que lo diferencian de otros compiladores de C actuales:

  • Su reducido tamaño de archivo (unos 100  KB para el ejecutable x86 TCC) y su bajo consumo de memoria permiten utilizarlo directamente desde un único disquete de  1,44 M , como por ejemplo un disco 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 aproximadamente nueve veces más rápido que GCC . [ 4 ] A partir de 2023, la rama de desarrollo "mob" también incluye soporte para RISC-V y TMS320C67xx (un chip DSP ).
  • TCC cuenta con una serie de características de lenguaje específicas del compilador destinadas a mejorar su practicidad, como un verificador de memoria y de límites opcional, para una mayor estabilidad del código.
  • TCC permite ejecutar programas automáticamente en tiempo de compilación mediante un parámetro de línea de comandos. Esto permite ejecutar programas como scripts de shell en sistemas tipo Unix que admiten la sintaxis de directivas de intérprete shebang . El shebang para TCC (tal como se indica en el sitio web oficial de TCC) [ 2 ] es (suponiendo que TCC esté instalado en , la ubicación de instalación puede variar según el sistema). [ 5 ]#!/usr/local/bin/tcc -run/usr/local/bin/tcc

Rendimiento del programa recopilado

En general, la implementación de TCC prioriza la concisión en lugar de resultados de rendimiento óptimo. TCC genera código en una sola pasada y no realiza la mayoría de las optimizaciones que realizan otros compiladores. TCC compila cada instrucción por separado y, al final de cada instrucción, los valores de los registros se escriben de nuevo en la pila y deben volver a leerse incluso si la siguiente línea utiliza los valores de los registros (creando pares de guardado/carga innecesarios entre instrucciones). TCC utiliza solo algunos de los registros disponibles (por ejemplo, en x86 nunca utiliza ebx, esi o edi porque deben conservarse entre llamadas a funciones). [ 6 ]

TCC realiza algunas optimizaciones , como la propagación de constantes para todas las operaciones, las multiplicaciones y divisiones se optimizan a desplazamientos cuando corresponde, y los operadores de comparación se optimizan especialmente (manteniendo una caché especial para los indicadores del procesador). También realiza una asignación de registros simple , lo que evita muchos pares de guardado/carga innecesarios dentro de una sola instrucción .

Aquí hay dos ejemplos de referencia:

  1. Un algoritmo recursivo de Fibonacci en una computadora portátil Intel Centrino  de 1.8 GHz con 512 MB de RAM muestra una diferencia notable en los resultados entre el compilador Microsoft Visual C++ 13.10.3052 y TCC. Para calcular el 49.º número de Fibonacci, un programa de MS Visual C++ tardó aproximadamente un 18 % más que el programa compilado con TCC. 
  2. Se realizó una prueba comparando diferentes compiladores de C, utilizándolos para compilar el propio compilador GNU C (GCC) y, posteriormente, utilizando los compiladores resultantes para compilar GCC de nuevo. En comparación con GCC 3.4.2, un TCC modificado para compilar GCC logró compilar el compilador diez veces más rápido, pero el archivo .exe resultante era un 57 % más grande y mucho más lento, tardando 2,2 veces más en compilar GCC de nuevo. [ 7 ]

    Los resultados fueron: Ejecutar cc1 (el compilador C de GCC) sobre sí mismo requirió 518 segundos al compilarlo con GCC 3.4.2, 545 segundos con el compilador C de Microsoft y 1145 segundos con TCC. Para crear estos compiladores, GCC (3.4.2) tardó 744 segundos en compilar el compilador GCC, mientras que TCC tardó solo 73 segundos. El nivel de optimización en cada compilador fue -O1 o similar.

Usos

  • TCCBOOT, [ 8 ] un hack donde TCC carga e inicia un kernel de Linux desde el código fuente en aproximadamente 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ó modificaciones en el proceso de compilación de Linux.
  • TCC se ha utilizado para compilar GCC, aunque se requirieron varios parches para que esto funcionara. [ 9 ]
  • TCC se utilizó para demostrar una defensa contra el ataque de confianza . [ 10 ] También se utiliza en GNU Guix [ 11 ] en un intento de hacer que la distribución se pueda arrancar sin usar ningún binario. [ 12 ]
  • Cinpy [ 13 ] es una biblioteca de Python que permite implementar funciones de C en módulos de Python. Las funciones se compilan con TCC en tiempo de ejecución. Los resultados se pueden invocar en Python mediante la biblioteca ctypes [ 14 ] .
  • TCC se ha utilizado como referencia para la versión compilada del código fuente del programa Super Micro-Max Chess. [ 15 ]
  • Bun utiliza TCC para exponer una API que permite a los usuarios compilar y ejecutar programas C desde JavaScript. [ 16 ]

Historia

TCC tiene sus orígenes en el Obfuscated Tiny C Compiler (OTCC), [ 1 ] un programa que Bellard escribió para ganar el International Obfuscated C Code Contest (IOCCC) en 2001. Después de eso, Bellard amplió y desofuscó el programa para producir tcc. [ 1 ]

En algún momento anterior al 4 de febrero de 2012, Fabrice Bellard actualizó la página web oficial del proyecto para informar que ya no trabajaba en TCC. [ 17 ]

Desde la salida de Bellard del proyecto, varias personas y grupos han distribuido parches o mantenido bifurcaciones de TCC para desarrollar o corregir problemas con TCC. Esto incluye la colección de parches no oficiales de tcc de Dave Dodge, [ 18 ] parches derivados de Debian y kfreebsd , [ 19 ] y los parches de gcc de grischka. [ 7 ] Grischka también estableció un repositorio Git público para el proyecto [ 20 ] que contiene una rama mob [ 21 ] donde se agregaron numerosas contribuciones, incluyendo una compilación compartida, compiladores cruzados y compatibilidad con SELinux . El repositorio GIT de Grischka se convirtió posteriormente en el repositorio oficial de TCC (enlazado desde la página del proyecto Savannah de Fabrice Bellard). [ 22 ]

Estado actual

En diciembre de 2017, tanto la lista de correo oficial de TCC [ 23 ] como el repositorio Git oficial (enlazado desde la página del proyecto GNU Savannah de Fabrice Bellard [ 24 ] ) mostraban un debate y desarrollo activos por parte de muchos desarrolladores y usuarios interesados. En diciembre de 2017, grischka anunció en la lista de correo que se había publicado la versión 0.9.27 de TCC. [ 25 ]

Véase también

Referencias

  1. 1 2 3 Bellard, Fabrice. Compilador C pequeño ofuscado , 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/
  2. 1 2 "Documentación de referencia del compilador Tiny C" . bellard.org . Consultado el 7 de agosto de 2008 .
  3. Según la lista de tareas pendientes del proyecto , los tipos complejos son la única característica C99 que falta. Se han añadido matrices de longitud variable en TCC 0.9.26.
  4. "TCC : Compilador C pequeño" . bellard.org . Consultado el 27 de marzo de 2023 . 
  5. "tcc - Gentoo wiki" . wiki.gentoo.org . Consultado el 15 de septiembre de 2025 .
  6. Glockner, Daniel. Re: Tinycc-devel (sin tema) , 8 de septiembre de 2006.
  7. 1 2 grischka, GCC por TCC (algunas correcciones) , 29 de septiembre de 2005
  8. "TCCBOOT: Cargador de arranque TinyCC" . bellard.org . Consultado el 27 de marzo de 2023 .
  9. "tinycc-devel (hilo)" . lists.gnu.org . Consultado el 27 de marzo de 2023 .
  10. Wheeler, David A. Contrarrestando la confianza depositada a través de la doble compilación diversa . ACSAC.
  11. "Guix reduce aún más la semilla de arranque al 25% — 2020 — Blog — GNU Guix" .
  12. "Builds Bootstrapable" . bootstrappable.org . Consultado el 29 de marzo de 2023 .
  13. "Cinpy" . Archivado del original el 20 de noviembre de 2008. Consultado el 27 de marzo de 2023 .
  14. "CTypes" . Archivo web . 13 de abril de 2026. Consultado el 13 de abril de 2026 .
  15. "Super Micro Chess" . SourceForge . 18 de abril de 2016. Consultado el 27 de marzo de 2023 .
  16. "Compilador C" . Bun . Consultado el 22 de noviembre de 2024 .
  17. "TCC : Tiny C Compiler" . 4 de febrero de 2012. Archivado del original el 4 de febrero de 2012. Consultado el 27 de marzo de 2023 . 
  18. "Parches no oficiales de tcc" . www.dododge.net . Archivado del original el 31 de marzo de 2007. Consultado el 27 de marzo de 2023 .
  19. "Debian -- Detalles del paquete tcc en sid" . packages.debian.org . Consultado el 27 de marzo de 2023 .
  20. grischka, Alojamiento público de Git para tcc
  21. grischka, rama mob para tcc
  22. "Compilador C pequeño - Resumen [ Savannah ] " . savannah.nongnu.org . Consultado el 27 de marzo de 2023 .
  23. "Archivos de tinycc-devel" . lists.gnu.org . Consultado el 27 de marzo de 2023 .
  24. "Alojamiento público de Git - tinycc.git/summary" . repo.or.cz . Consultado el 27 de marzo de 2023 .
  25. " [ Tinycc-devel ] La versión 0.9.27 de TCC ya está disponible" . lists.nongnu.org . Consultado el 27 de marzo de 2023 .
Obtenido de " https://en.wikipedia.org/w/index.php?title=Tiny_C_Compiler&oldid=1355505956 "