ทำไมระบบปฏิบัติการถึงมีข้อมูลระดับต่ำใน C และ C ++ ทำไมไม่ใช่แค่ C ++?


20

ในหน้า Wikipedia สำหรับ Windowsจะระบุว่า Windows เขียนไว้ใน Assembly สำหรับ bootloader และ task switcher และ C และ C ++ สำหรับเคอร์เนลรูทีน

IIRC คุณสามารถเรียกใช้ฟังก์ชัน C ++ ได้จากextern "C"'d block ฉันสามารถใช้ C สำหรับฟังก์ชั่นเคอร์เนลเพื่อให้แอป C บริสุทธิ์สามารถใช้งานได้ (เช่นprintfและอย่างนั้น) แต่ถ้าพวกเขาสามารถห่อในextern "C "บล็อกแล้วทำไมต้องใช้รหัสใน C?


10
คุณเคยเห็นสิ่งต่างๆ "ทำไมต้องใช้ C เมื่อมี C ++" มีคำถามที่นี่ นี้ไม่จำเป็นต้องซ้ำ ๆ ของพวกเขา แต่พวกเขากำลังที่เกี่ยวข้อง

1
"คุณสามารถเรียกใช้ฟังก์ชัน C ++ จากบล็อกภายนอก" C "'d เป็น C ++" คุณหมายถึงคุณสามารถเรียกใช้ฟังก์ชันC ... หรือไม่
Code-Guru

@ Code-Guru no เพราะความแตกต่างเพียงอย่างเดียวระหว่างฟังก์ชั่น C และ C ++ ที่ส่งออกคือการตกแต่งชื่อและใน C ++ ซึ่งเป็นการเพิ่มthisตัวแปร
Cole Johnson

2
โยนข้อยกเว้นใน ISR และดูว่าเกิดอะไรขึ้น
James

อีกคำถาม C กับ C ++
Machado

คำตอบ:


31

ส่วนใหญ่ด้วยเหตุผลทางประวัติศาสตร์ เคอร์เนล windows บางส่วนถูกเขียนด้วยภาษา C ตั้งแต่ปี 1983 กว่าสามทศวรรษที่ผ่านมาเมื่อWindows 1.0 ถูกปลดปล่อยออกมา C ++ ก็แทบจะไม่ได้รับการปล่อยตัวออกมา ตอนนี้ C-libraries เหล่านี้จะอยู่ที่นั่นตลอดไปเพราะ Microsoft ทำให้จุดขายและการเขียน C-parts รุ่นที่เข้ากันได้ใน C ++ นั้นต้องใช้ความพยายามอย่างมากเพื่อผลประโยชน์ที่ไม่ได้ผล


+1, ฉันเดาว่าเป็นคำตอบที่สมจริงที่สุด (นอกเหนือจากข้อเท็จจริงที่ว่าอาจมีเคอร์เนล Windows บางตัวที่ไม่ชอบ C ++ หรือไม่ไว้วางใจคอมไพเลอร์ C ++ สำหรับสิ่งที่อยู่ในระดับต่ำ) ตัวอย่างเช่นที่นี่stackoverflow.com/questions/520068/…เหตุใดเคอร์เนล Linux จึงถูกเขียนเป็นภาษาซี
Doc Brown

@ back2dos - ในขณะที่รหัส C ของพวกเขาจะไม่ถูกทิ้งนั่นไม่ได้หมายความว่ามันจะถูกใช้หรือไม่ได้รับการปรับปรุง ฉันรับประกันคุณว่ามีวิธีการอย่างน้อยหนึ่งอย่างที่ทำสิ่งที่เขียนไว้ในห้องสมุด C ซึ่งได้รับการย้ายห้องสมุด C ++ ใน Windows 8
Ramhound

