อ่าน 18 นาที
ชุดคอมไพเลอร์ GNU
GNU Compiler Collection ( GCC ; เดิมชื่อ GNU C Compiler ) เป็นชุด คอมไพเลอร์ จาก โครงการ GNU ที่รองรับ ภาษาโปรแกรม สถาปัตยกรรม ฮาร์ดแวร์ และ ระบบปฏิบัติการ ต่างๆ มูลนิธิ...
ชุดคอมไพเลอร์ GNU
| ชุดคอมไพเลอร์ GNU | |
|---|---|
ภาพหน้าจอแสดงการคอมไพล์ซอร์สโค้ดของ GCC 10.2 | |
| ผู้เขียนต้นฉบับ | ริชาร์ด สตอลล์แมน |
| นักพัฒนา | โครงการ GNU |
| ปล่อย | 22 มีนาคม พ.ศ. 2530 [ 1 ] |
| เวอร์ชันเสถียร | 16.1 [ 2 ] |
| เขียนเป็น | C , C++ [ 3 ] |
| ระบบปฏิบัติการ | ข้ามแพลตฟอร์ม |
| แพลตฟอร์ม | GNUและอื่นๆ อีกมากมาย |
| ขนาด | ~15 ล้านLOC [ 4 ] |
| มีจำหน่ายใน | ภาษาอังกฤษ |
| พิมพ์ | คอมไพเลอร์ |
| ใบอนุญาต | GPLv3+พร้อมข้อยกเว้นไลบรารีรันไทม์ GCC [ 5 ] |
| เว็บไซต์ | gcc |
| ที่เก็บข้อมูล |
|
GNU Compiler Collection ( GCC ; เดิมชื่อGNU C Compiler ) เป็นชุดคอมไพเลอร์จากโครงการ GNUที่รองรับภาษาโปรแกรมสถาปัตยกรรมฮาร์ดแวร์และระบบปฏิบัติการ ต่างๆ มูลนิธิซอฟต์แวร์เสรี (FSF) แจกจ่าย GCC เป็นซอฟต์แวร์เสรีภายใต้สัญญาอนุญาตสาธารณะทั่วไปของ GNU (GNU GPL) GCC เป็นส่วนประกอบสำคัญของชุดเครื่องมือ GNUซึ่งใช้สำหรับโครงการส่วนใหญ่ที่เกี่ยวข้องกับGNUและเคอร์เนล Linuxด้วยโค้ดประมาณ 15 ล้านบรรทัดในปี 2019 GCC จึงเป็นหนึ่งในโปรแกรมเสรีที่ใหญ่ที่สุดที่มีอยู่[ 4 ]มันมีบทบาทสำคัญในการเติบโตของซอฟต์แวร์เสรีทั้งในฐานะเครื่องมือและตัวอย่าง
เมื่อ GCC 1.0 เปิดตัวครั้งแรกในปี 1987 โดยRichard Stallman มันถูกตั้งชื่อว่า GNU C Compilerเนื่องจากมันรองรับเฉพาะภาษาโปรแกรม Cเท่านั้น[ 1 ] ต่อมา ได้มีการขยายให้สามารถคอมไพล์C++ ได้ ในเดือนธันวาคมของปีนั้น ต่อมาได้มีการพัฒนา ส่วนหน้าสำหรับObjective-C , Objective-C++ , Fortran , Ada , Go , D , Modula-2 , Rust , COBOLและALGOL 68เป็นต้น[ 6 ] นอกจากนี้ คอมไพ เลอร์ C และ C++ ยังรองรับข้อกำหนดOpenMP และOpenACC อีกด้วย [ 7 ] [ 8 ]
นอกจากจะเป็นคอมไพเลอร์อย่างเป็นทางการของระบบปฏิบัติการ GNUแล้ว GCC ยังได้รับการยอมรับให้เป็นคอมไพเลอร์มาตรฐานโดยระบบปฏิบัติการคอมพิวเตอร์แบบ Unix สมัยใหม่อื่นๆ อีกมากมาย รวมถึงการแจกจ่ายLinux ส่วนใหญ่ ระบบปฏิบัติการตระกูล BSD ส่วนใหญ่ ก็เปลี่ยนมาใช้ GCC ไม่นานหลังจากที่เปิดตัว แม้ว่าหลังจากนั้นFreeBSDและApple macOSจะเปลี่ยนไปใช้ คอม ไพเลอร์Clang [ 9 ]ซึ่งส่วนใหญ่เกิดจากเหตุผลด้านลิขสิทธิ์[ 10 ] [ 11 ] [ 12 ] GCC ยังสามารถคอมไพล์โค้ดสำหรับระบบปฏิบัติการที่เข้ากันได้ กับ Windows , Android , iOS , Solaris , HP-UX , AIXและMS-DOS ได้อีกด้วย [ 13 ]
GCC ได้รับการพอร์ตไปยังแพลตฟอร์มและสถาปัตยกรรมชุดคำสั่งมากกว่าคอมไพเลอร์อื่น ๆ และถูกนำไปใช้อย่างกว้างขวางในฐานะเครื่องมือในการพัฒนาซอฟต์แวร์ทั้งแบบโอเพนซอร์สและแบบกรรมสิทธิ์ นอกจากนี้ GCC ยังพร้อมใช้งานสำหรับระบบฝังตัว หลายระบบ รวมถึงชิปที่ใช้ ARMและPower ISA ด้วย
ประวัติศาสตร์
ในช่วงปลายปี 1983 ในความพยายามที่จะเริ่มต้นระบบปฏิบัติการGNU ริชาร์ด สตอลล์แมนได้ขอ อนุญาตจาก แอนดรูว์ เอส. ทาเนนบอมผู้เขียนAmsterdam Compiler Kit (หรือที่รู้จักกันในชื่อFree University Compiler Kit ) เพื่อใช้ซอฟต์แวร์นั้นสำหรับ GNU เมื่อทาเนนบอมแจ้งเขาว่าตัวคอมไพเลอร์เองนั้นไม่ฟรี แต่เป็นเพียงของมหาวิทยาลัยเท่านั้น สตอลล์แมนจึงตัดสินใจที่จะทำงานกับคอมไพเลอร์ตัวอื่น[ 14 ]แผนเริ่มต้นของเขาคือการเขียนคอมไพเลอร์ที่มีอยู่แล้วจากLawrence Livermore National Laboratoryสำหรับ ภาษา Pastel ขึ้นใหม่ โดยเขียนด้วยภาษา Pastel เอง ด้วยความช่วยเหลือจากเลน ทาวเวอร์และคนอื่นๆ[ 15 ] [ 16 ]สตอลล์แมนเขียนส่วนหน้า C ใหม่สำหรับคอมไพเลอร์ของลิเวอร์มอร์ แต่แล้วก็ตระหนักว่ามันต้องการพื้นที่สแต็กหลายเมกะไบต์ ซึ่งเป็นไปไม่ได้ใน ระบบ Unix 68000ที่ไม่อนุญาตให้มีพื้นที่สแต็กมากกว่า 64 KB และสรุปว่าเขาจะต้องเขียนคอมไพเลอร์ใหม่ตั้งแต่ต้น[ 15 ]ไม่มีโค้ดคอมไพเลอร์ Pastel ใดถูกนำไปใช้ใน GCC เลย แม้ว่า Stallman จะใช้ส่วนหน้า C ที่เขาเขียนไว้ใน Pastel ก็ตาม[ 15 ] [ 17 ]
GCC เปิดตัวครั้งแรกเมื่อวันที่ 22 มีนาคม พ.ศ. 2530 โดยสามารถดาวน์โหลดได้ทางFTPจากMIT [ 18 ] Stallman ถูกระบุว่าเป็นผู้เขียน แต่ได้อ้างถึงผู้อื่นสำหรับการมีส่วนร่วมของพวกเขา รวมถึง Tower สำหรับ "ส่วนต่างๆ ของตัวแยกวิเคราะห์ ตัวสร้าง RTL คำจำกัดความ RTL และคำอธิบายเครื่อง Vax" Jack Davidson และChristopher W. Fraserสำหรับแนวคิดในการใช้RTLเป็นภาษาตัวกลาง และ Paul Rubin สำหรับการเขียนพรีโปรเซสเซอร์ส่วนใหญ่[ 19 ] Peter H. Salus อธิบายว่า GNU คอม ไพเลอร์ เป็น "ซอฟต์แวร์เสรีที่ประสบความสำเร็จครั้งแรก" ซึ่ง เปิดตัวในช่วงเวลาที่ Sun Microsystemsกำลังแยกเครื่องมือพัฒนาออกจากระบบปฏิบัติการของตนโดยขายแยกต่างหากในราคาที่สูงกว่าชุดก่อนหน้า ซึ่งทำให้ผู้ใช้ของ Sun จำนวนมากซื้อหรือดาวน์โหลด GCC แทนที่จะใช้เครื่องมือของผู้จำหน่าย[ 20 ]แม้ว่า Stallman จะถือว่าGNU Emacsเป็นโครงการหลักของเขา แต่ในปี 1990 GCC รองรับสถาปัตยกรรมคอมพิวเตอร์ถึงสิบสามแบบ มีประสิทธิภาพเหนือกว่าคอมไพเลอร์ของผู้จำหน่ายหลายราย และถูกนำไปใช้ในเชิงพาณิชย์โดยหลายบริษัท[ 21 ]
EGCS ฟอร์ก
เนื่องจาก GCC ได้รับอนุญาตภายใต้ GPL โปรแกรมเมอร์ที่ต้องการทำงานในทิศทางอื่น โดยเฉพาะอย่างยิ่งผู้ที่เขียนอินเทอร์เฟซสำหรับภาษาอื่นที่ไม่ใช่ C สามารถพัฒนาforkของคอมไพเลอร์ของตนเองได้อย่างอิสระ ตราบใดที่พวกเขาปฏิบัติตามข้อกำหนดของ GPL รวมถึงข้อกำหนดในการแจกจ่ายซอร์สโค้ดอย่างไรก็ตาม การมี fork หลายตัวพิสูจน์แล้วว่าไม่มีประสิทธิภาพและจัดการได้ยาก และความยากลำบากในการทำให้งานได้รับการยอมรับจากโครงการ GCC อย่างเป็นทางการนั้นสร้างความหงุดหงิดอย่างมากสำหรับหลายคน เนื่องจากโครงการให้ความสำคัญกับความเสถียรมากกว่าคุณสมบัติใหม่[ 22 ] FSF ควบคุมอย่างใกล้ชิดในสิ่งที่เพิ่มเข้าไปในเวอร์ชันอย่างเป็นทางการของ GCC 2.x (พัฒนามาตั้งแต่ปี 1992) จน GCC ถูกใช้เป็นตัวอย่างหนึ่งของแบบจำลองการพัฒนาแบบ "วิหาร" ในบทความ เรื่อง The Cathedral and the BazaarของEric S. Raymond
ในปี พ.ศ. 2540 กลุ่มนักพัฒนาได้ก่อตั้งExperimental/Enhanced GNU Compiler System (EGCS)เพื่อรวม fork ทดลองหลายๆ ตัวเข้าเป็นโครงการเดียว[ 22 ] [ 17 ]พื้นฐานของการรวมคือภาพรวมการพัฒนาของ GCC (ถ่ายในช่วงเวอร์ชัน 2.7.2 และติดตามต่อมาจนถึงเวอร์ชัน 2.8.1) การรวมนี้รวมถึง g77 (Fortran), PGCC ( GCC ที่ปรับให้เหมาะสมกับ P5 Pentium ) [ 17 ]การปรับปรุง C++ จำนวนมาก และสถาปัตยกรรมและระบบปฏิบัติการรูปแบบ ใหม่ๆ อีกมากมาย [ 23 ]
แม้ว่าทั้งสองโครงการจะติดตามการเปลี่ยนแปลงของกันและกันอย่างใกล้ชิด แต่การพัฒนา EGCS กลับมีความกระตือรือร้นมากกว่ามาก จนกระทั่ง FSF ยุติการพัฒนาคอมไพเลอร์ GCC 2.x อย่างเป็นทางการ รับรอง EGCS ให้เป็นเวอร์ชันอย่างเป็นทางการของ GCC และแต่งตั้งโครงการ EGCS ให้เป็นผู้ดูแล GCC ในเดือนเมษายน พ.ศ. 2542 เมื่อมีการเปิดตัว GCC 2.95 ในเดือนกรกฎาคม พ.ศ. 2542 ทั้งสองโครงการก็กลับมารวมกันอีกครั้ง[ 24 ] [ 17 ]ตั้งแต่นั้นมา GCC ก็ได้รับการดูแลโดยกลุ่มโปรแกรมเมอร์ที่หลากหลายจากทั่วโลกภายใต้การกำกับดูแลของคณะกรรมการอำนวยการ[ 25 ]
GCC 3 (2002) ได้ลบส่วนหน้าของCHILL ออก เนื่องจากขาดการบำรุงรักษา[ 26 ]
ก่อนเวอร์ชัน 4.0 ส่วนหน้าของ Fortran คือg77ซึ่งรองรับเฉพาะFORTRAN 77 เท่านั้น แต่ต่อมาถูกยกเลิกและแทนที่ด้วยส่วนหน้าGNU Fortran ใหม่ที่รองรับ Fortran 95และส่วนใหญ่ของFortran 2003และFortran 2008เช่นกัน[ 27 ] [ 28 ]
ตั้งแต่เวอร์ชัน 4.8 เป็นต้นไป GCC จะถูกนำไปใช้ใน C++ [ 29 ]
การสนับสนุนCilk Plusมีตั้งแต่ GCC 5 ถึง GCC 7 [ 30 ] [ 31 ]
GCC ได้รับการพอร์ต ไปยัง สถาปัตยกรรมชุดคำสั่งที่หลากหลายและถูกนำไปใช้งานอย่างแพร่หลายในฐานะเครื่องมือในการพัฒนาซอฟต์แวร์ทั้งแบบฟรีและแบบกรรมสิทธิ์ GCC ยังมีให้ใช้งานสำหรับระบบฝัง ตัวหลายระบบ รวมถึงSymbian (เรียกว่าgcce ) [ 32 ] ชิปที่ใช้ ARMและชิปที่ใช้Power ISA [ 33 ]คอมไพเลอร์สามารถกำหนดเป้าหมายแพลตฟอร์มที่หลากหลาย รวมถึงคอนโซลวิดีโอเกมเช่นPlayStation 2 [ 34 ] Cell SPE ของ PlayStation 3 [ 35 ]และDreamcast [ 36 ]ได้รับการพอร์ตไปยัง "มากกว่า 60 แพลตฟอร์ม" [ 37 ]
ภาษาที่รองรับ
นับตั้งแต่เวอร์ชัน 16.1 GCC ได้รวมส่วนหน้าสำหรับภาษาโปรแกรม C ( gcc), C++ ( g++), Objective-C , Objective-C++ , Fortran ( gfortran), Ada ( GNAT ), Go ( gccgo), D ( gdc, ตั้งแต่ 9.1), [ 38 ] [ 39 ] Modula-2 ( gm2, ตั้งแต่ 13.1), [ 40 ] [ 41 ] Rust ( gccrs, ตั้งแต่ 15.1), COBOL ( gcobol, ตั้งแต่ 15.1) และALGOL 68 ( ga68, ตั้งแต่ 16.1) [ 6 ]โดย รองรับส่วนขยายภาษาขนาน OpenMPและOpenACCตั้งแต่ GCC 5.1 [ 8 ] [ 42 ]เวอร์ชันก่อน GCC 7 ยังรองรับJava ( gcj) ซึ่งอนุญาตให้คอมไพล์ Java เป็นโค้ดเครื่องเนทีฟ[ 43 ]
มีส่วนหน้าของบุคคลที่สามสำหรับหลายภาษา เช่นPascal ( gpc), Mercury , Modula-3 , VHDL ( GHDL) และPL/I [ 6 ] มีสาขาทดลองบางส่วนเพื่อรองรับภาษาเพิ่มเติม เช่น คอมไพเลอร์ GCC UPCสำหรับUnified Parallel C [ 44 ] [ 45 ]
เป้าหมายเริ่มต้นสำหรับ C++ ตั้งแต่ GCC 15.1 คือgnu++20ซึ่งเป็นซูเปอร์เซ็ตของC++20และเป้าหมายเริ่มต้นสำหรับ C ตั้งแต่ GCC 15 คือgnu23ซึ่งเป็นซูเปอร์เซ็ตของC23 โดยมีการสนับสนุนมาตรฐานที่เข้มงวดด้วย GCC ยังให้การสนับสนุนแบบทดลองสำหรับ C2Y , C++23และC++26อีกด้วย[ 46 ] GCC 16.1 ได้รับการเผยแพร่เมื่อวันที่ 30 เมษายน 2026 [ 47 ] [ 48 ]
ออกแบบ


