ภาษาการเขียนโปรแกรม C ยังคงใช้อยู่หรือไม่?


96

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

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

C ยังคงใช้ในการพัฒนาซอฟต์แวร์ใหม่หรือสิ่งอื่นใดอีกหรือไม่?


46
คุณเคยเห็นคอมไพเลอร์ C ++ สำหรับ PIC หรือไม่?
SK-logic

195
ฉันเป็นคนเดียวที่เศร้าที่ใครบางคนจะถือเอาการเรียนรู้ด้วยการเสียเวลาและเงิน?
Jetti

37
" ในความรู้ของฉันการพัฒนาทั้งหมดที่เกี่ยวข้องกับ COM และการออกแบบฮาร์ดแวร์นั้นทำใน C ++ " - ฟังดูแล้วเหมือนว่าคุณไม่ได้ออกแบบอินเตอร์เฟสฮาร์ดแวร์ใด ๆ
Ed S.

32
ผู้คนลืมว่าภาษาระดับสูงที่เราทุกคนรักมักจะถูกนำไปใช้ใน C.
David Cowden

13
@ThomasEding ภาษาที่ตายแล้ว? แน่นอนคุณมีความรู้ จำกัด มากเกี่ยวกับภาษาการเขียนโปรแกรมหากคุณพิจารณาว่า C เป็นภาษาตาย
JesperE

คำตอบ:


214

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

ใน (IMO) การลดคำสั่งของการให้เหตุผล C ยังคงใช้บ่อยๆ

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

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

  • ซอฟต์แวร์โอเพ่นซอร์ส
    ซึ่งส่วนใหญ่เป็นปัญหาด้านทัศนคติ: OSS ต้องการ C มากกว่า C ++ เสมอ (ในขณะที่มันเป็นสิ่งที่ตรงกันข้ามในอุตสาหกรรมขนาดใหญ่) Torvalds' ความเกลียดชังไม่ลงตัวจริงอาจจะเป็นเหตุผลที่สำคัญที่สุดสำหรับการนี้บน Linux


16
มันเป็นประวัติศาสตร์มากกว่าทัศนคติ หลายสิ่งที่คุณอาจพิจารณาว่าเป็นแพคเกจโอเพ่นซอร์ส "แกนหลัก" ได้รับการพัฒนาเมื่อ C ++ ไม่สามารถใช้งานได้อย่างกว้างขวางในขณะนี้และทรัพยากรยังขาดแคลนอยู่
Blrfl

65
ดัชนี TIOBE เป็นเรื่องตลก ความนิยมของเครื่องมือค้นหาไม่มีความหมาย
DeadMG

29
@Sedate: แม่แบบนั้นโดยทั่วไปแล้วทำให้เกิดการขยายตัวของรหัสเป็นตำนานที่มาจากยุคของคอมไพเลอร์ C ++ โบราณ คอมไพเลอร์สมัยใหม่จะพับอินสแตนซ์เทมเพลตที่เหมือนกัน OTOH เทมเพลตอนุญาตให้ใช้เทมเพลต meta-programming ซึ่งเรียกใช้งานโค้ดในเวลาคอมไพล์แทนที่จะรันไทม์ทำให้โค้ดถูกสร้างขึ้นน้อยลง นอกจากนี้พวกเขาสร้างโปรแกรมที่ปลอดภัยมากขึ้น (การแคสติ้งน้อยกว่า) สิ่งที่มักจะสำคัญมากในโดเมนแบบฝัง EC ++ ได้รับการทุบตีจนตายโดยผู้เชี่ยวชาญ C ++ มากกว่า (เหนือสิ่งอื่นใด) ความโง่เขลาที่แท้จริงของการทิ้งแม่แบบ
sbi

18
@James: คุณหมายถึงสิ่งต่าง ๆ เช่น abstractions ที่มีประสิทธิภาพการเขียนโปรแกรมทั่วไปและความปลอดภัยของประเภท? ใช่ใครต้องการมัน
Xeo

