کامپایلر کوچک C (با نام مستعار tCc, TCC یا TinyCC) کامپایلر C پردازنده x86، X86-64 و ARM است که توسط فابریس بلارد ایجاد شدهاست.[۱] این کامپایلر برای کار کردن روی رایانه های کند و با فضای ذخیرهسازی کم طراحی شدهاست (به عنوان مثال در دیسکهای نجات). پشتیبانی سیستم عامل ویندوز در نسخه ۰٫۹٫۲۳ (۱۷ ژوئن ۲۰۰۵) اضافه شد. TCC تحت مجوز عمومی GNU توزیع شدهاست.
TCC ادعا میکند که کلیه استاندارد C89 / C90) ANSI C) را پیادهسازی کردهاست،[۲] بسیاری از استاندارد ISO C99،[۳] و بسیاری از برنامههای افزودنی GNU C از جمله زبان اسمبلی درون خطی پیادهسازی کردهاست.
امکانات
TCC دارای چندین ویژگی است که آن را از دیگر کامپایلرهای جریان فعلی C متمایز میکند:
- اندازه فایل آن (حدود ۱۰۰ کیلوبایت برای قابل اجرایی x86 TCC) و حافظه اشغالی اجازه میدهد تا مستقیماً از یک فلاپی دیسک 1.44 M، مانند دیسک نجات استفاده شود.
- TCC در نظر گرفته شدهاست که بسیار سریع کد x86، x86-64 و ARM را تولید کند. طبق گفته Bellard، تقریباً ۹ برابر سریعتر از GCC، کامپایل، مونتاژ و پیوند کتابخانه را انجام میدهد.[۴]
- TCC دارای تعدادی از ویژگیهای خاص زبان کامپایلر است که برای بهبود عملی آن، از قبیل حافظه اختیاری و جستجوگر محدود، برای بهبود ثبات کدها در نظر گرفته شدهاست.
- TCC اجازه میدهد تا برنامهها بهطور خودکار در زمان کامپایل با استفاده از یک سوئیچ خط فرمان اجرا شوند. این اجازه میدهد تا برنامهها به عنوان یک اسکریپت پوسته تحت سیستمهای مانند یونیکس اجرا شوند که از دستورات نحوی راهنمای مفسر Shebang پشتیبانی میکنند.
عملکرد برنامه کامپایل شده
اگرچه کامپایلر TCC خود فوقالعاده سریع است، بین اندازه کامپایلر و عملکرد کدی که TCC تولید میکند، نسبت ذاتی وجود دارد.
TCC چند بهینهسازی از قبیل انتشار مداوم برای کلیه عملیاتها را انجام میدهد، ضربها و تقسیمها در صورت لزوم بهینهسازی میشوند و عملگرهای مقایسه بهطور ویژه بهینه میشوند (با حفظ حافظه پنهان (cache) مخصوص flagهای پردازنده). این کار همچنین برخی از تخصیص ثبات ساده را انجام میدهد، که از بسیاری از جفتهای صرفه جویی / بار اضافی در داخل یک Statement برنامهنویسی جلوگیری میکند.
بهطور کلی، ساختار TCC به جای نتایج بهینه عملکرد بر کوچک بودن تأکید میکند. TCC کدها را در یک گذر واحد برنامه تولید میکند و اکثر بهینهسازیهای انجام شده توسط دیگر کامپایلرها را انجام نمیدهد. TCC هر Statement برنامهنویسی را به تنهایی گردآوری میکند، و در پایان هر بیانیه مقادیر ثبت و به پشته برگردانده میشوند و باید دوباره خوانده شود حتی اگر خط بعدی از مقادیر در رجیسترها استفاده کند (ایجادهای ذخیره بیرونی / بار بین جفت Statementهای برنامهنویسی). TCC فقط از برخی از ثبتهای موجود استفاده میکند (به عنوان مثال، در x86 هرگز از ebx , esi یا edi استفاده نمیکند زیرا باید در فراخوانی تابع حفظ شود).[۵]
در اینجا دو مثال وجود دارد:
- یک الگوریتم بازگشتی فیبوناچی در لپ تاپ GHz 1.8 Intel Centrino با ۵۱۲ RAM MB تفاوت قابل توجهی در نتایج بین کامپایلر Microsoft Visual C ++ 13.10.3052 و TCC نشان میدهد. برای محاسبه شماره ۴۹ فیبوناچی، یک برنامه MS Visual C ++ تقریباً ۱۸٪ بیشتر از برنامه تدوین شده TCC طول کشید. [نیازمند منبع]
- با استفاده از یک tcc اصلاح شده برای کامپایل کردن GCC، اجرای cc1 (کامپایلر GCC C) به خودی خود ۵۱۸ ثانیه نیاز دارد تا هنگام استفاده از GCC 3.4.2، ۵۵۸ ثانیه با استفاده از GCC 2.95.3، ۵۴۵ با استفاده از کامپایلر Microsoft C و ۱۱۴۵ ثانیه با استفاده از TCC طول میکشد. سطح بهینهسازی در هر کامپایلر -O1 یا مشابه بود.[۶]
استفادهها
- TCCBOOT ,[۷] در جایی که TCC حدود ۱۰ ثانیه هسته هسته لینوکس را از منبع خود بارگیری و بوت میکند. یعنی «بوت لودر» است که کد منبع هسته لینوکس را از دیسک میخواند، دستورالعملهای اجرایی را روی حافظه مینویسد و شروع به اجرای آن میکند. این امر نیاز به تغییر در روند ساخت لینوکس داشت.
- از TCC برای نشان دادن دفاع در مقابل حمله اعتماد استفاده شد.[۸]
- TCC برای کامپایل GCC استفاده شدهاست، اگرچه برای تهیه این کار تکههای مختلفی لازم بود.[۹]
- Cinpy[۱۰] یک کتابخانه پایتون است که به شما امکان میدهد عملکردهایی را با C در ماژولهای پایتون پیادهسازی کنید. توابع با TCC در زمان اجرا کامپایل میشوند. نتایج از طریق کتابخانه ctypes در پایتون قابل تماس میباشد.
- نصب شده بر روی JavaScript Linux[۱۱] (همچنین توسط Bellard).
- به عنوان مرجع برای نسخه کاملی از منبع برنامه شطرنج فوقالعاده کوچک-حداکثر استفاده شدهاست.[۱۲]
تاریخ
TCC منشأ آن را در کامپایلر OTCC) Obfuscated Tiny C) تشکیل میدهد، برنامه ای که Bellard برای برنده شدن در مسابقه بینالمللی C Code Obfuscated C در سال ۲۰۰۱ نوشت. پس از آن زمان، Bellard برنامه را غیرفعال کرد تا TCC را تولید و گسترش بدهد.[۱۳]
در برخی از زمان قبل از ۴ فوریه ۲۰۱۲، Fabrice Bellard صفحه رسمی این پروژه را به روز کرد تا گزارش دهد که دیگر در TCC کار نمیکند.[۱۴]
از زمان خروج بلارد از این پروژه، افراد و گروههای مختلف تکههایی را توزیع کردهاند یا forkهای TCC را برای ساختن یا حل مشکلات با TCC حفظ کردهاند. این شامل مجموعه Dave Dodge از پتچهای tcc غیررسمی،[۱۵] پتچهای پایین دست Debian و kfreebsd ,[۱۶] و پتچهای gccka grischka است.[۶] Grischka همچنین راه اندازی یک مخزن دستگاه گوارش عمومی برای پروژه[۱۷] است که شامل یک شاخه mob[۱۸] که در آن کمکهای متعدد، از جمله ساخت مشترک، متقابل کامپایلرها، و سازگاری SELinux را اضافه شدند. مخزن GIT Grischka بعداً تبدیل به مخزن رسمی TCC شد (به صفحه پروژه ساوانا فابریس بلارد پیوند داده شد[۱۹]).
وضعیت فعلی
از دسامبر سال ۲۰۱۷، هر دو لیست پستی رسمی TCC[۲۰] و مخزن رسمی Git (همانطور که توسط صفحه پروژه Fabrice Bellard Savannah[۲۱]) توسط بسیاری از توسعه دهندگان و کاربران علاقهمند بحث و توسعه فعال نشان میدهد. در دسامبر سال ۲۰۱۷، grischka در لیست پستی اعلام کرد نسخه TCC 0.9.27 نسخه منتشر شدهاست.[۲۲]
جستارهای وابسته
منابع
- ↑ "GitHub - TinyCC/tinycc: Unofficial mirror of mob development branch". GitHub (به انگلیسی). Retrieved 2021-08-10.
- ↑ Tiny C Compiler Reference Documentation accessed on 2008-08-07
- ↑ According to the project's TODO list complex types are the only missing C99 feature. Variable Length Arrays have been added in TCC 0.9.26
- ↑ Tiny C Compiler homepage
- ↑ Glöckner, Daniel. Re: Tinycc-devel (no subject), September 8, 2006.
- ↑ ۶٫۰ ۶٫۱ grischka, GCC by TCC (some fixes), 29 Sep 2005
- ↑ TCCBOOT
- ↑ Wheeler, David A. Countering Trusting Trust through Diverse Double-Compiling. ACSAC.
- ↑ tinycc-devel (thread)
- ↑ Cinpy بایگانیشده در ۲۰۰۸-۱۱-۲۰ توسط Wayback Machine
- ↑ JavaScript Linux
- ↑ Super Micro-Max Chess Engine
- ↑ Bellard, Fabrice. Obfuscated Tiny C Compiler
- ↑ The oldest archive.org snapshot of the TCC home page showing Fabrice Bellard's announcement of ceasing work on TCC.
- ↑ Dave Dodge's collection of unofficial tcc patches بایگانیشده در ۲۰۰۷-۰۳-۳۱ توسط Wayback Machine
- ↑ Debian and kfreebsd downstream patches
- ↑ grischka, Public Git Hosting for tcc
- ↑ grischka, mob branch for tcc
- ↑ Official Savannah project page
- ↑ Official TCC mailing list
- ↑ Official Git source code repository
- ↑ Official TCC mailing list, 2017-12-27 entry
پیوند به بیرون