คอมไพเลอร์ gcc C เขียนด้วยตัว C เองหรือไม่?


87

คอมไพเลอร์ gcc C เขียนด้วยตัว C เองหรือไม่? หรือเขียนไว้ใน Assembly? ถ้าคอมไพเลอร์เขียนด้วย C แล้วคอมไพเลอร์ที่ใช้ในการรวบรวมโค้ดคอมไพเลอร์คืออะไร?


12
ใช่ (ส่วนใหญ่) แน่นอนว่าเราต้องใช้คอมไพเลอร์ C เพื่อคอมไพล์ C เช่นเดียวกับคอมไพเลอร์ส่วนใหญ่จะมีเฟส "boot-strap" เป็นชุด ๆ แนวคิดทั่วไปได้รับการคุ้มครองในการติดตั้ง GCC: อาคารและการติดตั้งของ GCC - LFS

2
เวิร์กสเตชันของแบรนด์ต่างๆในช่วงทศวรรษที่ 1980 และต้นทศวรรษที่ 90 มีสภาพแวดล้อมที่เหมือนระบบยูนิกซ์ของตัวเองโดยมีคอมไพเลอร์ c เครื่องมือและอื่น ๆ ซึ่งต่างกันเล็กน้อย ด้วยแหล่ง GCC คุณสามารถทำการคอมไพล์เริ่มต้นของ gcc บนหนึ่งในแพลตฟอร์มเหล่านี้จากนั้นรวบรวม gcc ด้วยตัวมันเองสองสามครั้งเพื่อตรวจสอบจุดคงที่มากขึ้นหรือน้อยลง
พอล

คำตอบ:


100

ประวัติความเป็นมาที่เฉพาะเจาะจงกับ GCC จะได้รับที่GCC วิกิพีเดีย ประเด็นทั่วไปก็คือโดยทั่วไปแล้วคอมไพเลอร์จะถูกคอมไพเลอร์กับคอมไพเลอร์อื่นจนกว่าจะมีประสิทธิภาพเพียงพอที่จะคอมไพเลอร์เอง อีกวิธีหนึ่งเป็นไปได้ที่จะเขียนคอมไพเลอร์พื้นฐานที่สามารถจัดการกับคุณสมบัติย่อยของคุณในแอสเซมเบลอร์และสร้างจากที่นั่น แต่อีกครั้งสิ่งนี้แทบไม่จำเป็นอีกต่อไป มีคอมไพเลอร์มากมายในหลากหลายภาษา แม้ว่า Stephen Johnson จะเขียน pcc (หนึ่งในคอมไพเลอร์ C ตัวแรก) ก็มีคอมไพเลอร์สำหรับ B พร้อมกับภาษาอื่น ๆ อีกมากมาย gcc มีคอมไพเลอร์หลายตัวให้เลือกสร้างในตอนแรกและ RMS บอกว่าเขาใช้คอมไพเลอร์ Pastel อย่างน้อยในระหว่างการพัฒนาครั้งแรก

โปรดจำไว้ว่าไม่มีข้อกำหนดที่คอมไพเลอร์ C ต้องเขียนด้วย C คุณสามารถเขียนใน Perl ได้หากต้องการ ไม่มีข้อกำหนดว่าจะต้องเขียนคอมไพเลอร์สำหรับแพลตฟอร์มที่กำหนดบนแพลตฟอร์มนั้น (ระบบฝังตัวมักจะถูกคอมไพล์ในระบบอื่น) ดังนั้นจึงมีหลายวิธีที่จะทำให้ตัวคุณเองได้บูต

คำถามนี้มีรายละเอียดปลีกย่อยที่น่าสนใจที่เกี่ยวข้องกับอินสแตนซ์แรกของการบูตคอมไพเลอร์ หากคุณฉลาดมากคุณสามารถใช้ bootstrap นั้นเพื่อทำสิ่งที่น่าทึ่งยอดเยี่ยมและน่ากลัวได้


ว้าวบทความที่สองที่คุณเชื่อมโยงไปนั้นฉลาดมาก
Ponkadoodle

1
ขอบคุณสำหรับลิงค์ bootstrapping ที่ยอดเยี่ยม ผมเคยคิดว่าคอมไพเลอร์ถูกเขียนขึ้นเสมอในภาษาที่เรียบง่ายทุกทางกลับไปที่รหัสเครื่องสำหรับการจัดเรียงของเหตุผลนี้ (ตัวอย่างเช่นถ้าคุณรู้ว่าไบนารีสำหรับคอมไพเลอร์ของคุณมีข้อผิดพลาดล่ะนี่เป็นตัวอย่างที่ดีกว่าแน่นอน) ข้อดีของการเขียนคอมไพเลอร์ในภาษาของตัวเองคืออะไร? ผู้คนที่หวาดระแวงอย่างมากต้องกังวลเกี่ยวกับเรื่องนี้และสร้างคอมไพเลอร์โดยไม่ต้องบูต "ด้วยตนเอง" หรือไม่?
RoG

