มีภาษาระหว่าง C และ C ++ หรือไม่


18

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

อย่างไรก็ตาม C ไม่มี doodads ที่เรียบง่ายและเป็นประโยชน์เหล่านี้ที่ C ++ นำเสนอเช่นคลาส, การจัดการที่ไม่ใช่ cstring แบบง่าย, ฯลฯ ฉันรู้ว่ามันเป็นไปได้ที่จะนำไปใช้ใน C โดยใช้ตารางกระโดดและสิ่งที่คล้ายกัน และไม่ปลอดภัยสำหรับประเภทด้วยเหตุผลต่างๆ

ฉันไม่ใช่แฟนของการเน้นไปที่วัตถุใน C ++ และฉันก็อายที่จะใช้ตัวดำเนินการ 'ใหม่' และไม่ชอบ c ++ ดูเหมือนว่าจะมี hiccups มากเกินไปเพียงไม่กี่ตัวอย่างเช่นถูกใช้เป็นภาษาการเขียนโปรแกรมระบบ

มีภาษาที่อยู่ระหว่าง C และ C ++ ในระดับของวิดเจ็ตและ doodads หรือไม่?

ข้อจำกัดความรับผิดชอบ: ฉันหมายความว่านี่เป็นคำถามที่แท้จริง ฉันไม่ได้ตั้งใจที่จะโกรธคุณเพราะฉันไม่แบ่งปันมุมมองของคุณว่า C {, ++} ดีพอที่จะทำสิ่งที่ฉันวางแผน


10
คุณพูดว่าคำถามของคุณคือ "ล้วนจริง" แต่คุณกำลังลด c ++ เพราะ "ดูเหมือน" มีอาการสะอึกมากเกินไป อาการสะอึกเหล่านี้คืออะไรและเป็นเหตุผลที่ถูกต้องในการลด c ++ หรือไม่
whatsisname

2
'ขนาดของวิดเจ็ตและ doodads' คืออะไร หากคุณต้องการคำตอบที่แท้จริงสำหรับคำถามที่ "แท้จริงล้วน" คุณควรหลีกเลี่ยงการวัดที่ไม่มีความหมาย
Caleb

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

25
ใช้การC+ ปฏิเสธความรับผิด: ขออภัยฉันไม่สามารถt resist. Itเป็นวันที่ 1 เมษายน;)
knut

2
ฟังดูแย่มากอย่างเช่นสมมติฐานต่อเนื่องและอาจมีคำตอบเดียวกัน ( en.wikipedia.org/wiki/Continuum_hypothesis )
John Smith

คำตอบ:


29

นี่อาจเป็นหุ่นที่คุณกำลังมองหา ...

ไป - http://golang.org/

D - http://dlang.org/

สนิม - http://rust-lang.org/


5
@dtech: D มี GC ที่ไร้จุดหมาย / "ทุกสิ่งที่สืบทอดจาก Object" / ค่าต้องดูด crappery ฉันได้รับ C # แล้วและมีเครื่องมือที่เหมาะสม ไปฉันยอมรับว่าความทรงจำของฉันว่าทำไมฉันถึงทิ้งมันค่อนข้างมืดมน แต่เมื่อฉันจำได้มันตัดคุณสมบัติที่มีประโยชน์มากมาย
DeadMG

4
-1 สำหรับ "สิ่งที่ C ++ ควรเป็น" C ++ คือสิ่งที่เป็นและถ้าคุณไม่สามารถจัดการได้นั่นเป็นปัญหาของคุณ คุณสามารถจัดการกับมันได้โดยใช้ภาษาที่เหมาะกับคุณดีกว่า แต่นั่นไม่ได้หมายความว่า C ++ ควรเป็นเหมือนภาษานั้น
back2dos

7
@DeadMG วันที่ D คุณได้แถลงการณ์ที่มีความหมาย 2 ข้อ: GC เป็นข้อบังคับและทุกอย่างจะต้องเป็นวัตถุ ทั้งคู่ผิด มันทำให้ฉันคิดว่าข้อสรุปของคุณนั้นขึ้นอยู่กับความไม่รู้มากกว่าความรู้จริง ฉันต้องเห็นด้วยกับ CodexArcanum
deadalnix