อินเทอร์เฟซภายนอกของ GCC เป็นไปตาม หลักการ ของ Unixผู้ใช้เรียกใช้โปรแกรมไดรเวอร์เฉพาะภาษา ( gccสำหรับ C, g++สำหรับ C++ เป็นต้น) ซึ่งจะตีความอาร์กิวเมนต์คำสั่งเรียกใช้คอมไพเลอร์จริง รันแอสเซมเบลอร์กับผลลัพธ์ และจากนั้นอาจรันลิงเกอร์เพื่อสร้างไบนารี ที่สามารถเรียกใช้งานได้ อย่างสมบูรณ์
คอมไพเลอร์ของแต่ละภาษาเป็นโปรแกรมแยกต่างหากที่อ่านซอร์สโค้ดและส่งออกโค้ดเครื่องจักรโดยทั้งหมดมีโครงสร้างภายในที่เหมือนกัน ส่วนหน้าของแต่ละภาษาจะวิเคราะห์ซอร์สโค้ดในภาษานั้นๆ และสร้างแผนผังไวยากรณ์นามธรรม (เรียกสั้นๆ ว่า "แผนผัง")
หากจำเป็น ข้อมูลเหล่านี้จะถูกแปลงเป็นรูปแบบอินพุตของส่วนกลางที่เรียกว่า รูปแบบ GENERICจากนั้นส่วนกลางจะค่อยๆ แปลงโปรแกรมไปสู่รูปแบบสุดท้าย มีการใช้เทคนิค การเพิ่มประสิทธิภาพคอมไพเลอร์และการวิเคราะห์โค้ดแบบคงที่ (เช่น FORTIFY_SOURCE [ 49 ]ซึ่งเป็นคำสั่งคอมไพเลอร์ที่พยายามค้นหาบัฟเฟอร์โอเวอร์โฟลว์ บางอย่าง ) กับโค้ด เทคนิคเหล่านี้ทำงานกับรูปแบบการแสดงผลหลายรูปแบบ ส่วนใหญ่เป็นรูปแบบ GIMPLE ที่ไม่ขึ้นกับสถาปัตยกรรม และ รูปแบบ RTL ที่ขึ้นกับสถาปัตยกรรม สุดท้ายนี้ จะมีการสร้าง โค้ดเครื่อง โดยใช้ การจับคู่รูปแบบเฉพาะสถาปัตยกรรมซึ่งเดิมทีอิงตามอัลกอริทึมของ Jack Davidson และ Chris Fraser
GCC ถูกเขียนขึ้นโดยส่วนใหญ่ด้วยภาษา Cยกเว้นส่วนหน้าของAdaการแจกจ่ายประกอบด้วยไลบรารีมาตรฐานสำหรับ Ada และC++ซึ่งโค้ดส่วนใหญ่เขียนด้วยภาษาเหล่านั้น[ 50 ]ในบางแพลตฟอร์ม การแจกจ่ายยังรวมถึงไลบรารีรันไทม์ระดับต่ำlibgcc ซึ่งเขียนด้วยการผสมผสานระหว่างภาษา C ที่ไม่ขึ้นกับเครื่องและ โค้ดเครื่องเฉพาะโปรเซสเซอร์ออกแบบมาเพื่อจัดการกับการดำเนินการทางคณิตศาสตร์ที่โปรเซสเซอร์เป้าหมายไม่สามารถดำเนินการได้โดยตรง[ 51 ]
GCC ใช้เครื่องมือเพิ่มเติมมากมายในการสร้าง ซึ่งหลายเครื่องมือถูกติดตั้งโดยค่าเริ่มต้นในระบบปฏิบัติการ Unix และ Linux หลายระบบ (แต่โดยปกติแล้วจะไม่มีอยู่ในระบบปฏิบัติการ Windows) รวมถึงPerl , Flex , Bison และเครื่องมือทั่วไปอื่นๆ นอกจากนี้ ปัจจุบันยังต้องการไลบรารีเพิ่มเติมอีกสาม ตัวเพื่อสร้าง ได้แก่GMP , MPCและMPFR [ 52 ]
ในเดือนพฤษภาคม พ.ศ. 2553 คณะกรรมการอำนวยการของ GCC ได้ตัดสินใจอนุญาตให้ใช้คอม ไพเลอร์ C++เพื่อคอมไพล์ GCC [ 53 ]คอมไพเลอร์นี้ตั้งใจที่จะเขียนส่วนใหญ่ด้วยภาษา C บวกกับคุณสมบัติย่อยบางส่วนจาก C++ โดยเฉพาะอย่างยิ่ง การตัดสินใจนี้เกิดขึ้นเพื่อให้ผู้พัฒนา GCC สามารถใช้ คุณสมบัติ destructorและgenericsของ C++ ได้[ 54 ]
ในเดือนสิงหาคม พ.ศ. 2555 คณะกรรมการอำนวยการของ GCC ได้ประกาศว่า GCC ใช้ C++ เป็นภาษาในการใช้งาน[ 55 ]ซึ่งหมายความว่าในการสร้าง GCC จากซอร์สโค้ด จำเป็นต้องมีคอมไพเลอร์ C++ ที่เข้าใจมาตรฐาน ISO/IEC C++03
เมื่อวันที่ 18 พฤษภาคม 2020 GCC ได้เปลี่ยนจากมาตรฐานISO/IEC C++03 ไปเป็นมาตรฐาน ISO/IEC C++11 (เช่น จำเป็นต้องคอมไพล์ บูตสแตรป คอมไพเลอร์เอง แต่โดยค่าเริ่มต้นจะคอมไพล์ C++ เวอร์ชันที่ใหม่กว่า) [ 56 ]
ด้านหน้า

