Apa objek teoretis yang sesuai dengan konsep C ++?

8

Saya kurang memiliki latar belakang dalam ilmu komputer teoretis tetapi saya ingin memahami seperti apa objek teoritis yang sesuai dengan konsep C ++ . Pada dasarnya, konsep C ++ memungkinkan untuk mendefinisikan sekumpulan tipe yang memenuhi daftar kendala. Jadi, dari sudut pandang teoretis, sesuai dengan konsep C ++, atau kira-kira sesuai (dan dalam hal apa perbedaannya)?

Vincent
sumber
1
Program C ++ seperti mesin Turing. Fungsinya seperti nubuat, mereka hanya membutuhkan lebih banyak waktu. C ++, seperti banyak bahasa pemrograman, seperti kalkulus lambda. Pembuatan fungsi run-time tampaknya baru pada C ++ 11.
Philip White
6
@ PhilipWhite Saya pikir Anda melewatkan inti pertanyaan. OP tidak meminta penjelasan teoretis dari berbagai konsep C ++ tetapi untuk penjelasan teoritis tentang konstruksi C ++ yang disebut konsep. Saya tidak cukup berpengetahuan luas dalam PL untuk menjawab pertanyaan tetapi dari apa yang saya pahami, konsep adalah semacam mekanisme untuk membatasi polimorfisme. Saya tidak tahu apakah mekanisme seperti itu sudah dipelajari secara formal tetapi sepertinya mekanisme yang masuk akal untuk menambahkan ke sistem tipe.
Serigala
Kesalahan saya ... Saya mengikuti tautan tetapi tidak membacanya dengan saksama. (Saya belum pernah menemukan kebutuhan untuk belajar / menggunakan konsep dalam C ++ sendiri.)
Philip White

Jawaban:

11

Dari perspektif teori bahasa pemrograman, yang bertentangan dengan perspektif komputabilitas jawaban dan komentar lain yang ditawarkan, template C ++ dikombinasikan dengan konsep yang sesuai dengan polimorfisme terbatas atau kemanjuran terbatas . Konsep itu sendiri sesuai dengan batasan atau batasan yang ditempatkan pada suatu tipe.

Templat adalah fungsi tipe-level, parameterised menurut jenis yang dibatasi oleh konsep untuk mengimplementasikan antarmuka tertentu. Ketika templat diterapkan ke jenis yang memuaskan konsep itu, jenis baru hasil.

Konsep + templat analog dengan generik di Jawa, Scala atau Eiffel. Mereka berbeda dari templat di C ++ sebelumnya karena mereka mengizinkan batasan pada parameter tipe untuk ditentukan dan diperiksa, sedangkan templat C ++ tidak mengizinkan itu. Keuntungannya adalah pengecekan statis yang lebih baik bahwa program setelah menerapkan templat akan diketik dengan baik.

Referensi yang baik adalah Pierce, Benjamin C. (2002). Jenis dan Bahasa Pemrograman . MIT Press, Bab 26: Kuantifikasi terbatas.

Dave Clarke
sumber
3
Templat C ++ memiliki batasan tipe yang tersemat di dalamnya, membuat bentuk pengetikan struktural, karena suatu jenis hanya boleh memiliki beberapa rangkaian operasi yang ditentukan (tersirat dalam definisi templat) untuk memenuhi pemeriksa tipe. Konsep tampaknya melakukan banyak hal yang sama tetapi memungkinkan nama untuk dikaitkan dengan set perilaku tersebut (suatu bentuk pengetikan nominal) dan dengan demikian menyediakan cara untuk menghasilkan pesan kesalahan yang lebih awal dan lebih baik. Saya juga tidak berpikir konsep adalah tipe ke fungsi fungsi. Deskripsi yang ditautkan menggambarkan mereka sebagai predikat tipe - atau tipe ke fungsi boolean.
oconnor0
@ oconnor0: Anda benar. Konsep + templat memberi polimorfisme terbatas. Saya akan memperbarui jawaban saya.
Dave Clarke
Saya tidak yakin saya setuju dengan ini. Bahkan tanpa konsep, template C ++ dan polimorfisme parametrik nampaknya hanya sedikit berhubungan dengan saya. Suatu istilah politis adalah tipe yang dicentang sehingga untuk menjamin bahwa ia akan bekerja pada semua instans yang mungkin. Java generics memilikinya (walaupun Java memecah parametricity). Template C ++ malah menggunakan "SFINAE", di mana tipe tidak dicentang sampai waktu instantiation, yang membuatnya jauh dari tipe universal kepada saya.
chi
-3

C ++ concept memetakan ke bahasa yang berulang secara berulang. Karena sistem tipe C ++ adalah Turing selesai, properti apa pun dari tipe yang dapat diinterogasi selama template instan (ukuran, parameter, dll.) Dapat dijalankan melalui program acak yang disimulasikan dalam sistem tipe.

Geoffrey Irving
sumber
1
Saya telah membaca sedikit lebih banyak tentang konsep. (Rupanya konsep baru dalam C ++.) Tentu saja fungsi C ++ apa pun akan menerima bahasa enumerable rekursif; itu sepele. Apakah Anda menyatakan bahwa pemetaan dari konsep ke bahasa-bahasa lain adalah sebuah kebohongan? Jelas ini keliru; jika Anda melirik bagian konsep, dikatakan bahwa konsep fungsi "harus hanya terdiri dari pernyataan kembali, yang argumennya harus ekspresi kendala," sementara ketika datang ke konsep variabel, "penginisialisasi harus ekspresi kendala." Jadi konsep-konsep ini kedengarannya tidak Turing-lengkap untuk saya.
Philip White
1
Ekspresi konstan adalah Turing lengkap, jadi ya: itu adalah peninggalan. Formalisasi yang mengharuskan eksplisit tentang pengkodean jenis; pernyataan yang tidak adalah bahwa himpunan konsep yang mewakili himpunan bagian dari tipe batal, C <void>, C <C <void>>, ... mewakili bilangan bulat di unary persis bahasa RE.
Geoffrey Irving
1
Tentu saja, kompiler praktis memiliki batas perhitungan ketika mengevaluasi ekspresi konstan, tetapi jika pertimbangan tersebut diperhitungkan jawabannya adalah bahwa ada serangkaian konsep yang terbatas. Mungkin itu bukan jawaban yang diminta.
Geoffrey Irving
1
Maksudmu ekspresi kendala. Menurut sumber daya, ada 9 jenis ekspresi kendala, dan setiap konsep dapat menggunakan hanya satu ekspresi kendala. Juga, merepresentasikan bilangan bulat di unary bukanlah penambangan yang berarti antara bahasa-bahasa re dan konsep C ++. Secara khusus, itu tidak mempertahankan kesetaraan semantik.
Philip White
1
Tidak, maksudku ekspresi konstan. Menurut tautan dalam pertanyaan, ini adalah entri 4 dalam daftar 9 jenis kendala. Namun, sebagian besar dari 9 lainnya juga Turing lengkap: misalnya, itu Turing lengkap untuk memutuskan apakah suatu jenis dapat dikonversi ke yang lain di C ++.
Geoffrey Irving