11
@JesperE มันเกิดขึ้นฉันเปลี่ยนงานตั้งแต่ฉันเขียนมันและตอนนี้ฉันกำลังเขียนโปรแกรมสำหรับอุปกรณ์ฝังตัว เราใช้ C ++ และเป็นสิ่งที่น่าทึ่งที่ STL และเทมเพลตการเขียนโปรแกรมเมตาสามารถทำเพื่อคุณได้เมื่อคุณมีฮาร์ดแวร์ที่อ่อนแอและข้อ จำกัด ของเรียลไทม์ที่ยากลำบาก (เรากำลังทำโรงไฟฟ้า) ใช่คุณต้องรู้ว่าคุณควรใช้std::vectorหรือstd::mapสำหรับรหัสบางส่วน - แต่คุณไม่จำเป็นต้องใช้มันเอง แต่สามารถพึ่งพานักทดสอบที่มีประสิทธิภาพสูง และการใช้งานห้องสมุดที่เชื่อถือได้ซึ่งมีบทคัดย่อสูง
sbi

119

C ถูกใช้งานจำนวนมากในการเขียนโปรแกรมฮาร์ดแวร์แบบฝังตัวที่ทรัพยากรขาดแคลน

ลินุกซ์เคอร์เนลถูกเขียนใน C เพราะตาม Linus Torvalds, C ++ เป็นภาษาที่น่ากลัว


14
ฉันคิดว่าเคอร์เนล Windows ส่วนใหญ่ก็เป็นแบบ C และระบบดั้งเดิมมากมาย
Coder

14
จะเสร็จสมบูรณ์ Linus ได้ลอง C ++ ในเคอร์เนล นั่นเป็นปัญหามากกว่าข้อดี อย่างไรก็ตามการพัฒนาเคอร์เนลเป็นหัวข้อที่เฉพาะเจาะจงจริงๆนั่นไม่ได้หมายความว่า C ++ ไม่ดีโดยทั่วไป
deadalnix

75
ตามที่คนอื่น ๆ การถกเถียงของ Linus นั้นแย่มาก
sbi

36
ข้อโต้แย้งของไลนัสอาจจะหรืออาจจะไม่ถูกต้อง แต่ลินุกซ์เคอร์เนลยังคงเขียนในที่ราบ :-) C
Joonas Pulakka

15
ไลนัสเป็นคอมไพล์
ubiyubix

94

ภาษาสมัยใหม่ทั้งหมดที่ฉันได้เห็นอาจโต้ตอบกับ C:

  • C ++
  • ชวา
  • C #
  • หลาม
  • Haskell
  • วัตถุประสงค์ C

ความจำเป็นในการโต้ตอบกับ C เกิดขึ้นจาก:

  • C มี ABI ง่าย ๆ
  • C อยู่รอบ ๆ เป็นเวลานาน

หมายความว่าเนื่องจากภาษาเหล่านั้นสามารถสื่อสารกับ C ได้จึงสามารถ:

  • ใช้ประโยชน์จากห้องสมุดของมัน
  • สื่อสารกับแต่ละอื่น ๆผ่าน C (ตัวอย่างเช่น Clang เขียนใน C ++ แต่ให้ Python Bindings ติดกับอินเตอร์เฟส C)