5
@deadalnix: ในทางเทคนิคคุณสามารถเลือกที่จะไม่ใช้ GC แต่เนื่องจากคุณไม่มีทางรู้หรือควบคุมฟังก์ชั่นห้องสมุดหรือคุณสมบัติภาษาที่ใช้ GC จึงไม่มีวิธีการสร้างโปรแกรมที่ไม่ได้ใช้จริง และคุณไม่สามารถสร้างคลาสที่ไม่สืบทอดจาก Object และstructs ของพวกเขาถูก gimped อย่างจริงจังเมื่อเทียบกับค่า C ++ - ไม่มีการสืบทอดไม่มีการอ้างอิง rvalue ดังนั้นจึงเป็นไปไม่ได้ที่จะสร้างบางสิ่งที่ง่ายเหมือนคลาสสตริงค่าใน D ที่มีประสิทธิภาพเท่ากับ C ++ ที่เทียบเท่า นั่นคือข้อเท็จจริงเกี่ยวกับภาษา D
DeadMG

5
@DeadMG: การสร้าง struct โดยไม่มีการสืบทอดเป็นคุณลักษณะไม่ใช่ "gimping" มันเป็นสิ่งที่พวกเขาพูดถูกสิ่งที่ OO ทุกภาษาในประวัติศาสตร์ที่ไม่มีชื่อ "C ++" นั้นถูกต้อง (รวมถึง Simula ภาษา OO ดั้งเดิม) และ C ++ นั้นผิดอย่างไม่น่าเชื่อ การสืบทอดและชนิดของค่าจะไม่รวมกัน มันแบ่งอัตลักษณ์ของวัตถุทำลายตัวแทน Liskov มันทำลายกระบวนทัศน์ OO ทั้งหมด
Mason Wheeler

19

มีภาษาไม่กี่ภาษา (เช่น Java, Go, D, Objective-C) ที่ขนานกับ C ++ หรือพยายามแก้ไขปัญหาที่ผู้เขียนเห็นด้วย C ++

อย่างไรก็ตามอย่างน้อย IMO ทั้งหมดนั้นทำงานต่ำกว่า C ++ อย่างมากสำหรับการใช้งานจริง

น่าเสียดายที่เราทราบว่าการประกอบโค้ดจะถูกสร้างขึ้นมาจากรสนิยมที่ชัดเจนของคุณเราอาจแยกกฎ Objective C และ Java ออกได้ทันที

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

สวยมากทำให้ D เป็นเพียงคนเดียวที่มีโอกาส อาจเป็นคล้ายกับ C ++ (ของเหล่านี้) แต่ยังมีโอกาสน้อยที่สุด (IMO) เพื่อแก้ไขสิ่งที่คุณดูเหมือนจะเป็นปัญหา

วิธีนี้มีวิธีการที่ชัดเจนหนึ่งวิธี: ใช้ C ++ แต่ใช้เฉพาะส่วนที่คุณต้องการและหลีกเลี่ยงชิ้นส่วนที่คุณไม่ชอบ


13
+1 สำหรับ "ใช้ C ++ และหลีกเลี่ยงส่วนที่คุณไม่ชอบ" และฉันขอแนะนำให้ OP เรียนรู้เพิ่มเติมเกี่ยวกับ C ++ ผู้คนมักปฏิเสธสิ่งต่าง ๆ เพียงเพราะพวกเขาไม่รู้จักพวกเขามากพอ
Doc Brown

1
@DocBrown อาจเป็นเพราะมันไม่ง่ายที่จะรู้ว่า C ++ ดีพอ
Malcolm

3
@ Malcolm: แน่นอนว่ามันยากที่จะเรียนรู้ C ++ ที่ทันสมัยในเชิงลึก แต่ในทางกลับกันไม่มีเหตุผลใดที่จะเป็น "ปืนอายของผู้ให้บริการรายใหม่" ซึ่งฟังดูเป็นเรื่องไสยศาสตร์สำหรับฉัน
Doc Brown

