ทำไมโปรแกรม Linux ส่วนใหญ่เขียนใน C?


30

ทำไมโปรแกรม Linux ส่วนใหญ่เขียนใน C? ทำไมพวกเขาถึงไม่เขียนด้วย C ++ ซึ่งใหม่กว่า?


14
C++ใหม่กว่าCแต่ก็ไม่เกี่ยวข้องเลย พวกเขาเป็นภาษาที่แตกต่างกัน
Mat

6
คุณควรถามคำถามนี้ที่ StackOverflow หรือโปรแกรมเมอร์ (ที่หัวข้อได้รับการคุ้มครองอย่างดี )
rozcietrzewiacz

4
@ แมทมันไม่ถูกต้องทั้งหมดเนื่องจาก C ++ เป็นชุดของ C คุณสามารถโปรแกรมใน C และคอมไพล์ด้วย C ++ คอมไพเลอร์ มันจะรวบรวมและทำงานตามที่คาดไว้
polemon

8
@polemon: ไม่ถูกต้องมีความเข้ากันไม่ได้ en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B
จ้า

คำตอบ:


37

มีการพูดคุยกันมากมายเกี่ยวกับเรื่องนี้ สาเหตุหลักมาจากเหตุผลทางปรัชญา C ถูกประดิษฐ์ขึ้นเป็นภาษาง่าย ๆ สำหรับการพัฒนาระบบ (ไม่พัฒนาแอพพลิเคชั่นมากนัก) มีข้อโต้แย้งมากมายสำหรับการใช้ C ++ แต่มีข้อโต้แย้งมากมายสำหรับการไม่ใช้ C ++ และการผสานกับ C

ในท้ายที่สุดมันเป็นปัญหาทางประวัติศาสตร์ แอปพลิเคชั่นส่วนใหญ่เขียนด้วยภาษา C เนื่องจากเนื้อหาเคอร์เนลส่วนใหญ่เขียนด้วยภาษาซีและตั้งแต่นั้นมาเนื้อหาส่วนใหญ่เขียนด้วยภาษา C ผู้คนมักจะใช้ภาษาดั้งเดิม

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

นั่นเป็นเพราะแอพ c ++ เกือบทุกตัวต้องการไลบรารี่มาตรฐาน c ++ ที่แยกต่างหากเพื่อใช้งาน ดังนั้นพวกเขาจะต้องย้ายพอร์ตไปยังเคอร์เนลและคาดว่าจะมีค่าใช้จ่ายเพิ่มเติมทุกที่

c ++ เป็นภาษาที่ซับซ้อนมากขึ้นและนั่นหมายความว่าคอมไพเลอร์สร้างรหัสที่ซับซ้อนมากขึ้นจากมัน เพราะเหตุนั้นการค้นหาว่าปัญหาเกิดจากข้อผิดพลาดของคอมไพเลอร์มากกว่าข้อผิดพลาดของรหัสจะง่ายกว่าใน c

ภาษาซีเป็นแบร์โบนมากกว่าและง่ายต่อการติดตามการนำเสนอของมันซึ่งมักจะทำนายได้ง่าย

c ++ นั้นมีความหลากหลายมากกว่า แต่ c เหมาะสำหรับสิ่งที่ระดับต่ำหรือฝังมากกว่า


ในทางกลับกัน "โปรแกรม Linux ส่วนใหญ่" ค่อนข้างเข้าใจผิด ดูที่แอปพลิเคชั่นกราฟิก Python ได้รับความนิยมเพิ่มขึ้นเรื่อย ๆ โดยเฉพาะในสภาพแวดล้อม GUI บน Linux เกี่ยวกับสิ่งเดียวกันที่เกิดขึ้นกับ Windows และ. NET


3
นอกจากนี้ C มี ABI ที่เสถียรและสามารถเชื่อมต่อกับภาษาอื่น ๆ ได้อย่างง่ายดายผ่าน FFI ดั้งเดิมของพวกเขาในขณะที่ C ++ ไม่มี ABI ที่มนุษย์อ่านได้และ g ++ มีการเปลี่ยนแปลงใน ABI ดังนั้นไลบรารีมีแนวโน้มที่จะเขียนใน C แทนที่จะเป็น C ++ เนื่องจากคุณต้องการมีหนึ่งภาษาในโครงการดังนั้นโปรแกรมจึงรวมเข้ากับไลบรารี (อย่างน้อยนั่นก็เป็นเรื่องราวของ Gnome)
Maciej Piechotka

@MaciejPiechotka ทั้งหมดนี้เป็นความจริงและเป็นการสนทนาที่ดี แต่c ไม่มี ABI ที่กำหนดยกเว้นว่ามักจะมีวิธี"ชัดเจน"ในการทำงานกับแต่ละแพลตฟอร์ม หลังจากนั้นก็ติดตามผู้นำ
dmckee

@dmckee: ฉันไม่ได้ระบุว่ามันได้มาตรฐาน แต่ C API ในแต่ละแพลตฟอร์มปฏิบัติตามกฎง่ายๆ (รวมถึงไม่มีหรือ mangling น้อยที่สุด) ซึ่งไม่ค่อยมีการเปลี่ยนแปลง - ซึ่งทำให้มีประโยชน์สำหรับวัตถุประสงค์แม้ว่าจะไม่ถูกต้อง 100%
Maciej Piechotka

2
ทุกวันนี้คุณสามารถพิจารณาได้ว่า ... * ทุกสิ่งที่คุณสามารถทำได้ใน C คุณสามารถทำได้ใน C ++ ด้วยวิธีเดียวกันก็คิดว่า "extern C" ... * คอมไพเลอร์จะไม่สร้างโค้ดที่ซับซ้อนมากขึ้นถ้า คุณไม่ได้เขียนโค้ดที่ซับซ้อนมากขึ้น ... * คุณสามารถเขียนเนื้อหาแบร์โบนเดียวกันใน C ++ ... * คุณสามารถเชื่อมโยงและใช้ไลบรารี C ++ จาก C ในที่สุดมันก็เป็นปัญหาในอดีต
Zrin

7

หลังจากอ่านอีเมลต่อไปนี้จาก Linus Torvalds ผู้สร้าง linux ฉันอดคิดไม่ได้ว่าคำตอบข้างต้นไม่ถูกต้อง ดูเหมือนว่าเขาจะคิดว่าโปรแกรมเมอร์ C ++ ไม่ใช่โปรแกรมเมอร์ระบบที่ดี และคุณสมบัติพิเศษใน C ++ มักจะทำให้เกิดปัญหามากขึ้นในระยะยาวเมื่อเทียบกับผลประโยชน์ที่พวกเขานำมาในระยะสั้น ในขณะที่บางคนอาจไม่เห็นด้วยกับเขา แต่ก็ยากที่จะพูดเกินจริงถึงอิทธิพลที่เขามีต่อระบบปฏิบัติการ linux

http://harmful.cat-v.org/software/c++/linus


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