และฉันจะเดิมพันว่าพวกเขาทั้งหมดพึ่งพา C สำหรับเวลาทำงานของพวกเขา (นอกเสียจากว่าพวกเขาจะเข้าร่วมการประชุมเต็ม?

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


45

ในความเห็นของฉันนี่เป็นคำถามที่สายตาสั้นมากคล้ายกับ "เพื่อนของฉันและฉันฟัง Reggae ไม่มีใครยังฟัง Rap จริง ๆ "

ทุกภาษามีการใช้งาน ภาษาที่ต่างกันมีช่องของพวกเขาแน่นอน แต่ถามเกี่ยวกับ C! ฉันมั่นใจว่ามีผู้ใช้ C # น้อยกว่า C ในชีวิตประจำวัน (จากมุมมองที่ลำเอียงโดยสิ้นเชิงในการทำงานในร้านที่ไม่มีใครใช้ C #)

Google มองอย่างรวดเร็วเกี่ยวกับความนิยมของภาษา
ฉันแน่ใจว่าไม่มีสิ่งใดที่เชื่อถือได้ แต่เราสามารถใช้เพื่อดูแนวโน้ม:

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/

แม้แต่การดูอัตราส่วนของคำถามบนแท็ก:
https://stackoverflow.com/tags

  • C #: 209845
  • 16 แท็กอื่น ๆ
  • C: 38790

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

หมายเหตุ: ดัชนี TIOBE ด้านบนได้รับการปรับปรุงอย่างต่อเนื่องมานานกว่าทศวรรษ (และมีข้อมูลบางส่วนที่ย้อนกลับไป 3 ทศวรรษ) ควรจะวัดวิศวกรที่ทำงานในแต่ละภาษา (แม้ว่าฉันจะไม่รู้ว่ามันแม่นยำแค่ไหน) ใน 10 อันดับแรกของภาษายกเว้น Java / Visual Basic มันสะท้อนให้เห็นถึงสิ่งที่ผู้คนในร้านของฉันรู้ (แม้ว่าอัตราส่วนของเราจะแตกต่างกันเล็กน้อยเนื่องจากเรามีขนาดตัวอย่างที่เล็กกว่ามาก)


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

3
@Jetti: นั่นเป็นเหตุผลที่ฉันพูดอย่างชัดเจน: I am sure none of this is authoritative but we can use it to see trendsแต่ฉันไม่เห็นด้วยกับคำสั่งที่สองของคุณ; C ไม่ใช่ภาษาหลักที่สอนในสถาบันการเรียนรู้ระดับสูงอีกต่อไป (ถ้าเป็นเช่นนั้นบัณฑิตชุดใหม่จะไม่ไร้ประโยชน์) คนมักจะเรียนรู้ Java / C # คมชัดในปัจจุบัน นอกจากนี้รายงาน Tiobe ยังเกี่ยวกับงานที่ไม่ได้สอบถาม
มาร์ตินยอร์ก

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

4
ดังนั้นนับแท็กไม่ได้กำหนดความนิยมภาษาโดยทั่วไปมันก็แสดงให้เห็นถึงความนิยมทางภาษาระหว่างผู้ใช้ SO
Ed S.

4
@Ed S. แน่นอน แต่คำถามไม่ได้เกี่ยวกับความนิยม มันเกี่ยวกับการดำรงอยู่ของ C เป็นภาษา การนับแท็ก SO แสดงให้เราเห็นว่ามันไม่ใช่ภาษาที่แน่นอน ความจริงที่ว่า C อยู่ใน 2 อันดับแรกในเว็บไซต์อื่น ๆ ไม่ได้ทำให้มันเป็นภาษาที่ใช้มากที่สุด / วินาที แต่การดำรงอยู่ของมันใน 10 อันดับแรกนั้นเป็นตัวบ่งชี้ที่สำคัญว่ามันยังไม่ตาย แน่นอนว่าสิ่งนี้ไม่ได้เป็นเพียงแค่ตัวบ่งชี้ที่แข็งแกร่งที่ C ยังคงถูกใช้งานอยู่
Martin York

23

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

ซอฟต์แวร์จำนวนมากที่ใช้ในปัจจุบันยังคงเขียนด้วยภาษา C ไม่ต้องพูดถึงไดรเวอร์ฮาร์ดแวร์

ตามดัชนีTiobe , C ยังคงเป็นภาษาที่ใช้มากที่สุด


ตามที่แนะนำ tcrosley คุณอาจต้องการดูคำถามที่เกี่ยวข้องนี้


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


4
อะแฮ่ม !! นั่นเป็นจุดที่ดี ฉันไม่เคยคิดเลยว่า "ความสามารถของ OOP เพิ่มค่าใช้จ่ายสำหรับภาษา" ขอบคุณที่ทำให้จุดนี้ชัดเจน ตอนนี้ฉันสามารถเข้าใจได้แล้วว่า C อยู่ตรงไหนของผู้อื่น
Pankaj Upadhyay

7
@Pankaj C ++ โดยทั่วไปไม่จำเป็นต้องเพิ่มค่าใช้จ่ายในการดำเนินการมากความซับซ้อนของภาษาเป็นหลักการของ "ไม่จ่ายเงินสำหรับสิ่งที่คุณไม่ได้ใช้" - หากคุณไม่ได้ใช้ข้อยกเว้น ช้าลงหรือเพิ่มขนาดรหัสของคุณ คอมไพเลอร์มีขนาดใหญ่และซับซ้อนกว่า
Martin Beckett

2
re C ในฟิลด์ที่ฝังตัวดูคำถามและคำตอบนี้ได้ที่: programmers.stackexchange.com/questions/84514/…
tcrosley

6
คุณไม่จำเป็นต้องใช้ความสามารถของ OOP แต่สามารถทำงานได้ดีในบางสถานการณ์
Ed S.

2
@ Jose Faeti: หัวหน้าของฉันเห็นด้วยเพราะเจ้านายของฉันเป็นคนที่มีประสบการณ์และมีเหตุผล เขาไม่ได้ซื้อศาสนาในการเขียนโปรแกรม
Ed S.

20

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

"ฉันคิดว่าบางคนจะเรียนรู้ C เพื่อทดสอบก็ต่อเมื่อมีการพัฒนาใน C"

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

"ในความรู้ของฉันการพัฒนาทั้งหมดที่เกี่ยวข้องกับ COM และการออกแบบฮาร์ดแวร์ก็ทำใน C ++ ด้วย"

มันไม่ถูกต้อง

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

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


7
C คือเซตย่อยของ C ++นั่นคือสิ่งที่คุณหมายถึง ?? . C ไม่ใช่กลุ่มย่อยของ C ++; แรงเสียดทานพวกเขาค่อนข้างแตกต่างกัน ใช่ C ++ คือการเพิ่มประสิทธิภาพของ C หรือบางครั้งเรียกว่า C พร้อมคลาสและ OOPแต่การที่จะบอกว่า C เป็นเซตย่อยไม่ได้พิสูจน์ว่าเหมาะสม
Pankaj Upadhyay

7
C ++ ส่วนใหญ่จะเป็น superset ของC เวอร์ชั่นเก่าและ C ไปในทิศทางที่แตกต่างกันไปตั้งแต่นั้นมา บางแง่มุมของภาษาที่ได้ไปในทิศทางขนานใหญ่ แต่คนอื่น ๆ ไม่ได้ (และ C ++ มีจำนวนมากของสิ่งอื่น ๆ นอกเหนือจากการ)
Donal Fellows

ฉันเห็นด้วยในการลงคะแนนเพื่อชี้แจงข้อเท็จจริงว่าไม่ใช่โปรแกรม C ที่ถูกต้องทั้งหมดเป็นโปรแกรม C ++ ที่ถูกต้องเช่น C ++ ไม่ใช่ Superset ของ C อย่างไรก็ตามมันเป็นสิ่งที่แทนที่ว่า C เป็นจุดที่ทำให้การตัดสินใจเป็นอย่างไร superset ดังที่ Donal Fellows พูดถึง มันก็ไม่สมเหตุสมผลที่จะบอกว่ามันเป็นอีกต่อไปเมื่อมันไม่จริงอีกต่อไป
Joshua Hedges

16

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

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

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


D สามารถเรียกรหัส C โดยตรงเช่นเดียวกับ C ++ สิ่งที่คุณต้องการหากต้นแบบฟังก์ชั่น (อีกครั้งเช่นเดียวกับ C ++) คุณเพียงแค่เขียนextern(C)ใน D ในขณะที่ใน c ++ คุณเขียนextern "C"
ปีเตอร์อเล็กซานเด

@ ปีเตอร์อเล็กซานเดฉันรู้ extern (C) ใน D. นั่นคือสิ่งที่ฉันหมายถึงเมื่อฉันพูดไฟล์ wrapper คุณไม่สามารถรวมส่วนหัว C โดยตรง (ซึ่งคุณสามารถทำได้ใน C ++ สมมติว่าส่วนหัว C ใช้ extern "C" และมี #ifdef __cplusplus บล็อกซึ่งส่วนใหญ่ทำ) มีความไม่ลงรอยกันอื่น ๆ ในหมู่เพียงแค่ใช้ extern (C) (โดยเฉพาะอย่างยิ่งวิธีการจัดการสตริงเพื่อความรู้ของฉันพวกเขาไม่ได้มี null terminator ใน D ดังนั้นคุณต้องเปลี่ยนอาร์เรย์เป็นพิเศษเมื่อผ่านไป C)
jsternberg

11

ลองดูlangpop.comโดยเฉพาะกราฟจาก Freshmeat และ Google Code มันแสดงให้เห็นว่า C ยังคงอยู่ข้างหน้า

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


4
อย่าเปิด URL นี้! เว็บไซต์ไม่มีอยู่อีกต่อไปและ URL จะเปลี่ยนเส้นทางไปยังหน้าสแปมที่น่ารำคาญ
Nikolay Suvandzhiev

11

ฉันใช้มันเกือบทุกวันในการพัฒนาสำหรับ iPad / iPhone ห้องสมุดหลายแห่งเขียนด้วยภาษา C และไม่มีวัตถุประสงค์เทียบเท่า C ใช่แล้วมันยังคงใช้อยู่และเป็นหนึ่งในอุปกรณ์ใหม่ล่าสุดในตลาด

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


2
"Objective-C ยังเด็ก" จริง ๆ แล้วมันมาจากช่วงกลางยุค 80 ประมาณเท่า C ++ แม้ว่าคนส่วนใหญ่ที่ใช้มันจะไม่เจอจนกระทั่งปี 2007

จริงสิ่งที่ฉันอยากจะพูดก็คือโดยทั่วไปแล้วมีห้องสมุด C หลายแห่งที่ไม่เทียบเท่า Objective-C สำหรับ iOS แน่นอนว่าภาษานั้นไม่ได้อายุน้อย (ตรวจสอบกับ Wiki) ขอบคุณสำหรับการชี้ให้เห็นว่า
Valentin Radu

7

โดยทั่วไปสำหรับระบบฝังตัว C ยังคงใช้กันอย่างแพร่หลาย

คำถามนี้ให้ตัวอย่างอื่น

ดัชนี TIOBEซึ่งพยายามที่จะจำแนกภาษาโดยนิยม / การใช้งานอย่างต่อเนื่องทำให้ซีในสถานที่แรก


อันดับที่ 2 (หลัง Java)
Martin York

7
น่าสนใจว่าทั้ง C ++ และ Java ดูเหมือนว่าทั้งสองมีแนวโน้มลดลงในความนิยมในช่วง 10 ปีที่ผ่านมาในขณะที่ C ยังคงไม่เปลี่ยนแปลง
Paul R

7

ความเบา

ทำรายการของทุกระบบที่คุณคิดว่าจะเรียกใช้รหัส C จากนั้นรายการที่คล้ายกันสำหรับภาษาอื่น ๆ ที่คุณชอบ

หากคุณได้คำตอบเดียวกับฉันข้อสรุปก็คือใช่


5

ฉันคิดว่า C เป็นภาษาที่ทรงพลังที่สุดเนื่องจากเหตุผลดังต่อไปนี้!

1) AT first C เป็นภาษาระบบ (ซึ่งหมายความว่าสามารถใช้ในการเขียนโปรแกรมระดับต่ำโดยใช้เวลาน้อยที่สุดหรือไม่มีเวลาทำงาน)

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

3) C มีแอปพลิเคชั่นในการเขียนโปรแกรมเฟิร์มแวร์ (ฮาร์ดแวร์) นั่นเป็นเพราะความสามารถในการใช้ / ทำงานกับแอสเซมบลีและสื่อสารโดยตรงกับตัวควบคุมโปรเซสเซอร์และอุปกรณ์อื่น ๆ