แต่ละส่วนหน้าใช้ตัวแยกวิเคราะห์เพื่อสร้างโครงสร้างต้นไม้ไวยากรณ์นามธรรมของไฟล์ต้นฉบับ ที่กำหนด เนื่องจากนามธรรมของโครงสร้างต้นไม้ไวยากรณ์ ไฟล์ต้นฉบับของภาษาต่างๆ ที่รองรับสามารถประมวลผลได้โดยส่วนหลัง เดียวกัน GCC เริ่มต้นด้วยการใช้ตัวแยกวิเคราะห์ LALRที่สร้างด้วยBisonแต่ค่อยๆ เปลี่ยนไปใช้ตัวแยกวิเคราะห์แบบเรียกซ้ำที่ เขียนด้วยมือ สำหรับ C++ ในปี 2547 [ 57 ]และสำหรับ C และ Objective-C ในปี 2549 [ 58 ]ณ ปี 2564 ส่วนหน้าทั้งหมดใช้ตัวแยกวิเคราะห์แบบเรียกซ้ำที่เขียนด้วยมือ
ก่อน GCC 4.0 การแสดงผลโปรแกรมในรูปแบบต้นไม้ไม่ได้เป็นอิสระจากโปรเซสเซอร์ที่กำหนดเป้าหมายอย่างสมบูรณ์ ความหมายของต้นไม้จะแตกต่างกันเล็กน้อยสำหรับส่วนหน้าของภาษาต่างๆ และส่วนหน้าเหล่านั้นอาจให้รหัสต้นไม้ของตนเองได้ สิ่งนี้ได้รับการแก้ไขให้ง่ายขึ้นด้วยการแนะนำ GENERIC และ GIMPLE ซึ่งเป็นรูปแบบต้นไม้ที่ไม่ขึ้นกับภาษาแบบใหม่สองรูปแบบที่ถูกนำมาใช้พร้อมกับการมาถึงของ GCC 4.0 GENERIC มีความซับซ้อนกว่า โดยอิงจากการแสดงผลระดับกลางของส่วนหน้า Java ใน GCC 3.x GIMPLE เป็น GENERIC ที่เรียบง่ายกว่า โดยที่โครงสร้างต่างๆ จะถูกลดทอนลงเหลือคำสั่ง GIMPLE หลาย คำสั่ง ส่วนหน้าของ C , C++และJavaสร้าง GENERIC โดยตรงในส่วนหน้า ส่วนหน้าอื่นๆ จะมีการแสดงผลระดับกลางที่แตกต่างกันหลังจากแยกวิเคราะห์แล้วแปลงเป็น GENERIC
ไม่ว่าในกรณีใดก็ตาม "gimplifier" จะแปลงรูปแบบที่ซับซ้อนกว่านี้ให้เป็นรูปแบบ GIMPLE ที่เรียบง่ายกว่า ซึ่งใช้ SSAเป็นภาษาทั่วไปสำหรับการเพิ่มประสิทธิภาพระดับโลก (ขอบเขตฟังก์ชัน) จำนวนมากที่ไม่ขึ้นกับภาษาและสถาปัตยกรรม
เจเนริกและกิมเพิล
GENERICเป็น ภาษา ตัวแทนระดับกลางที่ใช้เป็น "ตัวกลาง" ในระหว่างการคอมไพล์ซอร์สโค้ดให้เป็นไฟล์ปฏิบัติการโดยมีส่วนย่อยที่เรียกว่าGIMPLEซึ่งเป็นเป้าหมายของส่วนหน้าทั้งหมดของ GCC
ขั้นตอนกลางของ GCC จะทำการวิเคราะห์และ เพิ่มประสิทธิภาพโค้ดทั้งหมดโดยทำงานอย่างอิสระจากทั้งภาษาที่คอมไพล์และสถาปัตยกรรมเป้าหมาย เริ่มต้นจากการแสดงแบบ GENERIC [ 59 ]และขยายไปสู่ภาษาถ่ายโอนรีจิสเตอร์ (RTL) การแสดงแบบ GENERIC ประกอบด้วยเฉพาะส่วนย่อยของ โครงสร้าง การเขียนโปรแกรม เชิงคำสั่งที่ได้ รับการปรับให้เหมาะสมโดยส่วนกลาง
ในการแปลงซอร์สโค้ดเป็น GIMPLE [ 60 ]นิพจน์ที่ซับซ้อนจะถูกแยกออกเป็นโค้ดสามแอดเดรสโดยใช้ตัวแปรชั่วคราวการนำเสนอแบบนี้ได้รับแรงบันดาลใจจากการนำเสนอ SIMPLE ที่เสนอในคอมไพเลอร์ McCAT [ 61 ]โดย Laurie J. Hendren [ 62 ]เพื่อลดความซับซ้อนของการวิเคราะห์และการเพิ่มประสิทธิภาพของโปรแกรมเชิงคำสั่ง
การเพิ่มประสิทธิภาพ
การปรับแต่งประสิทธิภาพสามารถเกิดขึ้นได้ในทุกขั้นตอนของการคอมไพล์ อย่างไรก็ตาม การปรับแต่งประสิทธิภาพส่วนใหญ่จะเกิดขึ้นหลังจากวิเคราะห์ไวยากรณ์และความหมายของส่วนหน้า (front end) และก่อนการสร้างโค้ดของส่วนหลัง (back end) ดังนั้น ชื่อที่ใช้กันทั่วไป แม้ว่าจะดูขัดแย้งในตัวเองอยู่บ้าง สำหรับส่วนนี้ของคอมไพเลอร์ คือ "ส่วนกลาง" (middle end)
ชุดการเพิ่มประสิทธิภาพ GCC ที่แน่นอนจะแตกต่างกันไปในแต่ละเวอร์ชันที่พัฒนาขึ้น แต่รวมถึงอัลกอริธึมมาตรฐาน เช่นการเพิ่มประสิทธิภาพลูป การสร้างเธรดการกระโดดการกำจัดนิพจน์ย่อยทั่วไปการจัดกำหนดการคำสั่งและอื่นๆ การเพิ่มประสิทธิภาพ RTLมีความสำคัญน้อยลงเมื่อมีการเพิ่มการเพิ่มประสิทธิภาพแบบ SSA ทั่วโลกบนต้นไม้GIMPLE [ 63 ]เนื่องจาก การเพิ่มประสิทธิภาพ RTL มีขอบเขตที่จำกัดกว่ามาก และมีข้อมูลระดับสูงน้อยกว่า
การเพิ่มประสิทธิภาพบางส่วนที่ดำเนินการในระดับนี้ ได้แก่การกำจัดโค้ดที่ไม่ได้ ใช้ งานการกำจัดความซ้ำซ้อนบางส่วนการกำหนดหมายเลขค่าทั่วโลกการแพร่กระจายค่าคงที่แบบมีเงื่อนไขแบบเบาบางและ การแทนที่ค่ารวมด้วย สเกลาร์นอกจากนี้ยังมีการเพิ่มประสิทธิภาพตามการพึ่งพาอาร์เรย์ เช่นการแปลงเป็นเวกเตอร์อัตโนมัติและการประมวลผลแบบขนานอัตโนมัติการเพิ่มประสิทธิภาพตามโปรไฟล์ก็เป็นไปได้เช่นกัน[ 64 ]
ไลบรารีมาตรฐาน C++ (libstdc++)
โครงการ GCC ประกอบด้วยการใช้งานไลบรารีมาตรฐาน C++ที่เรียกว่า libstdc++ [ 65 ]ซึ่งได้รับอนุญาตภายใต้ใบอนุญาต GPLv3 โดยมีข้อยกเว้นสำหรับการเชื่อมโยงแอปพลิเคชันที่ไม่เข้ากันกับ GPL เมื่อสร้างซอร์สโค้ดด้วย GCC [ 66 ]ตั้งแต่ GCC เวอร์ชัน 3 เป็นต้นมา ABI ของ C++ จะอิงตาม ABI ที่ Intel เผยแพร่สำหรับ Itanium C++ ABI [ 67 ]
คุณสมบัติอื่นๆ
คุณสมบัติบางประการของ GCC ได้แก่:
- การเพิ่มประสิทธิภาพเวลาเชื่อมโยง
- การเพิ่มประสิทธิภาพในระหว่างการเชื่อมโยง (Link-time optimization)จะเพิ่มประสิทธิภาพข้ามขอบเขตของไฟล์ออบเจ็กต์เพื่อปรับปรุงไบนารีที่เชื่อมโยงโดยตรง การเพิ่มประสิทธิภาพในระหว่างการเชื่อมโยงอาศัยไฟล์ตัวกลางที่มีการแปลงเป็นรูปแบบGimple บางอย่าง ที่รวมอยู่ในไฟล์ออบเจ็กต์ ไฟล์นี้จะถูกสร้างขึ้นพร้อมกับไฟล์ออบเจ็กต์ในระหว่างการคอมไพล์ซอร์สโค้ด การคอมไพล์ซอร์สโค้ดแต่ละครั้งจะสร้างไฟล์ออบเจ็กต์และไฟล์ช่วยในระหว่างการเชื่อมโยงแยกต่างหาก เมื่อไฟล์ออบเจ็กต์ถูกเชื่อมโยง คอมไพเลอร์จะทำงานอีกครั้งและใช้ไฟล์ช่วยเหล่านั้นเพื่อเพิ่มประสิทธิภาพโค้ดในไฟล์ออบเจ็กต์ที่คอมไพล์แยกกัน
- ปลั๊กอิน
- ปลั๊กอินขยายคอมไพเลอร์ GCC โดยตรง[ 68 ]ปลั๊กอินช่วยให้คอมไพเลอร์มาตรฐานสามารถปรับแต่งให้ตรงกับความต้องการเฉพาะโดยใช้โค้ดภายนอกที่โหลดเป็นปลั๊กอิน ตัวอย่างเช่น ปลั๊กอินสามารถเพิ่ม แทนที่ หรือแม้แต่ลบขั้นตอนการประมวลผลระดับกลางที่ดำเนินการกับตัวแทนGimple ได้ [ 69 ]มีการเผยแพร่ปลั๊กอิน GCC หลายตัวแล้ว โดยเฉพาะอย่างยิ่ง:
- การสนับสนุนปลั๊กอินเคยเป็นประเด็นถกเถียงกันในปี 2550 [ 71 ]
- หน่วยความจำธุรกรรม C++
- ภาษา C++ มีข้อเสนอที่ใช้งานอยู่สำหรับหน่วยความจำธุรกรรม สามารถเปิดใช้งานได้ใน GCC 6 และเวอร์ชันใหม่กว่าเมื่อคอมไพล์
-fgnu-tmด้วย[ 7 ] [ 72 ] - ตัวระบุยูนิโค้ด
- แม้ว่าภาษา C++ จะต้องการการสนับสนุนอักขระ Unicode ที่ไม่ใช่ ASCII ในตัวระบุแต่ฟีเจอร์นี้ได้รับการสนับสนุนตั้งแต่ GCC 10 เท่านั้น เช่นเดียวกับการจัดการสตริงลิเทอรัลที่มีอยู่ ไฟล์ต้นฉบับจะถือว่าเข้ารหัสเป็นUTF-8ฟีเจอร์นี้เป็นทางเลือกในภาษา C แต่ก็มีให้ใช้งานเช่นกันตั้งแต่การเปลี่ยนแปลงนี้[ 73 ] [ 74 ]
- ส่วนขยาย C
- GNU C ขยายภาษาการเขียนโปรแกรม C ด้วยคุณสมบัติที่ไม่เป็นมาตรฐานหลายประการ รวมถึงฟังก์ชันซ้อนกัน[ 75 ]
สถาปัตยกรรม