8
ฉันมีความยากลำบากในการเชื่อว่ามีรหัส Windows 1.0 ใน Windows รุ่นล่าสุด Windows ME เป็นรุ่นล่าสุดของ Windows ที่ไม่ได้ยึดตามรหัสฐานของ Windows NT และแม้ว่ามันจะถูกแทนที่ด้วยเคอร์เนล RT ใหม่ (ซึ่งอย่างที่ฉันเข้าใจแล้วมันก็ไม่ได้สัญญาอะไรมากกับความเข้ากันได้ของถอยหลัง)
TMN

@TMN: อาร์กิวเมนต์เป็นส่วนใหญ่อาจจะถูกต้องอย่างใดอย่างหนึ่ง - ผมค่อนข้างแน่ใจว่าบนท้องถนนจาก Win 1.0 ถึงตอนนี้มีเป็นจำนวนมากของห้องสมุดในภาษา C ซึ่งยังคงเป็นส่วนหนึ่งของปัจจุบันฐานรหัส Win8 และไม่มีใครที่ MS เห็นใด ๆ ประโยชน์ในการเขียนใหม่ใน C ++
Doc Brown

1
แทบจะไม่มีรหัสใด ๆ ที่พูดถึงเคอร์เนลของ Windows อยู่ดี โดยทั่วไปมีเพียงไดรเวอร์เท่านั้นที่ทำได้ แอปพลิเคชันมักจะพูดคุยกับ Win32 API หรือ POSIX API
MSalters

24

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

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

และสิ่งนี้มีความสำคัญมากในซอฟต์แวร์ฝังตัวซึ่งค่าใช้จ่ายของบั๊กที่ปรับใช้นั้นสูงมากเมื่อเทียบกับส่วนที่เหลือของอุตสาหกรรม (เปรียบเทียบเว็บซึ่งคุณสามารถนำ patch มาใช้กับผู้ใช้ทุกคนได้ทันที) ไม่ต้องพูดถึงซอฟต์แวร์ที่มีความสำคัญต่อภารกิจและสิ่งของทางการแพทย์

มีความพยายามที่จะแทนที่ C จากตำแหน่งที่โดดเด่นในการเขียนโปรแกรมระดับต่ำด้วยภาษาที่ดียิ่งขึ้นในที่นี้เช่น BitC แต่พวกเขายังไม่ประสบความสำเร็จ


4
+1 สำหรับการกล่าวถึงภารกิจสำคัญของซอฟต์แวร์ใน pure C (เช่นซอฟต์แวร์เกี่ยวกับการบิน) อย่างไรก็ตามในซอฟต์แวร์ทางการแพทย์ยังใช้ C ++ ด้วย (ใช้การทดสอบอย่างกว้างขวางแทนการตรวจสอบอย่างเป็นทางการซึ่งจะยากมากใน C ++)
จอร์โจ

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

2
@Lundin MISRA แนวทางไม่ใช่ส่วนย่อยที่ปลอดภัย - คุณยังคงมีพอยน์เตอร์ดิบและคุณสมบัติอื่น ๆ ส่วนใหญ่ที่ทำให้ C ไม่ปลอดภัย - พวกเขามุ่งเน้นไปที่การไม่ใช้หรือจัดทำเอกสารพฤติกรรมที่เฉพาะเจาะจง
Pete Kirkham

@PeteKirkham MISRA-C จะจับข้อบกพร่องตัวชี้คลาสสิกทั้งหมดและบังคับใช้การวิเคราะห์แบบคงที่ มาตรฐานความปลอดภัยอุตสาหกรรม (IEC 61508 และคณะ) เห็นชอบ MISRA-C เป็นส่วนย่อยที่ปลอดภัยของ C ไม่มีทางเลือกอื่นที่เป็นประโยชน์สำหรับซอฟต์แวร์ที่มีความสำคัญต่อภารกิจเว้นแต่ว่าคุณจะเลือก SPARK Ada ภาษาที่มีคนรู้น้อยด้วยเครื่องมือ จำกัด สนับสนุน.