4) C เป็นหน่วยการสร้างสำหรับภาษาอื่น ๆ อีกมากมายที่รู้จักกันในปัจจุบัน ค้นหาประวัติของ C แล้วคุณจะพบว่ามันมีมานานแล้ว ดู Python เช่นภาษาการเขียนโปรแกรมระดับสูงแบบ Object-Oriented มันเขียนใน C (อาจ C ++ ด้วย) นั่นจะบอกคุณว่าคุณต้องการทราบว่าเกิดอะไรขึ้นภายใต้ประทุนในภาษาอื่น การทำความเข้าใจ C และวิธีการทำงานเป็นสิ่งจำเป็น

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

ภาษาของระบบใช้สำหรับการเขียนโปรแกรมระดับต่ำ เช่นไมโครคอนโทรลเลอร์คอนโทรลเลอร์ไดรเวอร์และเคอร์เนลระบบปฏิบัติการ ตัวอย่างรวมถึงแอสเซมบลี C. พวกเขาต้องการรันไทม์น้อยหรือไม่มีเลยเพื่อเรียกใช้รหัสบนฮาร์ดแวร์โดยตรงและเน้นสำหรับโปรแกรมเมอร์ที่มีการควบคุมโดยตรงกับฮาร์ดแวร์

โดยรวมแล้วมันลดลงในฐานะภาษาแอปพลิเคชัน แต่ก็ยังคงแข็งแกร่งเหมือนภาษาระบบ


