Saya seorang programmer C ++ tingkat pemula, tapi saya mengerti konsep bahasa dengan cukup baik. Ketika saya mulai belajar perpustakaan C ++ eksternal, seperti SDL, OpenGL (mungkin sesuatu yang lain juga), saya sangat terkejut ketika mengetahui bahwa mereka tidak menggunakan konsep C ++ sama sekali.
Misalnya, SDL, atau OpenGL tidak menggunakan kelas atau pengecualian, lebih memilih fungsi dan kode kesalahan. Di OpenGL saya telah melihat fungsi seperti glVertex2f, yang mengambil 2 variabel float sebagai input dan mungkin akan lebih baik sebagai templat. Selain itu, pustaka-pustaka ini terkadang menggunakan marcos, sementara itu tampaknya menjadi kesepakatan umum bahwa menggunakan macroses adalah buruk.
Semua dalam semua, mereka tampaknya lebih ditulis dalam gaya C, daripada dalam gaya C ++. Tapi mereka benar-benar bahasa yang tidak dapat ditoleransi, bukan?
Pertanyaannya adalah: mengapa perpustakaan modern tidak menggunakan kelebihan dari bahasa yang mereka tulis?
sumber
Jawaban:
Baik OpenGL dan SDL adalah pustaka C dan mengekspos antarmuka C ke seluruh dunia (karena hampir semua bahasa di luar sana dapat berinteraksi dengan C tetapi tidak harus dengan C ++). Dengan demikian, mereka terbatas pada antarmuka prosedural yang C berikan kepada Anda dan cara C untuk mendeklarasikan dan menggunakan struktur data.
Di atas dan di atas "berinteraksi dengan bahasa lain" yang ditawarkan oleh antarmuka C, C secara umum cenderung sedikit lebih portabel daripada C ++, yang pada gilirannya membuatnya lebih mudah untuk mendapatkan bagian yang tidak tergantung platform dari kode perpustakaan. seperti ini bekerja pada OS lain atau arsitektur perangkat keras. Hampir semua platform di luar sana memiliki kompiler C yang layak, tetapi masih ada beberapa yang telah membatasi kompiler C ++ atau yang tidak begitu bagus.
Sementara C dan C ++ adalah bahasa yang sangat berbeda, mereka bukan "tidak kompatibel", pada kenyataannya, sebagian besar C ++ adalah superset dari C. Ada beberapa ketidakcocokan tetapi tidak banyak, jadi menggunakan antarmuka C dari C ++ adalah hal yang sangat mudah melakukan.
sumber
float3
s karena semua perangkat keras yang bersangkutan adalah array float. Struktur "kelas" (gagasan bahwa vektor adalah 2, 3, atau 4 mengapung) semuanya tersirat dalam cara kartu diperintahkan untuk mengakses tumpukan memori. Mungkin menyenangkan untuk mencoba dan berpikir di kelas ketika memprogram grafik, tetapi menurut saya, jenis pekerjaan itu cukup dekat dengan perangkat keras sehingga lebih merepotkan daripada membantu untuk menghilangkan detail kotor dari implementasi.Saya pikir Anda bingung "menulis perpustakaan" vs. "mengekspos API ke luar". Saya tidak tahu banyak tentang perpustakaan yang Anda sebutkan (mungkin ditulis secara internal dalam bahasa C), tetapi saya tahu banyak yang lain, termasuk saya sendiri, telah menulis perpustakaan C ++ / kerangka kerja yang sepenuhnya memanfaatkan semua jenis praktik / pola OOP yang mewah , tetapi masih mengekspos API gaya-C ke dunia luar.
Di masa lalu, sebagai percobaan di salah satu proyek di tempat kerja, saya memutuskan untuk mengekspos antarmuka "OO" dari C ++ DLL. Untuk menyembunyikan detail internal dan menghindari banyak hal lain, saya hampir akhirnya menemukan kembali COM Windows (model objek komponen). Setelah proyek itu, saya menyadari COM tidak seburuk orang yang melakukannya karena a) memperlihatkan antarmuka OOP, b) mengurus semua masalah yang saya hadapi dan c) cukup standar untuk dapat dikonsumsi dari sejumlah bahasa lainnya.
Tapi COM masih tidak tanpa bagasi. Dalam banyak kasus, reguler, paket C-style API masih merupakan alternatif yang jauh lebih baik.
sumber
OpenGL dan SDL keduanya adalah pustaka C, bukan pustaka C ++. Anda dapat menggunakannya dari C ++, tetapi ditulis dalam C dan memiliki API C (yang juga dapat diakses dari bahasa lain; C ++ sulit diakses melalui FFI). Lihatlah Boost untuk sejumlah besar pustaka C ++ tujuan umum (dan beberapa khusus) dan SFML untuk pustaka multimedia C ++.
sumber
Berbicara kepada OpenGL secara khusus, OpenGL pada awalnya adalah bagian dari setumpuk API - OpenGL menyediakan API tingkat rendah, berorientasi kinerja, dapat diakses dari C (atau bahkan Fortran), sementara OpenInventor menyediakan API berorientasi objek tingkat tinggi, dirancang untuk digunakan dari C ++, dan menyediakan API adegan-grafik tingkat tinggi, dan abstraksi untuk menyimpan / membaca adegan ke / dari file, dan integrasi GUI.
OpenGL akhirnya menjadi lebih jauh daripada OpenInventor (ini memenuhi kebutuhan yang lebih mendesak, memberi pembuat perangkat keras video sesuatu untuk dioptimalkan, dan memberikan API umum tingkat rendah yang bisa ditargetkan orang daripada berurusan dengan perangkat keras akselerasi 3D secara langsung). Tetapi OpenInventor masih ada di sana, dan ada implementasi open source yang bagus - Coin3D - dengan dukungan untuk Unix / X11, Windows, dan MacOS X / Cocoa.
sumber
Perpustakaan-perpustakaan itu sama sekali tidak modern sama sekali. Mereka adalah API C, dan yang buruk itu. Premis Anda cacat.
sumber