Tiny C Compiler

Tiny C Compiler (англ. Tiny C Compiler — «крошечный компилятор Си»), или TinyCC, или TCC — компилятор C для платформы x86.

Работает в ОС Linux, KolibriOS[2], Microsoft Windows. Существуют также версии для ARM, TMS320C67xx. Распространяется по лицензии GNU LGPL.

Общие сведения

Особенности

  • От других распространённых компиляторов TCC отличается прежде всего тем, что может исполнять скомпилированную им программу, то есть выполнять функцию интерпретатора. Данное свойство позволяет использовать язык Си в качестве скриптового языка. Например, для того, чтобы запустить программу на Си в качестве скрипта в оболочке Linux, достаточно вставить в начало текста программы строку
#!/usr/local/bin/tcc -run[3]:

Также, наличие библиотеки libtcc позволяет осуществлять динамическую генерацию кода. С помощью этой библиотеки пользователь, например, может скомпилировать строку, содержащую программу на Си, после чего получить доступ к любому глобальному символу (переменной или функции), определённому в программе[4].

  • Компактность. Исполняемый файл для процессоров x86, включающий препроцессор, компилятор, ассемблер и компоновщик, составляет всего около 100 КБ[5].
  • Высокая скорость компиляции. Например, TCC примерно в 9 раз быстрее GCC[6].
  • Возможность формировать код с контролем границ массивов, который можно беспрепятственно использовать вместе с обычным кодом.
  • Возможность напрямую использовать любую динамическую библиотеку.
  • Оптимизация кода ограничена вычислением константных выражений на этапе компиляции, заменой операций умножения и деления операциями сдвига, где это возможно, а также некоторыми другими действиями. Оптимизация переходов не производится, так как это потребовало бы организацию промежуточного кода в более абстрактном виде[7].

Совместимость

TCC поддерживает не только стандарт ANSI C, но и большую часть нового стандарта ISO C99 и многие расширения GNU C, включая ассемблерные вставки. TCC также имеет собственные расширения, например, представление чисел в двоичном коде (0b101 вместо 5), а также предопределённый макрос __TINYC__, с помощью которого можно определить, используется ли TCC[8].

История развития

TCC первоначально разрабатывался для ОС Linux, однако начиная с версии 0.9.23 (17 июня 2005) работает и в ОС Microsoft Windows.

Первый вариант TCC был разработан как Obfuscated Tiny C Compiler (OTCC). OTCC — программа, написанная Фабрисом Белларом для участия в конкурсе International Obfuscated C Code Contest (IOCCC) в 2002 году[9] (на официальном сайте конкурса Фабрис Беллар с программой OTCC числится среди победителей конкурса за 2001 год[10]). С того времени Беллар значительно расширил функциональность программы и сделал её более понятной.

В 2012 году Фабрис Беллард обновил официальную веб-страницу проекта, сообщив, что он больше не работает над TCC[11].

Текущее состояние

Проект TCC продолжает развиваться, на официальном репозитории по состоянию на 2024 год идёт активное обсуждение разработчиков и заинтересованных пользователей[12].

Роб Лендли, используя Mercurial SCM, создал версию TCC, включающую различные патчи от сторонних разработчиков.

Помимо обозначенных выше, существуют и другие модификации TCC и патчи для него, такие как, неофициальная коллекция патчей от Дейва Доджа, патчи от Debian и kfreebsd, а также патчи для GCC от grischka.

В версии TCC 0.9.23 была обнаружена уязвимость, получившая номера CVE-2006-0635[13] и Open Source Vulnerability Database vulnerability 22956[14]. В отчёте было сказано, что TCC «содержит ошибку, способную вызвать проблемы с безопасностью в программах, скомпилированных с его помощью. Компилятор не способен возвращать беззнаковое значение оператора sizeof, что может привести к переполнениям целых чисел в скомпилированных объектах». Эта уязвимость была закрыта в версии 0.9.24.

См. также

На основе TCC создан загрузчик TCCBOOT (TinyCC Boot Loader) (англ.), позволяющий компилировать и загружать ядро Linux непосредственно из исходных текстов.

Примечания

  1. 1 2 Obfuscated Tiny C Compiler
  2. Tiny C Compiler — Просмотр темы Архивная копия от 12 августа 2014 на Wayback Machine [1]
  3. Tiny C Compiler Reference Documentation, 2.1 Quick start Архивная копия от 27 сентября 2011 на Wayback Machine (англ.)
  4. Tiny C Compiler Reference Documentation, 7. The libtcc library Архивная копия от 27 сентября 2011 на Wayback Machine (англ.)
  5. Tiny C Compiler Архивная копия от 8 апреля 2011 на Wayback Machine (англ.)
  6. Tiny C Compiler Compilation Speed Архивная копия от 8 апреля 2011 на Wayback Machine (англ.)
  7. Tiny C Compiler Reference Documentation, 8.8 Optimizations done Архивная копия от 27 сентября 2011 на Wayback Machine (англ.)
  8. Tiny C Compiler Reference Documentation, 3.4 TinyCC extensions Архивная копия от 27 сентября 2011 на Wayback Machine (англ.)
  9. Obfuscated Tiny C Compiler (англ.)
  10. Previous IOCCC Winners. Дата обращения: 13 мая 2009. Архивировано из оригинала 22 октября 2013 года.
  11. TCC : Tiny C Compiler. bellard.org. Дата обращения: 6 ноября 2024.
  12. Public Git Hosting - tinycc.git/summary (амер. англ.). repo.or.cz. Дата обращения: 6 ноября 2024.
  13. CVE-2006-0635. Дата обращения: 13 мая 2009. Архивировано 3 марта 2016 года.
  14. 22956 : Tiny C Compiler sizeof Calculation Weakness (недоступная ссылка)