1

โอ้ใช่มันถูกใช้ ฉันทำงานในด้านการประมวลผลแพ็คเก็ตเครือข่าย ฉันอยู่ที่ บริษัท ต่าง ๆ สองแห่งที่เราดำเนินการแพ็คเก็ตเครือข่าย ดังนั้นเรากำลังทำงานที่ระดับ Ethernet หรือ IP ไม่ใช่ระดับที่สูงกว่า TCP

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

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

ในด้านการประมวลผลแพ็คเก็ตเครือข่ายประสิทธิภาพนับเป็นจำนวนมาก ดังนั้นฉันต้องการใช้ตารางแฮชของตัวเองที่มีประสิทธิภาพสูงกว่าตารางแฮชที่มีอยู่ ฉันไม่ใช่ผู้สร้างตารางแฮชที่เลือกฟังก์ชันแฮชที่จะใช้ บางทีฉันต้องการประสิทธิภาพการทำงานและไปสำหรับMurMurHash3 บางทีผมอาจจะต้องการการรักษาความปลอดภัยและไปสำหรับSipHash เห็นได้ชัดว่าตัวจัดสรรหน่วยความจำเอง ในความเป็นจริงโครงสร้างข้อมูลที่สำคัญทั้งหมดที่เราใช้นั้นได้รับการปรับแต่งให้มีประสิทธิภาพสูงสุด

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

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

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

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

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


