Крошечный компилятор C
Разработчик(и) | Фабрис Беллард |
---|---|
Стабильная версия | 0.9.27 / 17 декабря 2017 г |
Репозиторий | репо |
Написано в | С и сборка [ нужна ссылка ] |
Операционная система | Линукс , Юникс , Винда |
Предшественник | OTCC, запутанный компилятор Tiny C [1] |
Тип | Си Компилятор |
Лицензия | LGPLv2.1 |
Веб-сайт | www |
Компилятор Tiny C (также известный как TCC, tCc или TinyCC) — это x86 , X86-64 и ARM для процессоров C компилятор , первоначально написанный Фабрисом Белларом . Он предназначен для работы на медленных компьютерах с небольшим дисковым пространством (например, на аварийных дисках ). Поддержка операционной системы Windows была добавлена в версии 0.9.23 (17 июня 2005 г.). TCC распространяется по лицензии GNU Lesser General Public License .
TCC утверждает, что реализует все стандарты ANSI C (C89/C90), [2] большая часть стандарта C99 ISO, [3] и многие расширения GNU C, включая встроенный ассемблер .
Функции
[ редактировать ]TCC имеет ряд особенностей, которые отличают его от других современных компиляторов C:
- Небольшой размер файла (около 100 КБ для исполняемого файла x86 TCC) и объем памяти позволяют использовать его непосредственно с одной дискеты емкостью 1,44 МБ , например, с аварийного диска.
- TCC предназначен для очень быстрого создания собственного кода x86, x86-64 и ARM; по словам Белларда, он компилируется, ассемблируется и компонуется примерно в девять раз быстрее, чем GCC . [4] По состоянию на 2023 год ветка разработки «моб» также включает поддержку RISC-V и TMS320C67xx ( чип DSP ).
- TCC имеет ряд особенностей языка, специфичных для компилятора, предназначенных для повышения его практичности, таких как дополнительная память и средство проверки границ для повышения стабильности кода.
- TCC позволяет программам автоматически запускаться во время компиляции с помощью переключателя командной строки. Это позволяет запускать программы как сценарии оболочки в Unix-подобных системах, которые поддерживают shebang синтаксис директив интерпретатора .
Скомпилированная производительность программы
[ редактировать ]В целом, реализация TCC подчеркивает компактность, а не оптимальность результатов. TCC генерирует код за один проход и не выполняет большую часть оптимизации, выполняемой другими компиляторами. TCC компилирует каждый оператор самостоятельно, и в конце каждого оператора значения регистров записываются обратно в стек и должны быть перечитаны, даже если следующая строка использует значения в регистрах (создавая посторонние пары сохранения/загрузки между операторами). TCC использует только некоторые из доступных регистров (например, на x86 он никогда не использует ebx, esi или edi, поскольку их необходимо сохранять при вызовах функций). [5]
TCC выполняет несколько оптимизаций , таких как постоянное распространение для всех операций, умножение и деление оптимизируются для сдвигов , когда это необходимо, а операторы сравнения специально оптимизируются (путем сохранения специального кэша для флагов процессора). Он также выполняет некоторое простое распределение регистров , что предотвращает использование множества посторонних пар сохранения/загрузки внутри одного оператора .
Вот два эталонных примера:
- Рекурсивный алгоритм Фибоначчи на ноутбуке Intel Centrino с тактовой частотой 1,8 ГГц и 512 МБ ОЗУ дает заметную разницу в результатах между Microsoft Visual C++ компилятором 13.10.3052 и TCC. Чтобы вычислить 49-е число Фибоначчи, программе MS Visual C++ потребовалось примерно на 18% больше времени, чем программе, скомпилированной TCC. [ нужна ссылка ]
- В ходе теста сравнивались различные компиляторы C, используя их для компиляции самого компилятора GNU C (GCC), а затем используя полученные компиляторы для повторной компиляции GCC. По сравнению с GCC 3.4.2, TCC, модифицированный для компиляции GCC, смог скомпилировать компилятор в десять раз быстрее, но полученный им .exe-файл был на 57% больше и намного медленнее, а для повторной компиляции GCC потребовалось в 2,2 раза больше времени. [6]
Результаты были такими: запуск cc1 (компилятора GCC C) сам по себе потребовал 518 секунд при компиляции с использованием GCC 3.4.2, 545 секунд при использовании компилятора Microsoft C и 1145 секунд при использовании TCC. Для создания этих компиляторов GCC (3.4.2) потребовалось 744 секунды для компиляции компилятора GCC, тогда как TCC потребовалось всего 73 секунды. Уровень оптимизации в каждом компиляторе был -O1 или аналогичный.
Использование
[ редактировать ]- ТССБООТ, [7] хак , при котором TCC загружает ядро Linux из исходного кода примерно за 10 секунд. Другими словами, это « загрузчик », который считывает исходный код ядра Linux с диска, записывает исполняемые инструкции в память и начинает его выполнять. Это потребовало внесения изменений в процесс сборки Linux.
- TCC использовался для компиляции GCC, хотя различные исправления . для этой работы требовались [8]
- TCC использовался для демонстрации защиты от атаки доверия . [9] Он также используется в GNU Guix. [10] в попытке сделать дистрибутив загружаемым без использования каких-либо двоичных файлов. [11]
- Синпи [12] — это Python библиотека , которая позволяет реализовывать функции на языке C в модулях Python. Функции компилируются с помощью TCC во время выполнения. Результаты можно вызывать в Python через библиотеку ctypes .
- Установлен на JavaScript Linux. [13] (также Белларда).
- Используется в качестве справочного материала для скомпилированной версии исходного кода программы Super Micro-Max Chess. [14]
История
[ редактировать ]TCC берет свое начало от обфусцированного компилятора Tiny C (OTCC). [1] программа, которую Беллард написал для победы в Международном конкурсе запутанного кода C (IOCCC) в 2001 году. После этого Беллард расширил и деобфусцировал программу для создания tcc. [1]
Незадолго до 4 февраля 2012 года Фабрис Беллар обновил официальную веб-страницу проекта, сообщив, что он больше не работает над TCC. [15]
После ухода Белларда из проекта различные люди и группы распространяли исправления или поддерживали версии TCC, чтобы развивать или устранять проблемы с TCC. Сюда входит коллекция неофициальных tcc-патчей Дэйва Доджа, [16] Debian и kfreebsd , Последующие патчи [17] и патчи GCC от Grischka. [6] Гришка также создал Git . публичный репозиторий для проекта [18] который содержит ветку мобов [19] многочисленные дополнения, включая общую сборку, кросс-компиляторы и совместимость с SELinux куда были добавлены . Репозиторий GIT Гришки позже стал официальным репозиторием TCC (ссылка на страницу проекта Фабриса Беллара в Саванне). [20] ).
Текущий статус
[ редактировать ]По состоянию на декабрь 2017 года официальный список рассылки TCC [21] и официальный репозиторий Git (ссылка на который имеется на странице проекта Фабриса Беллара в Саванне). [22] ) демонстрируют активное обсуждение и развитие со стороны многих разработчиков и заинтересованных пользователей. В декабре 2017 года grischka объявил в списке рассылки, что выпущена версия TCC 0.9.27. [23]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б с Беллард, Фабрис. Obfuscated Tiny C Compiler , победитель конкурса IOCCC 2001. https://bellard.org/otcc/ и в Интернет-архиве по адресу https://web.archive.org/web/20130721162702/http://www.ioccc.org. /2001/
- ^ Справочная документация по компилятору Tiny C, доступ 7 августа 2008 г.
- ^ проекта, Согласно списку TODO сложные типы — единственная недостающая функция C99. Массивы переменной длины были добавлены в TCC 0.9.26.
- ^ «TCC: Tiny C Compiler» . Bellard.org . Проверено 27 марта 2023 г.
- ^ Глекнер, Дэниел. Re: Tinycc-devel (без темы) , 8 сентября 2006 г.
- ^ Jump up to: а б grischka, GCC от TCC (некоторые исправления) , 29 сентября 2005 г.
- ^ «TCCBOOT: Загрузчик TinyCC» . Bellard.org . Проверено 27 марта 2023 г.
- ^ "tinycc-devel (поток)" . lists.gnu.org . Проверено 27 марта 2023 г.
- ^ Уиллер, Дэвид А. Противодействие доверительному доверию посредством разнообразной двойной компиляции . АКСАК.
- ^ «Guix еще больше сокращает начальную загрузку до 25% — 2020 — Блог — GNU Guix» .
- ^ «Загрузочные сборки» . bootstrapable.org . Проверено 29 марта 2023 г.
- ^ «Синпи» . Архивировано из оригинала 20 ноября 2008 года . Проверено 27 марта 2023 г.
- ^ «JSLinux» . Bellard.org . Проверено 27 марта 2023 г.
- ^ «Супер микро шахматы» . СоурсФордж . Проверено 27 марта 2023 г.
- ^ «TCC: Tiny C Compiler» . 4 февраля 2012 года. Архивировано из оригинала 4 февраля 2012 года . Проверено 27 марта 2023 г.
- ^ «Неофициальные патчи tcc» . www.dododge.net . Архивировано из оригинала 31 марта 2007 года . Проверено 27 марта 2023 г.
- ^ «Debian — Подробная информация о пакете tcc в sid» . packages.debian.org . Проверено 27 марта 2023 г.
- ^ grischka, Публичный хостинг Git для tcc
- ^ grischka, ветка мобов для tcc
- ^ «Компилятор Tiny C — Краткое описание [Саванна]» . savannah.nongnu.org . Проверено 27 марта 2023 г.
- ^ "Архивы tinycc-devel" . lists.gnu.org . Проверено 27 марта 2023 г.
- ^ «Публичный хостинг Git — tinycc.git/summary» . repo.or.cz. Проверено 27 марта 2023 г.
- ^ «[Tinycc-devel] Вышла версия TCC 0.9.27» . lists.nongnu.org . Проверено 27 марта 2023 г.