2
สิ่งนี้ควรถูกเลือกเป็นคำตอบที่ดีที่สุดเพราะถูกต้อง คนอื่น ๆ ที่แนะนำ C ใช้เพื่อเหตุผลทางประวัติศาสตร์เท่านั้นที่เป็นโรคฮิสทีเรียในตัวมันเอง
Rob

15
  1. รันไทม์ C นั้นเล็กกว่ามาก
  2. การแปล C ++ เป็นโครงสร้างระดับล่างจะมีความโปร่งใสน้อยกว่าใน C (ดูการอ้างอิงและ vtables สำหรับตัวอย่างรวดเร็วสองตัวอย่าง)
  3. C มักจะมี ABI ที่มั่นคง C ++ มักจะไม่ ซึ่งหมายความว่าอย่างน้อยที่สุดอินเตอร์เฟสการเรียกระบบควรเป็นสไตล์ C นอกจากนี้หากคุณต้องการโมดูลแบบไดนามิกใด ๆ การมี ABI ที่สอดคล้องกันจะช่วยได้มาก

+1 สำหรับ (2) และ (3) ฉันไม่มั่นใจกับ (1)
Thomas Eding

7
@Thomas Eding: C ++ runtime ประกอบด้วย C runtime รวมถึงคุณสมบัติ C ++ เช่นข้อยกเว้น RTTI และตัวจัดสรรหน่วยความจำอื่น YMMV เป็นไปได้ว่านับว่าเป็นมากขนาดใหญ่ (และมีห้องสมุดมาตรฐาน ... )
wnoise

อ่าฉันลืมเกี่ยวกับข้อยกเว้นและพูลใหม่ / ลบ RTTI ฉันไม่เคยใช้เลย: D
Thomas Eding

11

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

แม้ว่าเราจะมีไฟล์ C ที่กระจัดกระจาย แต่ส่วนใหญ่เป็นเพราะรหัสบุคคลที่สาม รหัสระดับต่ำของบุคคลที่สามนั้นมีให้ใน C เกือบทุกครั้งเพราะมันง่ายกว่าที่จะรวมรหัส C ลงในแอป C ++ มากกว่าวิธีอื่น ๆ


6

ผู้พัฒนาเคอร์เนลมักจะเป็นคนประเภทที่รู้สึกมีความสุขมากขึ้นเมื่อเห็นได้ชัดจากแหล่งที่มาในทันทีสิ่งที่รหัสทำ

C ++ มีคุณสมบัติอื่น ๆ อีกมากมายซึ่งซ่อนสิ่งที่รหัสทำมากกว่ารหัส C ธรรมดาซ่อนอยู่: overloads, วิธีเสมือน, แม่แบบ, การอ้างอิง, การพ่น ... C ++ ยังมีไวยากรณ์เพิ่มเติมอีกมากมายที่คุณต้องเชี่ยวชาญเพื่อให้เข้าใจ C ++ รหัสใช้มัน

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

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

นอกจากนี้ความปลอดภัยและความเสถียรยังมีความสำคัญยิ่งขึ้นในเคอร์เนลและวิธีการเสมือนนั้นมีความยืดหยุ่นมากกว่าและยากที่จะแยกและตรวจสอบได้มากกว่าการโทรกลับธรรมดาหรือกลไก C-like อื่น ๆ

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


+1 ในฐานะนักพัฒนาเคอร์เนล "กฎง่ายๆ" ของฉันคือถ้าคุณไม่สามารถประเมิน "แคชไลน์ที่แตะ" ได้อย่างง่ายดายภาษาที่คุณใช้จะทำอันตรายมากกว่าดี
เบรนแดน