0

ฉันยังคงใช้ C ทุกวันและหนึ่งในเหตุผลหลักคือเพราะการทำงานร่วมกันกับภาษาอื่น ๆ และ SDK ที่ออกแบบมาเพื่อใช้งานโดยปลั๊กอินที่สร้างโดยคอมไพเลอร์ทุกชนิดในภาษาต่างๆ

ฉันไม่สามารถเขียน C ++ API ที่ใช้คลาสที่มีตัวสร้างและ destructors และ vtables ฟังก์ชันโอเวอร์โหลดโยนข้อยกเว้น ฯลฯ ซึ่งสามารถใช้ได้จาก Lua, C #, Python, C ฯลฯ โดยที่ปลั๊กอิน C ++ เขียนด้วยคอมไพเลอร์คนเดียว และการตั้งค่าจากเราเอง

ฉันไม่สามารถเขียน C # SDK ที่สามารถเรียกได้จาก Python เช่นหรือ Python SDK ที่สามารถเรียกได้จาก C #

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

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

ฉันชอบ C ++ มากกว่า C เมื่อฉันต้องการใช้โครงสร้างข้อมูลที่มีอยู่หรือใช้อันที่สูงกว่าโดยใช้ที่มีอยู่ แต่ถ้าฉันจะใช้โครงสร้างข้อมูลระดับต่ำที่หลักของเอ็นจินที่ไม่มีประโยชน์ โครงสร้างข้อมูลที่มีอยู่, C แน่นอนทำให้ที่ง่ายมากที่จะทำอย่างไรกับ Uber ระบบประเภทง่าย ๆ ที่ช่วยให้คุณเพียงแค่memcpyสิ่งที่นี่และmemmoveสิ่งที่มีmallocบล็อกติดกันและreallocมันมีโดยไม่ต้องกังวลเกี่ยวกับการก่อสร้าง, destructors และข้อยกเว้นถูกโยน

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