3
@Malcolm: อาจจะเป็นเพราะเป็นแนวคิดที่ง่ายมาก ฉันต้องการตัวอักษรสตริง UTF-32 หรือตัวอักษรสตริง UTF-16 หรือไม่ นั่นเป็นคำถามที่ตอบง่าย ๆ สมมติว่าคุณรู้พื้นฐานของการเข้ารหัสสตริง wtf และฟีเจอร์มากมายเหล่านั้นล่ะ? พวกเขาอยู่ด้วยเหตุผล ตัวอย่างเช่นข้อมูลทั่วไปของ Java มันน่าสมเพชเมื่อเทียบกับแม่แบบ แน่นอนว่ามีน้อยที่จะเรียนรู้ แต่นั่นเป็นเพียงเพราะพวกเขาไม่ได้มีประโยชน์มาก มันก็เหมือนกับการเรียกอะไรที่ซับซ้อนกว่า Brainfuck ยาก
DeadMG

3
@ Malcolm: นั่นไม่เป็นความจริงเลย ความนิยมได้รับอิทธิพลจากสิ่ง 99999 นอกเหนือจากหรือไม่ว่าภาษานั้นดี / มีประโยชน์
DeadMG

16

อย่างไรก็ตาม C ไม่มี doodads ที่เรียบง่ายและเป็นประโยชน์เหล่านี้ที่ C ++ นำเสนอเช่นคลาส, การจัดการที่ไม่ใช่ cstring แบบง่าย, ฯลฯ ฉันรู้ว่ามันเป็นไปได้ที่จะนำไปใช้ใน C โดยใช้ตารางกระโดดและสิ่งที่คล้ายกัน และไม่ปลอดภัยสำหรับประเภทด้วยเหตุผลต่างๆ

ฉันไม่ใช่แฟนของการเน้นไปที่วัตถุใน C ++ และฉันก็อายที่จะใช้ตัวดำเนินการ 'ใหม่' และไม่ชอบ

ขออภัยเพื่อนปลุกความขัดแย้ง Non-CString จัดการต้อง newมันเป็นความจำเป็นพื้นฐาน คุณไม่สามารถมีได้โดยไม่ต้องstd::string newและยิ่งกว่านั้นnew/ deleteเทียบเท่ากับmalloc/ freeแต่ปลอดภัยกว่าเพราะรับประกันการก่อสร้างและการทำลายวัตถุฮีปที่ถูกต้อง (จำเป็นโดยสิ้นเชิง!) และใช้การจัดการข้อยกเว้นแทนการNULLส่งคืนและดังนั้นจึงเหนือกว่าในแฟชั่นทุกอย่าง ใน C ++ 11 เป็นไปได้มากที่จะเขียนnewฟังก์ชั่นสไตล์ของคุณเองเพราะการส่งต่อที่สมบูรณ์แบบช่วยให้คุณสามารถจัดการกับคอนสตรัคเตอร์ประเภทใดก็ได้ หากคุณเป็นคนขี้อายnewฉันแนะนำว่าคุณไม่รู้ว่าคุณกำลังทำอะไรอยู่

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

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


1
ฉันเห็นด้วย. มันจะดีกว่ามากที่จะใช้ C ++ ในแบบที่คุณต้องการมากกว่าที่จะค้นหาทางเลือก (น่าจะต่ำกว่า)
dtech

1
ฉันไม่คิดว่า lambdas เพียงพอที่จะเขียนโปรแกรมตามหน้าที่ ฉันก็คาดหวังว่าจะมีโอเปอเรเตอร์การจัดองค์ประกอบฟังก์ชั่นการม้วนและอื่น ๆ ดูstackoverflow.com/questions/1981400/functional-programming-in-cเพิ่มเติม สำหรับฉันมันรู้สึกเหมือนกำลังทำ OOP ใน C ...
Giorgio

@Giorgio: คำตอบของคำถามนั้นเพียงแค่พูดว่า "มันยาก!" พวกเขาไม่แสดงหลักฐานใด ๆ ว่ามันยากจริงๆ ทำไมคุณต้องการผู้ประกอบการแยกต่างหากสำหรับองค์ประกอบของฟังก์ชั่น? f(g(x))ดูเหมือนว่าจะทำงานได้ดีสำหรับฉัน และฉันก็เชื่อว่าการทำแกงสามารถทำได้เหมือนห้องสมุดทั่วไปใน C ++ 11
DeadMG