การชี้แจง: สำหรับเมล็ดคุณต้องสมมติว่า CPU ใช้เวลาส่วนใหญ่ในพื้นที่ผู้ใช้และรหัสเคอร์เนลจะถูกใช้เป็นระยะ ๆ (เช่นเมื่อผู้ใช้เรียกพื้นที่เคอร์เนล API หรือการขัดจังหวะ); ซึ่งหมายความว่าคุณต้องสมมติว่า "cold cache" สำหรับ CPU ที่ทันสมัย ​​(ที่ RAM ช้าเมื่อเทียบกับความเร็ว CPU) และ TLB ที่พลาดไปนั้นมีราคาแพงดังนั้น (เมื่อรวมกับความคาดหวัง "Cold cache") เมตริก "แคชไลน์ที่แตะ" จะกลายเป็นตัวบ่งชี้ที่สำคัญอย่างยิ่งสำหรับประสิทธิภาพและ / หรือความสามารถในการขยาย
เบรนแดน

5

Bjarne Stroustrup ในการสัมภาษณ์ในเดือนกรกฎาคม 1999 :

ไม่มีภาษาเหล่านี้แตกต่างอย่างสิ้นเชิงหรือดีกว่าภาษาร่วมสมัยอื่น ๆ อย่างไรก็ตามพวกเขาดีพอและผู้รับผลประโยชน์จากโชคและปัจจัยทางสังคม


2
ยินดีต้อนรับเดวิด เมื่ออ้างอิงหรืออ้างถึงมันเป็นความคิดที่ดีที่จะให้การอ้างอิง (เพิ่ม!)
แอนดรู

3

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

C ++ คือ "C one better", เพิ่มจำนวนคุณสมบัติที่ใช้งานง่ายเช่นการจัดสรรหน่วยความจำแบบไดนามิก, โครงสร้าง marshalling ในตัว, ไลบรารีขนาดใหญ่ของรหัสที่กำหนดไว้ล่วงหน้าและอื่น ๆ ที่สูญเสียประสิทธิภาพบางอย่าง กว่าสภาพแวดล้อมที่ได้รับการจัดการรันไทม์) สำหรับ coder โดยเฉลี่ยข้อดีนั้นมีมากกว่าข้อเสียในพื้นที่ของ codebase ที่ไม่ต้องการการควบคุมการจัดสรรหน่วยความจำแบบทวารหนั

การรวมกันของทั้งสองเป็นแบบดั้งเดิมที่สวยงาม; คุณใช้ C เพื่อเขียนพื้นที่ที่สำคัญต่อประสิทธิภาพการทำงานที่สำคัญที่สุดของหน่วยความจำของโค้ดเบสซึ่งคุณสามารถทำงานในรูปแบบที่เป็นนามธรรมผ่านการเรียกใช้เมธอดจากรหัส C ++ ซึ่งสามารถจัดระเบียบและออกแบบได้อย่างหรูหรากว่านักปฏิบัติการ uber , รหัส C ที่ได้รับการปรับปรุง uber-oogly


2
เกี่ยวกับประสิทธิภาพฉันจะทำซ้ำตัวเอง: (1) คน C ++ จะบอกคุณว่าเป็นเรื่องไร้สาระ (2) ฉันกำลังบอกว่าฉันไม่เห็นเหตุผลที่ควรเป็นเช่นนี้และต้องการตัวอย่างที่เป็นรูปธรรม ไม่ใช่ตัวอย่างของวิธีการเขียนโค้ดที่มีประสิทธิภาพน้อยลง แต่ตัวอย่างของวิธีการที่มีประสิทธิภาพเหมือนกับ C ต้องมีความอัปลักษณ์ที่ไม่เหมาะสม

