Seperti yang Anda ketahui, konsep , pendekatan C ++ untuk membatasi tipe yang mungkin untuk argumen templat telah gagal dimasukkan dalam C ++ 11.
Saya belajar bahwa bahasa pemrograman D 2.0 memiliki fitur serupa untuk pemrograman generiknya. Solusinya menurut saya cukup elegan & sederhana.
Jadi pertanyaan saya adalah mengapa C ++ tidak dapat menggunakan pendekatan yang serupa .
- Tujuan konsep C ++ mungkin lebih besar dari apa yang disediakan oleh implementasi D?
- Atau warisan C ++ mencegahnya mengadopsi pendekatan seperti itu?
- Atau yang lainnya?
Terima kasih atas jawaban anda
ps Untuk melihat beberapa contoh kekuatan pemrograman generik D, lihat ini: /programming/7300298/metaprogramming-in-c-and-in-d/7303534#7303534
Jawaban:
Standar C ++ adalah dokumen normatif, yang menetapkan aturan yang akan tetap (kebanyakan tidak terpengaruh) dalam dokumen masa depan. Karena itu panitia telah mengambil pendekatan yang sangat hati-hati sehubungan dengan pembaruannya.
Penambahan ke perpustakaan standar agak mudah. Sejumlah perpustakaan sudah ada di Boost sejak lama: sudah terbukti berhasil.
Namun, penambahan konsep inti dalam bahasa jauh lebih sulit untuk dicoba, karena pertama-tama membutuhkan modifikasi kompiler. Fitur C ++ 03 (ekspor template) telah ditentukan tanpa dukungan kompiler ... hasilnya mengerikan. Para pelaksana frontend compiler EDG melaporkannya sebagai tugas besar (beberapa tahun kerja) untuk keuntungan yang sangat sedikit. Tidak ada kompiler lain yang pernah mencoba mengimplementasikannya. Ini bukan situasi yang nyaman.
Fitur suka
constexpr
ataustatic_assert
mudah (dan sudah ditiru oleh perpustakaan). Lambdas cukup dipahami dan diimplementasikan dalam berbagai bahasa lain, sudah ada penelitian yang luas, jadi itu terutama masalah sintaksis.Di sisi lain Konsep dinilai terlalu baru dan belum dicoba . Mereka hampir tidak ditentukan dalam waktu, tidak ada bukti konsep ... dan dengan demikian mereka ditolak, daripada menunggu mereka (atau membuat kesalahan).
Kenapa tidak mengikuti D? Tidak ada yang mengatakan bahwa itu tidak akan terjadi. Komite telah mendorong orang untuk memikirkan kembali dari awal, tanpa tenggat waktu yang mendesak, dan untuk mencoba memasukkan mereka dalam kompiler untuk melihat bagaimana mereka berinteraksi dengan fitur-fitur lain dalam bahasa. Ada pertanyaan khusus tentang pemisahan Konsep dan Peta Konsep: haruskah mereka digabungkan menjadi satu atau tidak?
FYI: Saat ini ada cabang Clang yang didedikasikan untuk eksperimen ini, dipimpin oleh Larisse Voufo dari universitas Indiana.
sumber
Untuk standar 2011, konsep C ++ adalah apa yang sedang dikerjakan, dan mereka akhirnya dikeluarkan dari standar itu, karena mereka tidak "cukup matang." Pekerjaan berlanjut pada konsep-konsep C ++ yang dapat menyebabkan mereka membuatnya menjadi standar berikutnya. Namun, bisa jadi beberapa orang akan mengerjakan proposal untuk standar berikutnya yang mirip dengan batasan template D. Apakah itu terjadi atau tidak, masih harus dilihat. Sejauh yang saya tahu, tidak ada proposal seperti itu untuk standar 2011, jadi tidak ada kesempatan untuk membuatnya menjadi standar itu terlepas dari kelebihannya, tetapi apa yang akan atau tidak membuatnya menjadi standar berikutnya sama sekali tidak diketahui. pada saat ini.
Saya tidak mengetahui alasan utama mengapa sesuatu yang mirip dengan batasan template D tidak dapat diimplementasikan untuk C ++, meskipun mengingat bahwa C ++ umumnya lebih terbatas pada apa yang dapat dilakukan pada waktu kompilasi, mungkin akan lebih sulit untuk membuatnya bekerja dengan baik. baik seperti yang mereka lakukan di D (meskipun pengenalan hal-hal seperti
constexpr
pasti membantu).Jadi sungguh, saya pikir jawaban singkatnya adalah bahwa tidak ada alasan teknis mengapa sesuatu yang mirip dengan batasan template D tidak bisa ada di C ++.
Pertanyaannya adalah apakah proposal seperti itu akan dibuat untuk standar berikutnya dan bagaimana itu akan dibandingkan dengan proposal serupa yang dibuat (misal proposal yang berkaitan dengan konsep). Dengan asumsi bahwa proposal yang dapat diterima dapat dibuat, saya sepenuhnya berharap bahwa sesuatu yang mirip dengan konsep atau batasan template D akan membuatnya menjadi standar berikutnya hanya karena ada banyak keinginan untuk itu. Pertanyaannya adalah apakah ada yang bisa membuat proposal yang cukup solid dan "cukup matang" untuk bisa diterima.
sumber
Maksud Anda kendala template D?
Sejauh yang saya tahu, konsep C ++ telah diusulkan atas nama boost :: concept. Masalahnya, di sini, adalah boost adalah pustaka yang ditulis untuk C ++ 03. C ++ 11 memiliki kemampuan sintaksis lain yang memungkinkan untuk mengimplementasikan hal-hal tertentu dengan cara yang berbeda yang memungkinkan C ++ 03 (karenanya, boost itu sendiri dapat ditulis ulang dengan mengambil keuntungan dari sintaks baru).
Komite standar menjatuhkan konsep karena akan terlalu lama untuk menentukannya (sehingga menunda lagi persetujuan c ++ 11). Mereka mungkin akan masuk dalam rilis C ++ berikutnya.
Sementara itu, sintaks D berbeda dari C ++ dan D sendiri mempertahankan beberapa kemampuan evaluasi ekspresi pada waktu kompilasi C ++ tidak selalu dapat tanpa melanggar beberapa kode lama (sesuatu yang D miliki, memiliki sejarah yang lebih singkat). C ++ sendiri sekarang memiliki
static_assert
dancostexpr
, yang memungkinkan untuk meningkatkan kemampuan evaluasi waktu kompilasi. Mungkin di masa depan akan mencapai level yang sama.sumber
Berikut ini adalah QA dengan Herb Sutter, ia berbicara tentang konsep pada tanda 15 menit.
http://channel9.msdn.com/Shows/Going+Deep/Herb-Sutter-C-Questions-and-Answers
Jika Anda suka itu, ini adalah satu lagi: http://channel9.msdn.com/Shows/Going+Deep/Conversation-with-Herb-Sutter-Perspectives-on-Modern-C0x11
Sekarang untuk pertanyaan Anda. Kenapa bukan versi D? Nah mengapa menggunakannya? C ++ adalah bahasa yang sangat kompleks dan stabil. Setiap fitur perlu dipilih dengan sangat hati-hati, karena biasanya harus didukung selama beberapa dekade. Jika Anda melihat standar C ++ pertama dan mengikuti revisi, ada beberapa fitur yang sudah usang, tetapi bahkan mereka harus tetap didukung. Jadi masuk akal untuk merancang konsep hingga 100% sesuai dengan C ++.
Adapun mengapa itu tidak termasuk dalam C ++ 0x. Ya karena itu sangat besar. Proposal itu 100 halaman panjang dan sangat sulit untuk diterapkan. Diputuskan bahwa fitur ini perlu lebih banyak waktu untuk menjadi dewasa hingga dimasukkan ke dalam standar.
sumber
Sederhananya, C ++ memiliki muatan sejarah yang jauh lebih banyak daripada D. Akan lebih mudah untuk menerapkan banyak hal yang mengerikan jika bukan karena fakta bahwa C ++ memiliki sejumlah besar kode historis yang harus terus bekerja dengan benar dan seperti yang diharapkan. D tidak memiliki masalah ini.
sumber