เหตุใด GCC จึงเปลี่ยนจากวัวกระทิงเป็นตัวแยกวิเคราะห์แบบสืบซ้ำสำหรับ C ++ และ C


10

มีการเปลี่ยนแปลงภาษาที่ต้องใช้หรือมีเหตุผลบางอย่างที่ทำไมกระทิงจึงไม่เหมาะสมหรือเหมาะสมที่สุด?

ฉันเห็นวิกิพีเดียว่าพวกเขาเปลี่ยนไปอ้างอิงถึงบันทึกย่อประจำรุ่นGCC 3.4และGCC 4.1

สถานะรีลีสโน้ตเหล่านี้:

ตัวแยกวิเคราะห์ C ++ purser แบบเขียนซ้ำด้วยมือได้แทนที่ตัวแยกวิเคราะห์ C ++ ที่ได้จาก YACC จาก GCC รุ่นก่อนหน้า parser ใหม่มีโครงสร้างพื้นฐานที่พัฒนาขึ้นอย่างมากซึ่งจำเป็นสำหรับการแยกวิเคราะห์ซอร์สโค้ด C ++ ที่ดีขึ้นการจัดการส่วนขยายและการแยกที่สะอาด (ถ้าเป็นไปได้) ระหว่างการวิเคราะห์ซีแมนทิกส์ที่เหมาะสมและการแยกวิเคราะห์ parser ใหม่แก้ไขข้อบกพร่องมากมายที่พบใน parser เก่า

และ:

ตัวแยกวิเคราะห์ C และ Objective-C แบบเก่าของ Bison ถูกแทนที่ด้วยตัวแยกวิเคราะห์แบบเรียกซ้ำแบบสืบพันธุ์แบบเขียนด้วยมือที่เร็วขึ้น

สิ่งที่ฉันอยากรู้คือปัญหาที่แท้จริงของพวกเขาคืออะไรและทำไมจึงเป็นไปไม่ได้ / วิธีแก้ปัญหาโดยใช้วัวกระทิง


1
ในที่สุด parsers ทั้งหมดจะกลายเป็น homebrewn หลังจากการดัดแปลงพอเมื่อ parser generator ไม่สามารถตอบสนองความต้องการได้
ratchet freak

1
ที่ใช้ร่วมกันวิจัยของคุณช่วยให้ทุกคน บอกเราว่าคุณได้ลองทำอะไรและทำไมมันถึงไม่ตรงกับความต้องการของคุณ สิ่งนี้แสดงให้เห็นว่าคุณใช้เวลาในการพยายามช่วยตัวเองมันช่วยให้เราไม่ต้องย้ำคำตอบที่ชัดเจนและส่วนใหญ่จะช่วยให้คุณได้คำตอบที่เฉพาะเจาะจงและเกี่ยวข้องมากขึ้น ดูวิธีถาม
gnat

1
@gnat ฉันขยายคำถามของฉัน
neelsg

1
C ++ เป็นภาษาที่มีความซับซ้อนเป็นพิเศษในการวิเคราะห์คำเปรียบเทียบกับภาษาโปรแกรมส่วนใหญ่อื่น ๆ ความรู้สึกของฉันเป็นตัวแยกวิเคราะห์ที่ใช้งานทั่วไปอาจไม่สามารถรองรับการเพิ่มประสิทธิภาพบางอย่างที่ parser ที่ใช้ในครัวเรือนสามารถใช้

คำตอบ:


16

GCC เปลี่ยนไปเขียนด้วยมือแยกเพราะข้อความผิดพลาดที่มีความหมายมากขึ้นเมื่อใช้เทคนิคโคตร recursive เป็นฉันอธิบายที่นี่

นอกจากนี้ C ++ กำลังกลายเป็นภาษาที่ซับซ้อน (syntactically) เพื่อแยกวิเคราะห์ว่าการใช้ parser generators นั้นไม่คุ้มค่าสำหรับมัน

ในที่สุดงานจำนวนมากของคอมไพเลอร์ตัวจริงจะไม่ถูกแยกวิเคราะห์ แต่เป็นการปรับให้เหมาะสม การเพิ่มประสิทธิภาพระดับกลางของ GCC ผ่านซับซ้อนกว่าการแยก

(BTW คุณสามารถปรับแต่ง GCC เช่นด้วยปลั๊กอินหรือใช้MELTแต่คุณไม่สามารถขยายไวยากรณ์ของภาษาที่ยอมรับได้ - ยกเว้นโดยการเพิ่มแอตทริบิวต์และ pragmas)

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