4
กลุ่มภาษาบางกลุ่มถือว่าเป็นเครื่องหมายแห่งเกียรติยศที่สามารถรวบรวมตัวเองได้ Go เพิ่งผลักดันอย่างมากในทิศทางนี้ ในทางกลับกัน Swift โดยเฉพาะอย่างยิ่งไม่มีแผนปัจจุบันในการเขียนคอมไพเลอร์ใหม่ใน Swift อย่างไรก็ตามโปรดสังเกตว่า GCC เขียนด้วยภาษา C เสมอมันถูกรวบรวมด้วยคอมไพเลอร์อื่น ๆ แต่ถ้าคอมไพเลอร์ C ทั้งหมดเขียนด้วย BCPL สิ่งนั้นจะไม่แก้ไขอะไรเกี่ยวกับความหวาดระแวง เพียงแค่ย้ายปัญหากลับไปหนึ่งขั้นตอน (คุณจะได้รับประโยชน์จากความหวาดระแวงเช่นเดียวกันเพียงแค่รวบรวม GCC w / clang)
Rob Napier

โปรดทราบว่า gcc มีนโยบายว่า gcc เวอร์ชันหลัก X สามารถคอมไพล์ด้วย gcc เวอร์ชันหลัก X-1 ได้เสมอดังนั้นคุณลักษณะใหม่ ๆ ที่เพิ่มลงในคอมไพเลอร์ใน X จึงใช้ได้เฉพาะในซอร์ส gcc จาก X + 1 เท่านั้น เช่นคุณควรจะสามารถรวบรวม gcc เวอร์ชัน 9 ได้ไม่ว่าหมายเลขเวอร์ชันรองจะเป็นอย่างไรด้วย gcc 8 ใด ๆ ก็ตามไม่ว่าเวอร์ชันรองจะเป็นอย่างไร
บารุค

51

แต่เดิมมันเขียนด้วยภาษาแอสเซมบลีจากนั้นก็เริ่มให้อาหารสุนัขเอง


2
ฉันไม่เห็นการอ้างอิงถึง RMS โดยใช้แอสเซมเบลอร์สำหรับบูตสแตรปดั้งเดิม แหล่งที่มาของคุณคืออะไร? เขามีคอมไพเลอร์อื่น ๆ อีกหลายตัวที่จะบู๊ตสแตรปด้วยดังนั้นดูเหมือนว่าจะต้องทำงานมาก
Rob Napier

19
ฉันคิดว่าคำนี้เป็น bootstrap
Martin York

7
ฮ่า ๆ ๆ ฉันอ่านข้อความนี้เมื่อไม่กี่สัปดาห์ก่อนและคิดว่าคุณไม่สนใจกับการแสดงออกนั้นไม่ได้ตระหนักว่ามันเป็นมาตรฐาน แสดงดีครับ! en.wikipedia.org/wiki/Eating_your_own_dog_food

3

แม้ว่านี่จะเป็นเพียงตัวบ่งชี้ที่หยาบมาก แต่ฉันพบว่ารายชื่อด่วนนี้ในgcc-5.1.0-src/gcc/ไดเรกทอรีนั้นน่าสนใจ ไดเร็กทอรีนี้มีแหล่งที่มาหลักของ GCC (ยกเว้นไลบรารีรันไทม์)

นี่คือจำนวนไฟล์อันดับต้น ๆ (มากกว่า 100) ที่จัดกลุ่มตามนามสกุลที่ถูกครอบงำโดยไฟล์ C และ C ++

โปรดทราบว่าปัจจุบันGCCอ้างถึง GNU Compiler Collection ไม่ใช่แค่ GNU C Compiler

6.3 ไดเร็กทอรีย่อย gcc

ไดเร็กทอรี gcc มีไฟล์จำนวนมากที่เป็นส่วนหนึ่งของแหล่งข้อมูล C ของ GCC ไฟล์อื่น ๆ ที่ใช้เป็นส่วนหนึ่งของกระบวนการกำหนดค่าและสร้างและไดเร็กทอรีย่อยรวมถึงเอกสารประกอบและ testsuite

อ้างอิง: https://gcc.gnu.org/onlinedocs/gccint/gcc-Directory.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.