ตระกูลโปรเซสเซอร์หลักที่ได้รับการสนับสนุน (และผ่านการทดสอบอย่างดีที่สุด) ได้แก่ ARM 64 บิตและ 32 บิต, x86 64 บิตและ 32 บิต , PowerPC 64 บิตและSPARC 64 บิต [ 76 ]
ตระกูลโปรเซสเซอร์เป้าหมายของ GCC ณ เวอร์ชัน 11.1 ได้แก่: [ 77 ]
- อาร์ค64
- อัลฟ่า
- แขน
- เอวีอาร์
- แบล็กฟิน
- อีบีพีเอฟ
- วันสมโภชพระเยซูทรงปรากฏ (GCC 4.8)
- เอช8/300
- เอชซี12
- IA-32 (32 บิตx86 )
- IA-64 (อินเทล อิทาเนียม)
- เอ็มไอพีเอส
- Motorola ซีรีส์ 68000
- เอ็มเอสพี430
- การ์ดจอ Nvidia
- เอ็นดีวีเอ พีทีเอ็กซ์
- พีเอ-ริสซี
- พีดีพี-11
- พาวเวอร์พีซี
- อาร์8ซี / เอ็ม16ซี / เอ็ม32ซี
- RISC-V
- สปาร์ค
- ซูเปอร์เอช
- ระบบ/390 / z/สถาปัตยกรรม
- แวกซ์
- x86-64
โปรเซสเซอร์เป้าหมายที่ไม่ค่อยเป็นที่รู้จักซึ่งได้รับการสนับสนุนในเวอร์ชันมาตรฐาน ได้แก่:
โปรเซสเซอร์เพิ่มเติมได้รับการสนับสนุนโดย GCC เวอร์ชันที่ดูแลแยกต่างหากจากเวอร์ชัน FSF:
- คอร์ตัส เอพีเอส3
- อาร์ซี
- เอวีอาร์32
- C166และC167
- ดี10วี
- ไอเอสซี
- อีไซ-อาร์เอสซี
- หกเหลี่ยม[ 78 ]
- แลตติสมิโค32
- แลตติสมิโค8
- เมพี
- ไมโครเบลซ
- โมโตโรลา 6809
- เอ็มเอสพี430
- สถาปัตยกรรม NEC SX [ 79 ]
- นิออส IIและนิออส
- โอเพ่นอาร์เอสซี
- พีดีพี-10
- PIC24/dsPIC
- PIC32
- ใบพัด
- ดาวเสาร์ (HP48XGCC)
- ระบบ/370
- TIGCC ( รุ่น m68k )
- ทีเอ็มเอส9900
- ไตรคอร์
- Z8000
- ซป.
คอม ไพเลอร์ GCJ Java สามารถกำหนดเป้าหมายได้ทั้งสถาปัตยกรรมภาษาเครื่องดั้งเดิมหรือ ไบต์ โค้ดJavaของเครื่องเสมือน Java [ 80 ]เมื่อกำหนดเป้าหมาย GCC ใหม่ไปยังแพลตฟอร์มใหม่ มักใช้ การบูตสแตรปโปรเซสเซอร์ Motorola 68000, Zilog Z80 และโปรเซสเซอร์อื่นๆ ก็ถูกกำหนดเป้าหมายในเวอร์ชัน GCC ที่พัฒนาขึ้นสำหรับเครื่องคิดเลขกราฟิกแบบโปรแกรมได้ต่างๆ ของ Texas Instruments, Hewlett Packard, Sharp และ Casio [ 81 ]
ใบอนุญาต
GCC ได้รับอนุญาตภายใต้GNU General Public Licenseเวอร์ชัน 3 [ 82 ]ข้อยกเว้นรันไทม์ของ GCCอนุญาตให้คอมไพล์โปรแกรมที่เป็นกรรมสิทธิ์ (นอกเหนือจากซอฟต์แวร์ฟรี) ด้วยส่วนหัวและไลบรารีรันไทม์ของ GCC ซึ่งไม่มีผลกระทบต่อเงื่อนไขใบอนุญาตของซอร์สโค้ด GCC [ 83 ]
อย่างไรก็ตาม ข้อยกเว้นนี้มีข้อจำกัด ตัวอย่างเช่น เมื่อใช้ซอฟต์แวร์ที่ไม่เข้ากันกับGPL ร่วมกับ GCC ภายใน กระบวนการคอมไพล์ การปฏิบัติตามGPLv3สำหรับรหัสออบเจ็กต์ที่แพร่กระจายทั้งหมดที่ GCC สร้างขึ้นนั้นกลายเป็นสิ่งจำเป็น เนื่องจากรหัสเหล่านั้นได้มาจากไลบรารีที่ได้รับอนุญาตภายใต้GPL [ 84 ]
ดูเพิ่มเติม
อ่านเพิ่มเติม
- โดยใช้ชุดคอมไพเลอร์ GNU (GCC)มูลนิธิซอฟต์แวร์เสรี ปี 2008
- เอกสาร "GNU Compiler Collection (GCC) Internals"จาก Free Software Foundation, 2008
- บทนำสู่ GCC , Network Theory Ltd., 2004 (ปรับปรุงแก้ไข สิงหาคม 2005) ISBN 0-9541617-9-3.
- Arthur Griffith, GCC: The Complete Reference . McGraw Hill / Osborne, 2002. ISBN 0-07-222405-3.
ลิงก์ภายนอก
เป็นทางการ
อื่น
- แหล่งรวบรวมเอกสารเกี่ยวกับสถาปัตยกรรมและกลไกภายในของ GCC 4.0.2ที่ IIT Bombay
- Kerner, Sean Michael (2 มีนาคม 2549). "GCC รุ่นใหม่เน้นการเพิ่มประสิทธิภาพ" . internetnews.com
- Kerner, Sean Michael (22 เมษายน 2548). "Open Source GCC 4.0: Older, Faster" . internetnews.com. เก็บถาวรจากต้นฉบับเมื่อวันที่ 17 กันยายน 2549. สืบค้นเมื่อ21 ตุลาคม 2549
- จากซอร์สโค้ดสู่ไบนารี: กลไกการทำงานภายในของ GCCโดย Diego Novillo, นิตยสาร Red Hat , ธันวาคม 2004
- บทความปี 2003 เกี่ยวกับ GENERIC และ GIMPLE
- บทความเรื่อง "การตลาดของ Cygnus Support"ครอบคลุมการพัฒนา GCC ในช่วงทศวรรษ 1990 พร้อมรายงานรายเดือน 30 ฉบับในส่วน "Inside Cygnus Engineering" ตอนท้าย
- ประกาศ EGCS 1.0
- รายการคุณสมบัติของ EGCS 1.0
- " ความกลัวการแยกสาขา"บทความโดยริค โมเอน ที่บันทึกการแยกสาขาที่มีชื่อเสียงเจ็ดครั้ง รวมถึงการแยกสาขา GCC/EGCS ด้วย
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ชุดคอมไพเลอร์ GNU
GNU Compiler Collection ( GCC ; เดิมชื่อ GNU C Compiler ) เป็นชุด คอมไพเลอร์ จาก โครงการ GNU ที่รองรับ ภาษาโปรแกรม สถาปัตยกรรม ฮาร์ดแวร์ และ ระบบปฏิบัติการ ต่างๆ มูลนิธิ...
ประวัติศาสตร์
ในช่วงปลายปี 1983 ในความพยายามที่จะ เริ่มต้น ระบบปฏิบัติการ GNU ริชาร์ด สตอลล์แมน ได้ขอ อนุญาตจาก แอนดรูว์ เอส.
EGCS ฟอร์ก
เนื่องจาก GCC ได้รับอนุญาตภายใต้ GPL โปรแกรมเมอร์ที่ต้องการทำงานในทิศทางอื่น โดยเฉพาะอย่างยิ่งผู้ที่เขียนอินเทอร์เฟซสำหรับภาษาอื่นที่ไม่ใช่ C สามารถพัฒนา fork ของคอมไพเลอร์ของตนเองได้อย่างอิสระ ตราบใดที่พวกเขาปฏิบัติตามข้อกำหนดของ GPL...
ภาษาที่รองรับ
นับตั้งแต่เวอร์ชัน 16.1 GCC ได้รวมส่วนหน้าสำหรับภาษา โปรแกรม C ( gcc ), C++ ( g++ ), Objective-C , Objective-C++ , Fortran ( gfortran ), Ada ( GNAT ), Go ( gccgo ), D ( gdc , ตั้งแต่ 9.1), [ 38 ] [ 39 ] Modula-2 ( gm2 , ตั้งแต่ 13.