3
กำหนด "น่าเกลียด"; ฉันเขียนโค้ดในภาษา C # เพื่อการใช้ชีวิตและเมื่อใดก็ตามที่ฉันเห็นตัวอย่างรหัส C ++ ใน StackOverflow ฉันประจบประแจงว่า cruft เท่าไรที่ถือว่าเป็นเรื่องปกติในการใช้ภาษาในแต่ละวัน เมื่อฉันเขียนโค้ดด้วยวิธี C ++ ย้อนกลับไปเมื่อไหร่ฉันมักจะเห็นรหัส C และ cringed ประเภทโครงสร้างการบรรจุด้วยมือการคำนวณตัวชี้การดำเนินการสำหรับการข้ามด้วยตนเองการฝัง ASM ... yuck บางคนสูญเสียความรู้ระดับต่ำในหมู่โปรแกรมเมอร์ Java / .NET ฉันคิดว่ามันเป็นประโยชน์อย่างมากต่อผลผลิต
KeithS

1
คุณไม่ได้ตอบคำถามของฉัน;) โดย "น่าเกลียด" ฉันหมายถึง "น่าเกลียดโดย C ++ gurus 'มาตรฐาน" กล่าวอีกนัยหนึ่งตัวอย่างที่ไม่สามารถใช้ "modern C ++" และมีประสิทธิภาพเท่ากับ C

2
นั่นอาจเป็นจริง (ฉันไม่รู้เหมือนกัน) สำหรับการพัฒนาเคอร์เนล (และสาขาอื่น ๆ ) เราไม่ได้พูดถึงโปรแกรมเมอร์โดยเฉลี่ย

3
ผู้คนลืมว่า C -> C ++ นั้นต่อเนื่องกัน บ่อยครั้งที่ข้อโต้แย้งเหล่านี้มีการเปรียบเทียบที่ดีทันสมัย ​​C ++ กับ C คุณสามารถใช้โปรแกรม C และรวบรวมมันด้วยคอมไพเลอร์ C ++ ในเวลาอันสั้นและมันก็จะทำงานได้อย่างรวดเร็ว หากคุณสมบัติ C ++ ที่ทันสมัยเป็น "ช้าเกินไป" อย่าใช้มัน iostreamที่ยังสามารถรวมถึงสิ่งที่ชอบ "ช้าเกินไป" ไม่ใช่ข้อแก้ตัวที่ดีในการใช้ C มากกว่า C ++
Gort the Robot

1

อาจเป็นได้ว่าเมื่อคุณใช้ C ใช้เวลาส่วนใหญ่คิดเกี่ยวกับปัญหาที่เกิดขึ้นและวิธีเขียนรหัสโซลูชัน ใน C ++ คุณคิดเกี่ยวกับ C ++ และคุณสมบัติมากมายฟังก์ชั่นและไวยากรณ์ที่ไม่ชัดเจน

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

ประสบการณ์ของฉันคือสำหรับคุณสมบัติที่ชาญฉลาดและความบริสุทธิ์ของ OO ของ C ++ การเขียนโค้ดใน C ธรรมดาทำให้งานเสร็จเร็วขึ้นและมีประสิทธิภาพมากขึ้น


0

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

หากคุณมีคอมไพเลอร์ C ++ ที่มีคุณภาพแทบไม่มีเหตุผลที่จะผสม C และ C ++ ในโครงการ เกือบจะ

เหตุผลหนึ่งอาจเป็นเพราะโครงการของคุณใช้รหัส C ร่วมกับโครงการอื่น ๆ รหัสไม่ได้คอมไพล์เป็น C ++ และคุณไม่ต้องการเก็บ C ++ ทางแยกของรหัสนั้น


-1

ฉันคิดว่าคุณมีมันย้อนหลัง - extern "C"บล็อกทำให้มั่นใจได้ว่าการประชุมการโทร C จะใช้สำหรับฟังก์ชั่นทั้งหมดภายในบล็อก ดังนั้นคุณสามารถเรียกฟังก์ชั่น Pure C จาก C ++ ไม่ใช่ฟังก์ชั่น C ++ จาก C ไม่ว่าฉันจะคิดว่าเหตุผลที่คนใช้ทั้ง C และ C ++ นั้นเป็นเพราะมีไลบรารี่ระดับต่ำจำนวนมากเขียนโดยใช้ C และมันง่ายกว่า มีอยู่แล้ว (และมีการดีบั๊กและปรับให้เหมาะสม) กว่าการเขียนของคุณเอง OTOH, C ++ นำเสนอฟีเจอร์ระดับสูงมากมายที่ผู้คนมักจะใช้งานด้วยดังนั้นพวกเขาจึงใช้สิ่งนั้นตลอดเวลา


