Jump to content

Крошечный компилятор C

Крошечный компилятор C
Разработчик(и) Фабрис Беллард
Стабильная версия
0.9.27 / 17 декабря 2017 г .; 6 лет назад ( 17.12.2017 )
Репозиторий репо .или .cz /tinycc .git
Написано в С и сборка [ нужна ссылка ]
Операционная система Линукс , Юникс , Винда
Предшественник OTCC, запутанный компилятор Tiny C [1]
Тип Си Компилятор
Лицензия LGPLv2.1
Веб-сайт www .tinycc .org

Компилятор 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 выполняет несколько оптимизаций , таких как постоянное распространение для всех операций, умножение и деление оптимизируются для сдвигов , когда это необходимо, а операторы сравнения специально оптимизируются (путем сохранения специального кэша для флагов процессора). Он также выполняет некоторое простое распределение регистров , что предотвращает использование множества посторонних пар сохранения/загрузки внутри одного оператора .

Вот два эталонных примера:

  1. Рекурсивный алгоритм Фибоначчи на ноутбуке Intel Centrino с тактовой частотой 1,8 ГГц и 512 МБ ОЗУ дает заметную разницу в результатах между Microsoft Visual C++ компилятором 13.10.3052 и TCC. Чтобы вычислить 49-е число Фибоначчи, программе MS Visual C++ потребовалось примерно на 18% больше времени, чем программе, скомпилированной TCC. [ нужна ссылка ]
  2. В ходе теста сравнивались различные компиляторы 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]

См. также

[ редактировать ]
  1. ^ Jump up to: а б с Беллард, Фабрис. Obfuscated Tiny C Compiler , победитель конкурса IOCCC 2001. https://bellard.org/otcc/ и в Интернет-архиве по адресу https://web.archive.org/web/20130721162702/http://www.ioccc.org. /2001/
  2. ^ Справочная документация по компилятору Tiny C, доступ 7 августа 2008 г.
  3. ^ проекта, Согласно списку TODO сложные типы — единственная недостающая функция C99. Массивы переменной длины были добавлены в TCC 0.9.26.
  4. ^ «TCC: Tiny C Compiler» . Bellard.org . Проверено 27 марта 2023 г.
  5. ^ Глекнер, Дэниел. Re: Tinycc-devel (без темы) , 8 сентября 2006 г.
  6. ^ Jump up to: а б grischka, GCC от TCC (некоторые исправления) , 29 сентября 2005 г.
  7. ^ «TCCBOOT: Загрузчик TinyCC» . Bellard.org . Проверено 27 марта 2023 г.
  8. ^ "tinycc-devel (поток)" . lists.gnu.org . Проверено 27 марта 2023 г.
  9. ^ Уиллер, Дэвид А. Противодействие доверительному доверию посредством разнообразной двойной компиляции . АКСАК.
  10. ^ «Guix еще больше сокращает начальную загрузку до 25% — 2020 — Блог — GNU Guix» .
  11. ^ «Загрузочные сборки» . bootstrapable.org . Проверено 29 марта 2023 г.
  12. ^ «Синпи» . Архивировано из оригинала 20 ноября 2008 года . Проверено 27 марта 2023 г.
  13. ^ «JSLinux» . Bellard.org . Проверено 27 марта 2023 г.
  14. ^ «Супер микро шахматы» . СоурсФордж . Проверено 27 марта 2023 г.
  15. ^ «TCC: Tiny C Compiler» . 4 февраля 2012 года. Архивировано из оригинала 4 февраля 2012 года . Проверено 27 марта 2023 г.
  16. ^ «Неофициальные патчи tcc» . www.dododge.net . Архивировано из оригинала 31 марта 2007 года . Проверено 27 марта 2023 г.
  17. ^ «Debian — Подробная информация о пакете tcc в sid» . packages.debian.org . Проверено 27 марта 2023 г.
  18. ^ grischka, Публичный хостинг Git для tcc
  19. ^ grischka, ветка мобов для tcc
  20. ^ «Компилятор Tiny C — Краткое описание [Саванна]» . savannah.nongnu.org . Проверено 27 марта 2023 г.
  21. ^ "Архивы tinycc-devel" . lists.gnu.org . Проверено 27 марта 2023 г.
  22. ^ «Публичный хостинг Git — tinycc.git/summary» . repo.or.cz. ​Проверено 27 марта 2023 г.
  23. ^ «[Tinycc-devel] Вышла версия TCC 0.9.27» . lists.nongnu.org . Проверено 27 марта 2023 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 4aac4a409350687b77c5711fa8b2ddf4__1712232900
URL1:https://arc.ask3.ru/arc/aa/4a/f4/4aac4a409350687b77c5711fa8b2ddf4.html
Заголовок, (Title) документа по адресу, URL1:
Tiny C Compiler - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)