อ่าน 5 นาที
คอมไพเลอร์ Tiny C
Tiny C Compilerหรือ TCC, tCc หรือ TinyCC เป็นคอม ไพเลอร์ภาษาซี ที่กำหนดเป้าหมายไปที่สถาปัตยกรรม x86 (32 บิต), x86-64และARMซึ่งเขียนขึ้นครั้งแรกโดยFabrice
คอมไพเลอร์ Tiny C
| คอมไพเลอร์ Tiny C | |
|---|---|
ภาพหน้าจอ | |
| นักพัฒนา | ฟาบริซ เบลลาร์ด |
| เวอร์ชันเสถียร | 0.9.27 / 17 ธันวาคม 2017 |
| เขียนเป็น | Cและการประกอบ |
| ระบบปฏิบัติการ | ลินุกซ์ , ยูนิกซ์ , วินโดวส์ |
| ผู้มาก่อน | OTCC, คอมไพเลอร์ Tiny C ที่ถูกทำให้คลุมเครือ[ 1 ] |
| พิมพ์ | คอมไพเลอร์C |
| ใบอนุญาต | LGPLv2.1 |
| เว็บไซต์ | bellard.org/tcc/ |
| ที่เก็บข้อมูล |
|
Tiny C Compilerหรือ TCC, tCc หรือ TinyCC เป็นคอม ไพเลอร์ภาษาซี ที่กำหนดเป้าหมายไปที่สถาปัตยกรรม x86 (32 บิต), x86-64และARMซึ่งเขียนขึ้นครั้งแรกโดยFabrice Bellardมันถูกออกแบบมาให้ใช้งานได้กับคอมพิวเตอร์ที่ทำงานช้าและมีพื้นที่ดิสก์เหลือน้อย (เช่น ในดิสก์กู้ระบบ ) การรองรับระบบปฏิบัติการ Windowsถูกเพิ่มเข้ามาในเวอร์ชัน 0.9.23 (17 มิถุนายน 2548) TCC เผยแพร่ภายใต้สัญญาอนุญาต GNU Lesser General Public License
TCC อ้างว่าได้นำ มาตรฐาน ANSI C (C89/C90) ทั้งหมดมาใช้[ 2 ]มาตรฐาน ISO C99ส่วนใหญ่[ 3 ]และส่วนขยาย GNU C จำนวนมาก รวมถึงการประกอบแบบ อิน ไลน์
คุณสมบัติ
TCC มีคุณสมบัติหลายประการที่แตกต่างจากคอมไพเลอร์ภาษา C อื่นๆ ในปัจจุบัน:
- เนื่องจากขนาดไฟล์เล็ก (ประมาณ 100 KB สำหรับไฟล์ปฏิบัติการ x86 TCC) และใช้หน่วยความจำน้อยจึงสามารถใช้งานได้โดยตรงจากฟลอปปี้ดิสก์ขนาด 1.44 MB แผ่นเดียว เช่น ดิสก์กู้ระบบ
- TCC มีจุดประสงค์เพื่อสร้างโค้ด x86, x86-64 และ ARM ดั้งเดิมได้อย่างรวดเร็วมาก ตามที่ Bellard กล่าวไว้ TCC สามารถคอมไพล์ แอสเซมบลี และลิงก์ได้เร็วกว่า GCC ประมาณเก้าเท่า[ 4 ]ณปี 2023 สาขาการพัฒนา "mob" ยังรวมถึงการสนับสนุนRISC-VและTMS320C67xx ( ชิป DSP ) ด้วย
- TCC มีคุณลักษณะเฉพาะของภาษาหลายประการที่ออกแบบมาเพื่อปรับปรุงการใช้งานให้มีประสิทธิภาพยิ่งขึ้น เช่น ตัวตรวจสอบหน่วยความจำและขอบเขตที่เป็นตัวเลือก เพื่อเพิ่มเสถียรภาพของโค้ด
- TCC อนุญาตให้เรียกใช้โปรแกรมโดยอัตโนมัติในระหว่างการคอมไพล์โดยใช้สวิตช์บรรทัดคำสั่ง ซึ่งช่วยให้สามารถเรียกใช้โปรแกรมเป็นสคริปต์เชลล์ภายใต้ระบบที่คล้าย Unix ซึ่งรองรับ ไวยากรณ์ คำสั่งแปลshebang shebang สำหรับ TCC (ตามที่ระบุไว้ในเว็บไซต์ TCC อย่างเป็นทางการ) [ 2 ]คือ(สมมติว่า TCC ติดตั้งอยู่ที่ตำแหน่งการติดตั้งอาจแตกต่างกันไปตามระบบ) [ 5 ]
#!/usr/local/bin/tcc -run/usr/local/bin/tcc
ประสิทธิภาพของโปรแกรมที่รวบรวมไว้
โดยทั่วไป การใช้งาน TCC เน้นความเล็กมากกว่าผลลัพธ์ที่มีประสิทธิภาพสูงสุด TCC สร้างโค้ดในรอบเดียวและไม่ได้ทำการเพิ่มประสิทธิภาพส่วนใหญ่ที่คอมไพเลอร์อื่นทำ TCC คอมไพล์แต่ละคำสั่งแยกกัน และเมื่อสิ้นสุดแต่ละคำสั่ง ค่า รีจิสเตอร์จะถูกเขียนกลับไปยังสแต็กและต้องอ่านใหม่แม้ว่าบรรทัดถัดไปจะใช้ค่าในรีจิสเตอร์ (สร้างคู่บันทึก/โหลดที่ไม่จำเป็นระหว่างคำสั่ง) TCC ใช้รีจิสเตอร์ที่มีอยู่เพียงบางส่วนเท่านั้น (เช่น บน x86 จะไม่ใช้ ebx, esi หรือ edi เพราะต้องเก็บรักษาไว้ระหว่างการเรียกฟังก์ชัน) [ 6 ]
TCC ดำเนิน การปรับแต่งประสิทธิภาพบางอย่างเช่นการส่งต่อค่าคงที่สำหรับทุกการดำเนินการ การคูณและการหารจะถูกปรับให้เหมาะสมโดย ใช้ การเลื่อนบิตเมื่อเหมาะสม และตัวดำเนินการเปรียบเทียบจะได้รับการปรับแต่งเป็นพิเศษ (โดยการเก็บแคชพิเศษสำหรับแฟล็กของโปรเซสเซอร์) นอกจากนี้ยังมีการจัดสรรรีจิสเตอร์ อย่างง่าย ซึ่งช่วยป้องกันการบันทึก/โหลดข้อมูลที่ไม่จำเป็นจำนวนมากภายในคำสั่งเดียว
ต่อไปนี้เป็นตัวอย่างมาตรฐานสองตัวอย่าง:
- การคำนวณเลข ฟิโบนาชี่แบบเรียกซ้ำ บนแล็ปท็อป Intel Centrino 1.8 GHz ที่มี RAM 512 MB แสดงให้เห็นความแตกต่างอย่างเห็นได้ชัดในผลลัพธ์ระหว่าง คอมไพเลอร์ Microsoft Visual C++เวอร์ชัน 13.10.3052 และ TCC โดยโปรแกรม MS Visual C++ ใช้เวลานานกว่าโปรแกรมที่คอมไพล์ด้วย TCC ประมาณ 18% ในการคำนวณเลขฟิโบนาชี่ลำดับที่ 49
- การทดสอบเปรียบเทียบคอมไพเลอร์ C ต่างๆ โดยใช้คอมไพเลอร์เหล่านั้นในการคอมไพล์GNU C Compiler (GCC) เอง จากนั้นใช้คอมไพเลอร์ที่ได้มาในการคอมไพล์ GCC อีกครั้ง เมื่อเปรียบเทียบกับ GCC 3.4.2 แล้ว TCC ที่แก้ไขเพื่อคอมไพล์ GCC สามารถคอมไพล์คอมไพเลอร์ได้เร็วกว่าถึงสิบเท่า แต่ไฟล์ .exe ที่ได้จะมีขนาดใหญ่ขึ้น 57% และทำงานช้าลงมาก โดยใช้เวลานานขึ้น 2.2 เท่าในการคอมไพล์ GCC อีกครั้ง[ 7 ]
ผลการทดสอบพบว่า การรัน cc1 (คอมไพเลอร์ C ของ GCC) ใช้เวลา 518 วินาทีเมื่อคอมไพล์ด้วย GCC 3.4.2, 545 วินาทีเมื่อใช้คอมไพเลอร์ C ของ Microsoft และ 1145 วินาทีเมื่อใช้ TCC ส่วนการสร้างคอมไพเลอร์เหล่านี้ GCC (3.4.2) ใช้เวลา 744 วินาที ในขณะที่ TCC ใช้เวลาเพียง 73 วินาที ระดับการปรับแต่งประสิทธิภาพในแต่ละคอมไพเลอร์คือ -O1 หรือใกล้เคียงกัน
การใช้งาน
- TCCBOOT [ 8 ]เป็นเทคนิคที่ TCC โหลดและบูตเคอร์เนล Linuxจากซอร์สโค้ดในเวลาประมาณ 10 วินาที กล่าวคือ เป็น " บูตโหลดเดอร์ " ที่อ่านซอร์สโค้ด เคอร์เนล Linux จากดิสก์ เขียนคำสั่งที่สามารถเรียกใช้งานได้ลงในหน่วยความจำ และเริ่มการทำงาน ซึ่งจำเป็นต้องมีการเปลี่ยนแปลงในกระบวนการสร้าง Linux
- TCC ถูกใช้เพื่อคอมไพล์ GCC แม้ว่า จะต้องมี การแก้ไข หลายอย่าง เพื่อให้ใช้งานได้[ 9 ]
- TCC ถูกใช้เพื่อสาธิตการป้องกันการโจมตีความไว้วางใจ[ 10 ]นอกจากนี้ยังใช้ในGNU Guix [ 11 ]ในความพยายามที่จะทำให้การแจกจ่ายสามารถบูตได้โดยไม่ต้องใช้ไบนารีใดๆ[ 12 ]
- Cinpy [ 13 ]เป็นไลบรารีPython ที่อนุญาตให้คุณใช้งานฟังก์ชันด้วยภาษา C ในโมดูล Python ฟังก์ชันเหล่านี้จะถูกคอมไพล์ด้วย TCC ในขณะรันไทม์ ผลลัพธ์ที่ได้จะสามารถเรียกใช้งานได้ใน Python ผ่านไลบรารี ctypes [ 14 ]
- TCC ถูกใช้เป็นข้อมูลอ้างอิงสำหรับเวอร์ชันที่คอมไพล์ของซอร์สโค้ดโปรแกรม Super Micro-Max Chess [ 15 ]
- Bunใช้ TCC เพื่อเปิดเผย API ที่อนุญาตให้ผู้ใช้คอมไพล์และรันโปรแกรม C จาก JavaScript [ 16 ]
ประวัติศาสตร์
TCC มีต้นกำเนิดมาจาก Obfuscated Tiny C Compiler (OTCC) [ 1 ]ซึ่งเป็นโปรแกรมที่ Bellard เขียนขึ้นเพื่อชนะการแข่งขัน International Obfuscated C Code Contest (IOCCC) ในปี 2001 หลังจากนั้น Bellard ได้ขยายและถอดรหัสโปรแกรมดังกล่าวเพื่อสร้าง tcc [ 1 ]
ก่อนวันที่ 4 กุมภาพันธ์ 2012 Fabrice Bellard ได้อัปเดตหน้าเว็บอย่างเป็นทางการของโครงการเพื่อรายงานว่าเขาไม่ได้ทำงานเกี่ยวกับ TCC อีกต่อไป[ 17 ]
นับตั้งแต่ Bellard ออกจากโครงการ บุคคลและกลุ่มต่างๆ ได้แจกจ่ายแพตช์หรือดูแลฟอร์กของ TCC เพื่อสร้างหรือแก้ไขปัญหาของ TCC ซึ่งรวมถึงชุดแพตช์ tcc ที่ไม่เป็นทางการของ Dave Dodge [ 18 ] แพตช์ดาวน์สตรีมของ Debianและ kfreebsd [ 19 ]และแพตช์ gcc ของ grischka [ 7 ] Grischka ยังได้ตั้งค่าที่เก็บGit สาธารณะ สำหรับโครงการ[ 20 ]ซึ่งมีสาขา mob [ 21 ]ที่มีการเพิ่มผลงานมากมาย รวมถึงการสร้างร่วมกัน คอมไพเลอร์ข้ามแพลตฟอร์มและ ความเข้ากันได้ กับ SELinuxที่เก็บ GIT ของ Grischka ต่อมากลายเป็นที่เก็บ TCC อย่างเป็นทางการ (เชื่อมโยงโดยหน้าโครงการ Savannah ของ Fabrice Bellard) [ 22 ]
สถานะปัจจุบัน
ณ เดือนธันวาคม 2017 ทั้งรายชื่อผู้รับจดหมายอย่างเป็นทางการของ TCC [ 23 ]และที่เก็บ Git อย่างเป็นทางการ (ตามที่เชื่อมโยงโดยหน้าโครงการGNU Savannah ของ Fabrice Bellard [ 24 ] ) แสดงให้เห็นถึงการอภิปรายและการพัฒนาอย่างแข็งขันโดยนักพัฒนาและผู้ใช้ที่สนใจจำนวนมาก ในเดือนธันวาคม 2017 grischka ได้ประกาศในรายชื่อผู้รับจดหมายว่า TCC เวอร์ชัน 0.9.27 ได้รับการเผยแพร่แล้ว[ 25 ]
ดูเพิ่มเติม
- ชุดคอมไพเลอร์ GNU
- คอมไพเลอร์ C แบบพกพา (PCC)
- LCC (คอมไพเลอร์)
- ซีเล็ก
- คอมไพเลอร์ C สำหรับอุปกรณ์ขนาดเล็ก (SDCC)
- PicoCคือตัวแปลภาษาสำหรับภาษาที่คล้ายกับภาษาซี
- Java Cardเป็นส่วนย่อยที่คล้ายกันของภาษาที่ใหญ่กว่า
- Open Watcom C/C++ - คอมไพเลอร์ C/C++/Fortran x86 ฟรี สำหรับ DOS, OS/2, Windows และ Linux
ลิงก์ภายนอก
- รายชื่อผู้รับจดหมายที่ใช้งานอยู่ของ TCC
- PTSource IDE - สภาพแวดล้อมการพัฒนาแบบบูรณาการซึ่งรวมถึง TCC ด้วย
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ คอมไพเลอร์ Tiny C
Tiny C Compilerหรือ TCC, tCc หรือ TinyCC เป็นคอม ไพเลอร์ภาษาซี ที่กำหนดเป้าหมายไปที่สถาปัตยกรรม x86 (32 บิต), x86-64และARMซึ่งเขียนขึ้นครั้งแรกโดยFabrice
คุณสมบัติ
TCC มีคุณสมบัติหลายประการที่แตกต่างจากคอมไพเลอร์ภาษา C อื่นๆ ในปัจจุบัน:
ประสิทธิภาพของโปรแกรมที่รวบรวมไว้
โดยทั่วไป การใช้งาน TCC เน้นความเล็กมากกว่าผลลัพธ์ที่มีประสิทธิภาพสูงสุด TCC สร้างโค้ดใน รอบเดียว และไม่ได้ทำการเพิ่มประสิทธิภาพส่วนใหญ่ที่คอมไพเลอร์อื่นทำ TCC คอมไพล์แต่ละคำสั่งแยกกัน และเมื่อสิ้นสุดแต่ละคำสั่ง ค่า รีจิสเตอร์ จะถูกเขียนกลับไปยัง สแต็ก...
การใช้งาน
TCCBOOT [ 8 ] เป็น เทคนิค ที่ TCC โหลดและบูต เคอร์เนล Linux จากซอร์สโค้ดในเวลาประมาณ 10 วินาที กล่าวคือ เป็น " บูตโหลดเดอร์ " ที่อ่าน ซอร์สโค้ด เคอร์เนล Linux จากดิสก์ เขียนคำสั่งที่สามารถเรียกใช้งานได้ลงในหน่วยความจำ และเริ่มการทำงาน...