-2

มีแพลตฟอร์มฝังตัวหลายระดับโดยใช้ C เป็นภาษาการเขียนโปรแกรม (แน่นอนว่าคุณมีอิสระในการใช้ภาษาแอสเซมบลีได้ตลอดเวลา)

สำหรับ 'ระดับ' ฉันกำลังพูดถึงระดับ SRAM ภายในและระดับทรัพยากร ROM ของระบบ

บางครั้งแพลตฟอร์มเหล่านี้มีข้อ จำกัด ด้านทรัพยากร (เช่น 8051 แพลตฟอร์มบางรุ่นมี 128 ไบต์ของ User SRAM เท่านั้น)

มันไม่มีความหมายเลยที่จะรองรับการจัดสรรหน่วยความจำแบบไดนามิกที่มีจำนวนเล็กน้อยสำหรับ RAM (ใหม่ / ลบ) หรือแม้กระทั่ง malloc ใน C

หนึ่งในการปรับปรุงหลักจาก C ถึง C ++ คือกระบวนทัศน์เชิงวัตถุ C ++ เหมาะสำหรับซอฟต์แวร์ที่มีหน่วยความจำขนาดใหญ่กว่า

แต่ไม่ใช่ในเฟิร์มแวร์ในตัวที่มีขนาด จำกัด สูงสุดถึง 32KB (เช่นใน plaform MCU แบบ 16 บิต)

ไม่จำเป็นต้องมีคอมไพเลอร์ C ++ ซึ่งโดยทั่วไปแล้วจะซับซ้อนกว่าคอมไพเลอร์ C (อย่างน้อยผู้ให้บริการ SDK จะไม่สนใจสิ่งนี้)

ในความเป็นจริงฉันแทบจะไม่สามารถหาคอมไพเลอร์ C ++ บนแพลตฟอร์ม ARM7 แบบ 32 บิต

มันก็ไม่คุ้มกับความซับซ้อน

ในบาง 8051 (8 บิต): ROM 1MB, RAM 128B

TI MSP430 (16 บิต): 32KB ROM, 4KB RAM

ST Microelectronics ARM คอร์เท็กซ์™แบบ 32 บิต -M3 ซีพียูคอร์ (STM32F103T4): 16 หรือ 32 Kbytes ของหน่วยความจำแฟลช 6 หรือ 10 Kbytes ของ SRAM


2
นี่ไม่ใช่สิ่งใหม่สำหรับคำตอบอื่น ๆ ที่โพสต์ไว้แล้วที่นี่
Martijn Pieters

คอมไพเลอร์ C ++ แบบ 32 บิตสำหรับ ARM? หากคุณต้องการคุณสามารถรวบรวม LLVM จากแหล่งที่มาด้วยตัวคุณเองหลังจากทำการแก้ไขเล็กน้อยเพื่อรับคอมไพเลอร์ C ++ สำหรับ iOS
โคลจอห์นสัน

-4

ฉันเห็นสาเหตุที่เป็นไปได้สองประการ:

  • C มีประสิทธิภาพมากกว่านิดหน่อยถ้าเทียบกับ C ++ ที่เทียบเท่า
  • บางไลบรารีที่ใช้จะเขียนด้วย C
  • พวกเขาใช้บางส่วนของเคอร์เนล Linux ซึ่งเขียนเป็น C

แก้ไข: ตามที่ปรากฏออกอาร์กิวเมนต์ที่สามไม่เป็นความจริง (ดูความคิดเห็น)


