วันนี้คุณต้องการคอมไพเลอร์ C ตัวจริงเพื่อให้ได้ประสิทธิภาพสูงสุดโดยเฉพาะอย่างยิ่งเนื่องจากภาษาซีไม่ได้อยู่ใกล้กับฮาร์ดแวร์อีกต่อไปเพราะโปรเซสเซอร์ปัจจุบันมีความซับซ้อนอย่างเหลือเชื่อ ( นอกลำดับ , pipelined , superscalar , แคชที่ซับซ้อน& TLB , ดังนั้นต้องมีการจัดตารางการเรียนการสอนฯลฯ ... ) โปรเซสเซอร์ x86 ในปัจจุบันไม่เหมือนกับโปรเซสเซอร์ i386 ของศตวรรษก่อนแม้ว่าทั้งคู่จะสามารถเรียกใช้รหัสเครื่องเดียวกันได้ ดูว่าC ไม่ใช่ภาษาระดับต่ำ (คอมพิวเตอร์ของคุณไม่ใช่กระดาษเร็ว PDP-11)โดย David Chisnall
มีคนไม่กี่คนที่ใช้คอมไพเลอร์ C ที่ไร้เดียงสาที่ไร้ประสิทธิภาพเช่นtinyccหรือnwccเนื่องจากพวกเขาสร้างโค้ดที่ช้ากว่าการเพิ่มประสิทธิภาพคอมไพเลอร์หลายเท่า
การเข้ารหัสคอมไพเลอร์การเพิ่มประสิทธิภาพเป็นเรื่องยาก โปรดสังเกตว่าทั้ง GCC และ Clang กำลังปรับการแสดงรหัส "เป็นกลางภาษาเป็นกลาง" บางส่วน (Gimple สำหรับ GCC, LLVM สำหรับ Clang) ความซับซ้อนของคอมไพเลอร์ C ที่ดีไม่ได้อยู่ในขั้นตอนการแยกวิเคราะห์!
โดยเฉพาะอย่างยิ่งการสร้างคอมไพเลอร์ C ++ นั้นไม่ใช่เรื่องยากกว่าการสร้างคอมไพเลอร์ C: การแยก C ++ และการแปลงให้เป็นรหัสภายในบางตัวนั้นมีความซับซ้อน (เนื่องจากข้อกำหนดของ C ++ นั้นซับซ้อน) แต่เข้าใจกันดีกว่า ซับซ้อน (ภายใน GCC: การเพิ่มประสิทธิภาพระดับกลาง, ภาษาต้นทางและเป้าหมายตัวประมวลผลที่เป็นกลาง, รวบรวมคอมไพเลอร์ส่วนใหญ่, ส่วนที่เหลือมีความสมดุลระหว่าง Front-End สำหรับหลายภาษาและแบ็คเอนด์สำหรับโปรเซสเซอร์หลายตัว) ดังนั้นการเพิ่มประสิทธิภาพคอมไพเลอร์ C ส่วนใหญ่ก็สามารถรวบรวมภาษาอื่น ๆ เช่น C ++, Fortran, D, ... ส่วน C ++ เฉพาะของ GCC อยู่ที่ประมาณ 20% ของคอมไพเลอร์ ...
ยิ่งไปกว่านั้น C (หรือ C ++) ใช้กันอย่างแพร่หลายจนผู้คนคาดหวังว่าโค้ดของพวกเขาจะคอมไพล์ได้แม้ว่ามันจะไม่เป็นไปตามมาตรฐานอย่างเป็นทางการซึ่งไม่ได้กำหนดความหมายที่ชัดเจนของภาษา ของมัน) ดูยังเข้าไปในCompCertพิสูจน์แล้วว่าคอมไพเลอร์ C และม่า-Cวิเคราะห์แบบคงที่ซึ่งดูแลเกี่ยวกับทางการมากขึ้นความหมายของซี
และการปรับให้เหมาะสมนั้นเป็นปรากฏการณ์หางยาว : การใช้การปรับให้เรียบง่ายเพียงไม่กี่อย่างนั้นง่าย แต่ก็ไม่ทำให้คอมไพเลอร์แข่งขันได้! คุณต้องใช้การเพิ่มประสิทธิภาพที่แตกต่างกันจำนวนมากและเพื่อจัดระเบียบและรวมเข้าด้วยกันอย่างชาญฉลาดเพื่อรับคอมไพเลอร์ในโลกแห่งความจริงที่มีการแข่งขัน กล่าวอีกนัยหนึ่งคอมไพเลอร์การปรับให้เหมาะสมที่สุดในโลกแห่งความเป็นจริงต้องเป็นซอฟต์แวร์ที่ซับซ้อน BTW ทั้ง GCC และ Clang / LLVM มีเครื่องกำเนิดรหัส C / C ++ เฉพาะหลาย ๆ เครื่อง และทั้งคู่เป็นสัตว์ขนาดใหญ่ (ซอร์สโค้ดหลายล้านเส้นมีอัตราการเติบโตหลายเปอร์เซ็นต์ในแต่ละปี) กับชุมชนนักพัฒนาขนาดใหญ่ (ไม่กี่ร้อยคนทำงานเต็มเวลาส่วนใหญ่หรืออย่างน้อยครึ่งเวลา)
ขอให้สังเกตว่าไม่มี (ที่ดีที่สุดของความรู้ของฉัน) คอมไพเลอร์ C แบบมัลติเธรดแม้ว่าบางส่วนของคอมไพเลอร์สามารถทำงานแบบขนาน (เช่นการเพิ่มประสิทธิภาพภายในโพรซีเดอร์การเพิ่มประสิทธิภาพการลงทะเบียน และการสร้างแบบขนานด้วยmake -j
ก็ไม่เพียงพอ (โดยเฉพาะกับLTO )
นอกจากนี้มันเป็นเรื่องยากที่จะได้รับเงินทุนในการเข้ารหัสคอมไพเลอร์ C ตั้งแต่เริ่มต้นและความพยายามดังกล่าวต้องใช้เวลาหลายปีที่ผ่านมา ในที่สุดคอมไพเลอร์ C หรือ C ++ ส่วนใหญ่เป็นซอฟต์แวร์เสรีวันนี้ (ไม่มีตลาดสำหรับคอมไพเลอร์กรรมสิทธิ์ใหม่ที่ขายโดย startups) หรืออย่างน้อยก็เป็นสินค้าผูกขาด (เช่นMicrosoft Visual C ++ ) และการเป็นซอฟต์แวร์ฟรีเกือบเป็นสิ่งจำเป็นสำหรับคอมไพเลอร์ เพราะพวกเขาต้องการความช่วยเหลือจากองค์กรต่าง ๆ มากมาย)
ฉันยินดีที่จะได้รับเงินทุนสำหรับการทำงานกับคอมไพเลอร์ C ตั้งแต่เริ่มต้นเป็นซอฟต์แวร์เสรี แต่ฉันไม่ไร้เดียงสาพอที่จะเชื่อว่าเป็นไปได้ในวันนี้!