สิ่งที่ C ++ ส่วนใหญ่ "ทำ" ดีกว่า D คือเมตาดาต้า: C ++ มีคอมไพเลอร์ที่ดีกว่า, เครื่องมือที่ดีกว่า, ไลบรารีที่เป็นผู้ใหญ่มากขึ้น, มีการผูกมัดมากขึ้น, มีผู้เชี่ยวชาญมากขึ้น คาดหวังจากภาษาที่เป็นผู้ใหญ่มากขึ้น นี่ไม่สามารถอธิบายได้
สำหรับภาษานั้นมีบางสิ่งที่ C ++ ทำได้ดีกว่า D ในความคิดของฉัน อาจมีมากกว่านี้ แต่นี่คือบางส่วนที่ฉันสามารถแสดงรายการออกจากหัวของฉัน:
C ++ มีระบบพิมพ์ที่ดีกว่าคิดว่า
มีปัญหาเล็กน้อยกับระบบพิมพ์ใน D ในขณะนี้ซึ่งดูเหมือนจะเป็นเรื่องการกำกับดูแลในการออกแบบ ตัวอย่างเช่นในปัจจุบันมันเป็นไปไม่ได้ที่จะคัดลอก const โครงสร้างไปยังโครงสร้างที่ไม่ใช่ const ถ้า struct มีการอ้างอิงวัตถุคลาสหรือพอยน์เตอร์เนื่องจากความไวแสงของ const และวิธีที่ตัวสร้าง postblit ทำงานกับชนิดของค่า Andrei บอกว่าเขารู้วิธีแก้ปัญหานี้ แต่ไม่ได้ให้รายละเอียดใด ๆ ปัญหาสามารถแก้ไขได้อย่างแน่นอน (แนะนำตัวสร้างสำเนาสไตล์ C ++ จะเป็นการแก้ไขอย่างหนึ่ง) แต่มันเป็นปัญหาสำคัญในภาษาปัจจุบัน
ปัญหาอีกข้อหนึ่งที่บั๊กฉันคือการไม่มีกลุ่มตรรกะ (เช่นไม่mutable
เหมือนใน C ++) นี่เป็นวิธีที่ดีสำหรับการเขียนโค้ดที่ปลอดภัยสำหรับเธรด แต่ทำให้ยาก (เป็นไปไม่ได้หรือไม่) ในการทำ intialisation ที่ขี้เกียจภายในวัตถุ const (คิดว่าฟังก์ชั่น const 'get' ซึ่งสร้างและแคชค่าที่ส่งคืนในการโทรครั้งแรก)
สุดท้ายให้ปัญหาที่มีอยู่เหล่านี้ผมกังวลเกี่ยวกับวิธีการส่วนที่เหลือของระบบการพิมพ์ ( pure
, shared
ฯลฯ ) จะโต้ตอบกับทุกสิ่งทุกอย่างในภาษาที่เมื่อพวกเขาถูกนำไปใช้ ขณะนี้ไลบรารี่มาตรฐาน (โฟบอส) ใช้ระบบพิมพ์ขั้นสูงของ D น้อยมากดังนั้นฉันคิดว่ามันสมเหตุสมผลกับคำถามว่าจะระงับความเครียดได้หรือไม่ ฉันสงสัย แต่ในแง่ดี
โปรดทราบว่า C ++ มีหูดประเภทของระบบ (เช่น const ที่ไม่ผ่านการสนับสนุนiterator
รวมถึงconst_iterator
) ที่ทำให้มันค่อนข้างน่าเกลียด แต่ในขณะที่ระบบประเภทของ C ++ นั้นผิดเล็กน้อยที่ชิ้นส่วนมันไม่ทำให้คุณหยุดทำงานเช่น D บางครั้งก็ทำ
แก้ไข: เพื่อชี้แจงฉันเชื่อว่า C ++ มีระบบคิดที่ดีกว่า- ไม่จำเป็นต้องดีกว่า - ถ้ามันสมเหตุสมผล โดยพื้นฐานแล้วใน DI รู้สึกว่ามีความเสี่ยงที่เกี่ยวข้องกับการใช้ระบบพิมพ์ทุกด้านที่ไม่มีอยู่ใน C ++
บางครั้ง D ก็สะดวกไปหน่อย
คำวิจารณ์อย่างหนึ่งที่คุณมักจะได้ยินเกี่ยวกับ C ++ ก็คือมันซ่อนปัญหาระดับต่ำบางอย่างจากคุณเช่นการมอบหมายงานง่ายๆเช่นa = b;
อาจจะทำอะไรหลาย ๆ อย่างเช่นการเรียกผู้ดำเนินการแปลง มองเห็นได้ยากจากรหัส บางคนเช่นนี้บางคนทำไม่ได้ ทั้งสองวิธีใน D มันจะเลวร้ายยิ่ง (ดีกว่า) เนื่องจากสิ่งที่ชอบopDispatch
, @property
, opApply
, lazy
ซึ่งมีศักยภาพที่จะเปลี่ยนรหัสมองบริสุทธิ์เข้าไปในสิ่งที่คุณไม่ได้คาดหวัง
ฉันไม่คิดว่านี่เป็นปัญหาใหญ่เป็นการส่วนตัว แต่บางคนอาจพบว่าเรื่องนี้ไม่เหมาะสม
D ต้องมีการรวบรวมขยะ
ซึ่งอาจถูกมองว่าเป็นการโต้เถียงเพราะเป็นไปได้ที่จะเรียกใช้ D โดยไม่มี GC อย่างไรก็ตามเพียงเพราะเป็นไปได้ไม่ได้หมายความว่ามันใช้ได้จริง หากไม่มี GC คุณจะเสียคุณสมบัติมากมายของ D และการใช้ไลบรารี่มาตรฐานจะเหมือนกับการเดินในเขตที่วางทุ่นระเบิด (ใครจะรู้ว่าฟังก์ชั่นใดจัดสรรหน่วยความจำได้) โดยส่วนตัวแล้วฉันคิดว่ามันใช้ไม่ได้เลยหากจะใช้ D โดยไม่ใช้ GC และถ้าคุณไม่ใช่แฟนของ GCs (เหมือนฉัน) ก็อาจทำให้คุณเลิกได้
คำจำกัดความของอาร์เรย์ที่ไร้เดียงสาใน D จัดสรรหน่วยความจำ
นี่คือสัตว์เลี้ยงของฉัน:
int[3] a = [1, 2, 3]; // in D, this allocates then copies
int a[3] = {1, 2, 3}; // in C++, this doesn't allocate
เห็นได้ชัดว่าเพื่อหลีกเลี่ยงการจัดสรรใน D คุณต้องทำ:
static const int[3] staticA = [1, 2, 3]; // in data segment
int[3] a = staticA; // non-allocating copy
การจัดสรร 'หลังของคุณ' เล็กน้อยเหล่านี้เป็นตัวอย่างที่ดีของสองประเด็นก่อนหน้านี้ของฉัน
แก้ไข: โปรดทราบว่านี่เป็นปัญหาที่ทราบแล้วว่ากำลังดำเนินการอยู่
แก้ไข: ตอนนี้ได้รับการแก้ไขแล้ว ไม่มีการจัดสรรเกิดขึ้น
บทสรุป
ฉันได้เพ่งความสนใจไปที่เนกาทีฟของ D vs C ++ เพราะนั่นคือคำถามที่ถาม แต่โปรดอย่าเห็นโพสต์นี้เป็นคำสั่งที่ C ++ ดีกว่า D ฉันสามารถสร้างโพสต์ที่ใหญ่กว่าที่ D ดีกว่า กว่า C ++ ขึ้นอยู่กับคุณในการตัดสินใจเลือกใช้