5
(1) คน C ++ จะขอแตกต่างกัน และอย่างไม่มีเหตุผลฉันไม่เห็นเหตุผลว่าควรเป็นเช่นนี้ (2) C ++ สามารถโทรไปยังรหัส C ได้เลย (นั่นคือจุดรวมของความเข้ากันได้แบบย้อนหลังและextern "C")

1
หาก MS ใช้บางส่วนของเคอร์เนล Linux และเคอร์เนล Linux คือ GPL นั่นหมายความว่า Windows จะต้องเป็น GPL ด้วยหรือไม่
TomJ

1
@TomJ ที่จริงนั่นเป็นเหตุผลที่พวกเขาถูกบังคับให้บริจาคสองสามพันบรรทัดเพื่อ Linux เช่นกัน + ทำไมคุณถึงคิดว่าพวกเขาสนับสนุนการพัฒนา Linux?
Pijusn

2
@Pius จุดของเขาคือ (และเขาพูดถูก AFAIK) หากมีรหัสของ GPL ที่เชื่อมโยงกับเคอร์เนลของ Windows เคอร์เนลทั้งหมดจะต้องเป็น GPL (หากไม่มีข้อตกลงแยกต่างหากกับผู้ถือลิขสิทธิ์)

@delnan ไม่แน่ใจเกี่ยวกับรายละเอียด ฉันไม่ใช่ทนายความดังนั้นฉันไม่สามารถแสดงความคิดเห็นได้ แต่มีเรื่องอื้อฉาวเล็ก ๆ เมื่อสองสามปีก่อนเกี่ยวกับเรื่องนี้ ไม่แน่ใจ แต่ฉันคิดว่าฉันอาจเป็นโมดูลระบบเครือข่ายทุกสิ่งที่บ้าเป็นเรื่องเกี่ยวกับ
Pijusn

-4

เนื่องจาก C เป็นภาษาที่ดีกว่า C ++ และเนื่องจากบางส่วนของรหัสถูกเขียนขึ้นก่อนที่ C ++ จะได้รับความนิยมและผู้คนไม่มีเหตุผลที่จะแทนที่

และเนื่องจาก C ++ มีคุณสมบัติมากมายที่สามารถทำลายรหัสของคุณหากคุณไม่ระวังเมื่อใช้มันในเคอร์เนล


C ++ คาดว่าไลบรารีแบบไดนามิก? และหน่วยความจำแบบไดนามิกคืออะไร?

4
[stuff] that C++ expects-1 เหตุใด C ++ จึงใช้ฮีปมากกว่า C ทำไม C ++ ต้องการ DLLs มากกว่า C? ไม่ใช่แค่เรื่องจริง
Thomas Eding

1
การแก้ไข: คุณสูญเสียไลบรารีที่เขียนด้วย C ++ ดังนั้นมันกลับไปที่สแควร์ 1 หากคุณใช้ C ++ หรือ C เหตุใดจึง จำกัด ตัวเองไว้ที่ฟังก์ชัน C หากคุณสามารถใช้เทมเพลตคลาส destructors, const และความดีอื่น ๆ ได้ทุกประเภท
Thomas Eding

6
อะไร? เทมเพลต, ข้อยกเว้น, วัตถุ (รวมถึงคอนสตรัคเตอร์, destructors, โอเปอเรเตอร์ที่โหลดมากเกินไป, ตอนนี้ย้ายสิ่งก่อสร้างและ - จริง ๆ - - ทุกอย่างอื่น) ฯลฯ ทำงานได้ดีโดยไม่คำนึงว่าหน่วยความจำมาจากไหน . คอนเทนเนอร์มาตรฐานใช้การจัดสรรฮีปตามค่าเริ่มต้น แต่ผู้จัดสรรสามารถปรับแต่งและพวกเคอร์เนลเขียนคอลเลกชันและการจัดการหน่วยความจำของตัวเอง -1

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