Крошка компилятор C ( так называемый TCC TCC, или TinyCC) является x86 , x86-64 и ARM процессор C компилятор изначально написан Беллар . Он разработан для работы на медленных компьютерах с небольшим дисковым пространством (например, на аварийных дисках). Поддержка операционной системы Windows была добавлена в версии 0.9.23 (17 июня 2005 г.). TCC распространяется под Стандартной общественной лицензией ограниченного применения GNU .
Разработчики) | Фабрис Беллар |
---|---|
Стабильный выпуск | 0.9.27 / 17 декабря 2017 г . |
Репозиторий | репо |
Написано в | C и сборка [ необходима ссылка ] |
Операционная система | Linux , Unix , Windows |
Предшественник | OTCC, запутанный компилятор Tiny C [1] |
Тип | Компилятор C |
Лицензия | LGPLv2.1 |
Веб-сайт | Bellard |
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]
- 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. [ необходима цитата ]
- С tcc, измененным для компиляции GCC, запуск cc1 (компилятор GCC C) на самом себе потребовал 518 секунд при компиляции с использованием GCC 3.4.2, 558 секунд с использованием GCC 2.95.3, 545 с использованием компилятора Microsoft C и 1145 секунд с использованием tcc. Уровень оптимизации в каждом компиляторе был -O1 или аналогичный. [6]
Использует
- TCCBOOT, [7] хак где TCC загружает и загружается Linux ядра от источника примерно 10 секунд. Другими словами, это «загрузчик», который считывает исходный код ядра Linux с диска, записывает исполняемые инструкции в память и запускает его. Это потребовало изменений в процессе сборки Linux.
- TCC использовался для демонстрации защиты от атаки доверия . [8]
- TCC использовался для компиляции GCC, хотя для этой работы требовались различные исправления. [9]
- Cinpy [10] - это библиотека Python, которая позволяет вам реализовывать функции с помощью C в модулях Python. Функции компилируются с TCC во время выполнения. Результаты становятся доступными для вызова в Python через библиотеку ctypes.
- Поставляется установленным на JavaScript Linux [11] (также Bellard).
- Используется в качестве справочника для скомпилированной версии исходного кода шахматной программы super micro-max. [12]
История
TCC берет свое начало в Obfuscated Tiny C Compiler (OTCC) [1], программе, которую Беллард написал для победы в Международном конкурсе запутанного кода C (IOCCC) в 2001 году. После этого Беллард расширил и деобфусцировал программу для создания tcc. [1]
Незадолго до 4 февраля 2012 года Фабрис Беллар обновил официальную веб-страницу проекта, чтобы сообщить, что он больше не работает над TCC. [13]
После ухода Белларда из проекта различные люди и группы распространяли патчи или поддерживали форки TCC, чтобы развить или исправить проблемы с TCC. Это включает в себя коллекцию неофициальных исправлений tcc Дейва Доджа, [14] последующие исправления Debian и kfreebsd, [15] и исправления gcc от grischka. [6] Гришка также создал публичный репозиторий Git для проекта [16], который содержит ветку mob [17], куда были добавлены многочисленные дополнения, включая общую сборку, кросс-компиляторы и совместимость с SELinux. Репозиторий Grischka позже стал официальным репозиторием TCC (ссылка на страницу проекта Фабриса Белларда Savannah [18] ).
Текущее состояние
По состоянию на декабрь 2017 года как в официальном списке рассылки TCC [19], так и в официальном репозитории Git (ссылка на который находится на странице проекта Саванна Фабриса Белларда [20] ) наблюдается активное обсуждение и разработка многими разработчиками и заинтересованными пользователями. В декабре 2017 года grischka объявил в списке рассылки о выпуске TCC версии 0.9.27. [21]
Смотрите также
- Коллекция компиляторов GNU
- LCC (компилятор)
- Портативный компилятор C (PCC)
- Маленький-C
Рекомендации
- ^ a b c Беллар, Фабрис. Обфусцированный Tiny C Compiler , победитель конкурса IOCCC 2001. https://bellard.org/otcc/ и в Интернет-архиве https://web.archive.org/web/20130721162702/http://www.ioccc.org / 2001 /
- ^ Справочная документация по компилятору Tiny C, доступ к которой выполнен 07 августа 2008 г.
- ^ Согласно списку TODO проекта,единственной отсутствующей функцией C99 являются сложные типы. Массивы переменной длины были добавлены в TCC 0.9.26.
- ^ Домашняя страница Tiny C Compiler
- ^ Глёкнер, Даниэль. Re: Tinycc-devel (без темы) , 8 сентября 2006 г.
- ^ a b grischka, GCC от TCC (некоторые исправления) , 29 сентября 2005 г.
- ^ TCCBOOT
- ^ Уиллер, Дэвид А. Противодействие доверию через разнообразную двойную компиляцию . ACSAC.
- ^ tinycc-devel (поток)
- ^ Cinpy архивации 2008-11-20 в Wayback Machine
- ^ JavaScript Linux
- ^ Супер Микро-Max движок
- ↑ Самый старый снимок домашней страницы TCC с archive.org, на котором показано объявление Фабриса Белларда о прекращении работы над TCC.
- ^ Коллекции Дэйва Додж неофициального TCC патчи в архив 2007-03-31 в Wayback Machine
- ^ Последующие патчи Debian и kfreebsd
- ^ grischka, Публичный хостинг Git для tcc
- ^ grischka, моб ветка для tcc
- ^ Официальная страница проекта Саванна
- ^ Официальный список рассылки TCC
- ^ Официальный репозиторий исходного кода Git
- ^ Официальный список рассылки TCC, запись 27 декабря 2017 г.
Внешние ссылки
- Официальный веб-сайт
- Список активной рассылки TCC
- Репозиторий исходного кода
- PTSource IDE - интегрированная среда разработки включает TCC.