Saya tidak tahu banyak tentang D, tetapi banyak, banyak programmer C ++ yang saya tahu sangat tidak menyukainya, dan saya pribadi harus setuju - Saya tidak suka tampilan D dan tidak akan mengambil yang lebih dekat.
Untuk memahami mengapa D tidak mendapatkan daya tarik lebih, Anda harus mulai dengan memahami apa yang menarik orang ke C ++. Singkatnya, alasan nomor satu adalah kontrol. Ketika Anda memprogram dalam C ++, maka Anda memiliki kontrol penuh atas program Anda. Ingin mengganti perpustakaan Standar? Kamu bisa. Ingin melakukan cast pointer yang tidak aman? Kamu bisa. Ingin melanggar const-correctness? Kamu bisa. Ingin mengganti pengalokasi memori? Kamu bisa. Ingin menyalin sekitar memori mentah tanpa memperhatikan jenisnya? Jika Anda benar-benar mau. Ingin mewarisi dari banyak implementasi? Ini pemakamanmu. Sial, Anda bahkan bisa mendapatkan perpustakaan pengumpulan sampah, seperti kolektor Boehm. Kemudian Anda memiliki masalah seperti kinerja, yang erat mengikuti kontrol - semakin banyak kontrol yang dimiliki programmer, semakin optimal ia dapat membuat programnya.
Berikut adalah beberapa hal yang saya lihat ketika melakukan sedikit riset dan berbicara kepada beberapa orang yang telah mencobanya:
Jenis hierarki terpadu. Pengguna C ++ jarang menggunakan pewarisan, sebagian besar programmer C ++ lebih suka komposisi, dan tipe hanya boleh dihubungkan melalui pewarisan jika ada alasan yang sangat bagus untuk melakukannya. Konsep Obyek sangat melanggar prinsip ini dengan menghubungkan setiap tipe. Selain itu, itu melanggar salah satu prinsip paling dasar C ++ - Anda hanya menggunakan apa yang Anda inginkan. Tidak diberi pilihan tentang mewarisi dari Object, dan biaya yang menyertainya, sangat kuat terhadap apa C + + berdiri sebagai bahasa dalam hal memberikan kontrol programmer atas programnya.
Saya pernah mendengar tentang masalah dengan fungsi dan delegasi. Rupanya, D memiliki kedua fungsi dan delegasi sebagai tipe fungsi runable-time yang dapat dipanggil, dan keduanya tidak sama tetapi keduanya dapat dipertukarkan atau ... sesuatu? Teman saya punya beberapa masalah dengan mereka. Ini jelas merupakan penurunan versi dari C ++, yang baru saja std::function
dilakukan dan Anda selesai.
Maka Anda punya kompatibilitas. D tidak terlalu kompatibel dengan C ++. Maksud saya, tidak ada bahasa yang kompatibel dengan C ++, mari kita hadapi itu, kecuali C ++ / CLI yang agak curang, tetapi sebagai penghalang untuk masuk, harus disebutkan.
Lalu, ada beberapa hal lainnya. Misalnya, baca saja entri Wikipedia.
import std.metastrings;
pragma(msg, Format!("7! = %s", fact_7));
pragma(msg, Format!("9! = %s", fact_9));
printf
adalah salah satu fungsi paling tidak aman yang pernah dibuat, dalam keluarga yang sama dengan masalah besar seperti gets
dari perpustakaan C Standard lama. Jika Anda mencarinya di Stack Overflow, Anda akan menemukan banyak, banyak pertanyaan yang berkaitan dengan penyalahgunaannya. Pada dasarnya, printf
ini adalah pelanggaran KERING- Anda memberikan tipe dalam string format, dan kemudian memberikannya lagi saat Anda memberikan argumen. Pelanggaran KERING di mana jika Anda salah, maka hal-hal yang sangat buruk terjadi- katakanlah, jika Anda mengubah typedef dari bilangan bulat 16-bit menjadi 32-bit. Ini juga tidak dapat diperpanjang sama sekali- bayangkan apa yang akan terjadi jika semua orang menemukan penentu format mereka sendiri. Iostreams C ++ mungkin lambat, dan pilihan operator mereka mungkin bukan yang terbesar, dan antarmuka mereka bisa menggunakan pekerjaan, tetapi mereka pada dasarnya dijamin aman, dan KERING tidak dilanggar, dan mereka dapat dengan mudah diperpanjang. Ini bukan sesuatu yang bisa dikatakan printf
.
Tidak ada pewarisan berganda. Itu sangat bukan cara C ++. Pemrogram C ++ berharap memiliki kendali penuh atas program mereka dan bahasa yang menegakkan apa yang tidak dapat Anda warisi merupakan pelanggaran terhadap prinsip itu. Selain itu, itu membuat warisan (bahkan lebih) rapuh, karena jika Anda mengubah jenis dari antarmuka ke kelas karena Anda ingin memberikan implementasi default atau sesuatu, tiba-tiba semua kode pengguna Anda rusak. Itu bukan hal yang baik.
Contoh lain adalah string
dan wstring
. Dalam C ++ sudah cukup menyakitkan untuk harus mengkonversi di antara mereka, dan apakah pustaka ini mendukung Unicode, dan pustaka C lama ini hanya menggunakan const char*
, dan harus menulis versi berbeda dari fungsi yang sama tergantung pada tipe argumen string yang Anda inginkan. Khususnya, tajuk Windows, misalnya, memiliki beberapa makro yang sangat menjengkelkan untuk mengatasi masalah yang sering dapat mengganggu kode Anda sendiri. Menambahkan dstring
ke campuran hanya akan membuat segalanya lebih buruk, karena sekarang alih-alih dua jenis string, Anda harus mengelola tiga. Memiliki lebih dari satu tipe string akan meningkatkan rasa sakit pemeliharaan dan memperkenalkan kode berulang yang berurusan dengan string.
Scott Meyers menulis:
D adalah bahasa pemrograman yang dibangun untuk membantu programmer mengatasi tantangan pengembangan perangkat lunak modern. Ia melakukannya dengan membina modul yang saling terhubung melalui antarmuka yang tepat, federasi paradigma pemrograman yang terintegrasi erat, isolasi thread yang diberlakukan bahasa, keselamatan tipe modular, model memori yang efisien, dan banyak lagi.
Isolasi thread yang didukung bahasa bukan merupakan nilai tambah. Pemrogram C ++ mengharapkan kontrol penuh atas program mereka, dan bahasa yang memaksa sesuatu jelas bukan yang diperintahkan dokter.
Saya juga akan menyebutkan manipulasi string waktu kompilasi. D memiliki kemampuan untuk menafsirkan kode D pada waktu kompilasi. Ini bukan nilai tambah. Pertimbangkan sakit kepala masif yang disebabkan oleh preprosesor C yang relatif terbatas, yang terkenal oleh semua programmer veteran C ++, dan kemudian bayangkan betapa buruknya fitur ini akan disalahgunakan. Kemampuan untuk membuat kode D pada waktu kompilasi sangat bagus, tetapi harus semantik , bukan sintaksis.
Selain itu, Anda dapat mengharapkan refleks tertentu. D memiliki koleksi sampah, yang akan diasosiasikan oleh para programmer C ++ dengan bahasa-bahasa seperti Java dan C # yang secara langsung menentangnya dalam filosofi, dan persamaan sintaksis juga akan mengingatkan mereka. Ini belum tentu dibenarkan secara objektif, tetapi itu adalah sesuatu yang tentu harus dicatat.
Pada dasarnya, ia tidak menawarkan banyak yang tidak bisa dilakukan oleh programmer C ++. Mungkin lebih mudah untuk menulis metaprogram faktorial dalam D, tetapi kita sudah dapat menulis metaprogram faktorial dalam C ++. Mungkin dalam D Anda dapat menulis pelacak ray waktu kompilasi, tetapi tidak ada yang benar-benar ingin melakukannya. Dibandingkan dengan pelanggaran mendasar filsafat C ++, apa yang dapat Anda lakukan dalam D tidak terlalu menonjol.
Bahkan jika hal-hal ini hanya masalah di permukaan, maka saya cukup yakin bahwa fakta bahwa di permukaan, D sebenarnya tidak terlihat seperti C ++ sama sekali mungkin merupakan alasan yang baik bahwa banyak programmer C ++ tidak bermigrasi ke D. Mungkin D perlu melakukan iklan pekerjaan yang lebih baik.