1
@DeadMG: ผู้ประกอบการองค์ประกอบฟังก์ชั่นเป็นแนวคิดพื้นฐานที่ค่อนข้างดีขึ้นในการเขียนโปรแกรมการทำงาน ฉันคาดว่าจะพบมันในภาษาที่สนับสนุน FP ฉันพบว่ามันสะดวกมาก (กระชับ) เพื่อกำหนดฟังก์ชั่นที่ซับซ้อนเป็นองค์ประกอบของฟังก์ชั่นอื่น ๆ (เช่นคุณทำกับท่อใน Unix) โดยไม่ต้องใช้ตัวแปร: k = h ช. ฉ
Giorgio

1
@Giorgio: std::bindสนับสนุนสิ่งต่าง ๆ
DeadMG

4

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

คุณจะไม่เขียนสำนวน C ++ แต่มันเกี่ยวกับ "ในระหว่าง" ตามที่ได้รับ

หรือคุณอาจลองใช้ภาษาอื่นที่พยายามขยาย C ไปสู่สิ่งที่มีประสิทธิภาพยิ่งขึ้นโดยเฉพาะ D และ Objective-C

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


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

3

เพียงเสนอคำตอบที่ตรงไปตรงมาหากไม่มีภาษาที่คุณต้องการทำไมไม่ลองด้วยตัวเอง มีเครื่องมือพัฒนาภาษาที่ทรงพลังหลากหลายรูปแบบโดยมี Lex (Y) Lex และ Yacc / Bison เมื่อคุณรู้จัก C อยู่แล้วคุณเพียงแค่ต้อง "คอมไพเลอร์" ของคุณเพื่อเอาท์พุทรหัส C ซึ่งคุณจะใช้เครื่องมือโซ่ที่มีอยู่ของคุณ

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

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


2

คุณยังไม่ได้พูดถึงคุณสมบัติ C ++ ที่น่ารำคาญสำหรับคุณ อย่างไรก็ตามคุณสามารถลองใช้ Objective-C มันเน้นที่ Object Oriented แทนที่จะเป็น Library มาตรฐานบน C ++


2
imho Objective-C เป็นความพยายามเพียงเล็กน้อยที่จะแนะนำคลาสเข้าสู่ C และด้อยกว่าในหลาย ๆ วิธีเพื่อ C ++ ยิ่งกว่านั้นมันถูกใช้น้อยมากนอก Mac OS X / iOS
dtech

1
@dtech: น่าสนใจอดีตเพื่อนร่วมงานของฉันซึ่งไม่ใช่แฟน Mac (แทนที่จะเป็นคน Debian / Linux) เชื่อว่า Objective-C นั้นเป็นส่วนขยาย OO ที่สะอาดกว่า C ++ ฉันไม่เคยลอง Objective-C มาก่อนดังนั้นฉันจึงไม่มีความเห็นเกี่ยวกับเรื่องนี้
Giorgio

1
@dtech: จากนั้นฉันขอแนะนำให้คุณพิจารณาความคิดเห็นของคุณอย่างนอบน้อม;) Objective-C เป็นเรื่องเกี่ยวกับการวางแนวของวัตถุ ในขณะที่ฉันยอมรับว่าภาษาด้อยกว่า C ++ ในหลาย ๆ ทาง แต่ก็เหนือกว่าในด้านอื่น ๆ
back2dos

@Giorgio ฉันเห็นด้วยกับเพื่อนร่วมงานของคุณแม้ว่า Obj-C ก็มีข้อ จำกัด เช่นกัน (บางทีบางอย่างอาจหายไปจาก Obj-C 2.0) เช่นฉันต้องการโหลด "วิธี" มากเกินไป (ตัวเลือก) - btw ฉันต้องการ ฟังก์ชั่นการบรรทุกเกินพิกัดลา Fortran ใน C ...
ShinTakezou

2

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


0

คุณอาจพบว่าการเปรียบเทียบเชิงลึกของ C ++, Objective-C, Java และ C #มีประโยชน์ในเชิงลึก โดยส่วนตัวฉันคิดว่า C # ทำงานได้ดีกว่า C ++ ฉันได้ย้ายฟังก์ชั่น C (ตัวเลข / การคำนวณ) หลายฟังก์ชั่นไปยัง C # ก่อนโดยไม่จำเป็นต้องเปลี่ยนแปลงมากเกินไปเนื่องจากความคล้ายคลึงกันของไวยากรณ์และชนิดข้อมูลตัวเลข

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