Mengapa C ++ masih “hybrid”

16

Pada pertanyaan terkait , telah diklarifikasi mengapa C ++ tidak kompatibel dengan C dalam banyak aspek. Namun C ++ masih merupakan bahasa "hybrid" *. Dan sayangnya, banyak programmer masih menganggap C ++ sebagai "C dengan stream dan string bawaan". Yang menghasilkan kode tertulis yang benar-benar buruk, bahwa itu bukan C ++ atau C. IMHO, akan lebih baik jika bahasa / kompiler dipaksa sampai batas tertentu programmer untuk menulis kode yang lebih elegan. Jadi, apakah ada alasan untuk mempertahankan hibrida C ++ modern (misalnya C ++ 0x dan versi mendatang)?

* Dengan hibrid yang saya maksudkan adalah tergantung pada programmer untuk memutuskan apakah dia akan menggunakan: string dan stream standar, kelas, ruang nama selain dari default, dll.

sakisk
sumber
Apakah ada pengaturan compiler / IDE yang ada yang dapat menegakkan ini?
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner Saya tidak mengetahui adanya alat yang melakukan itu. Tetapi akan lebih masuk akal untuk menulis alat seperti itu (compiler, IDE, dll.) Jika fitur-fitur tersebut merupakan bagian standar C ++.
sakisk
2
Raison d'etre C ++ adalah kompatibilitas ke belakang dan kemungkinan untuk menggunakan semua trik kotor yang mungkin ada di C. Ambil itu, dan itu hanyalah klon C #, D atau Java lainnya. Jika Anda menginginkannya, mengapa tidak menggunakan C #, D atau Java?
nikie
5
@nikie: Hahahaha. Karena templat, tipe nilai, referensi kuat, kehancuran deterministik, pewarisan berganda, kecepatan eksekusi, penggunaan memori rendah, hal-hal itu tidak ada sama sekali.
DeadMG
2
@nikie: Kecuali D juga memiliki kekejian seperti Objectdan nilai penyalinan biner dan susunan asosiatif yang diramalkan bahasa (mengapa ...) bersama dengan keputusan desain lainnya yang dipertanyakan dari miliknya sendiri. Selain itu, secara efektif juga memiliki paradigma GC yang sama dengan yang lain, jadi saya akan mempertanyakan penggunaan memori yang rendah.
DeadMG

Jawaban:

26

Ya, ada alasan kuat: kode C ++ hampir selalu harus memanggil kode C yang ada. Yang terbaik yang bisa kita lakukan adalah membuatnya mudah untuk menulis kode yang baik. Tidak ada yang bisa dilakukan oleh perancang bahasa untuk membuatnya tidak mungkin menulis kode yang buruk.

kevin cline
sumber
1
Tentu, tetapi karena ini hanya untuk kode lawas mengapa versi C ++ yang lebih baru harus tetap kompatibel? Kode lawas masih dapat menggunakan versi C ++ yang lebih lama.
sakisk
15
@faif, dalam pekerjaan saya, saya menulis kode C ++ baru sepanjang waktu yang perlu berinteraksi dengan kode C baru. Ini bukan hanya masalah warisan.
Karl Bielefeldt
5
@faif: versi terbaru C ++ harus kompatibel - tidak hanya untuk mendukung kode C lama, tetapi juga beberapa ratus juta baris kode C ++ yang ada. Jika Anda menginginkan sesuatu yang tidak kompatibel ke belakang, tetapi dirancang lebih baik, Anda bebas untuk beralih ke bahasa seperti D. Ngomong-ngomong, ini adalah artikel yang sangat bagus tentang perlunya kompatibilitas mundur dari Joel Spolsky: joelonsoftware.com/items/2008 /03/17.html
Doc Brown
4
The best we can do is make it easy to write good code.- Apakah kita berbicara tentang C ++ yang sama?
BlueRaja - Danny Pflughoeft
4
@ BlueRaja-DannyPflughoeft: Saya merasa jauh lebih mudah untuk menulis kode yang baik dalam C ++ daripada di Jawa atau C #. Dengan C ++, saya dapat membaca kelas dan jika semua kelas lainnya berperilaku, saya tahu bahwa memori dan sumber daya tidak akan bocor. Dengan Java dan C # saya tidak bisa melakukan itu; Saya harus memeriksa kelas-kelas lain untuk melihat apakah ada di antara mereka yang membutuhkan penyelesaian. Templat C ++ juga membiarkan saya KERING kode yang harus diulang di Jawa.
kevin cline
20

IMHO, akan lebih baik jika bahasa / kompiler dipaksa sampai batas tertentu programmer untuk menulis kode yang lebih elegan.

Tidak, tidak akan. Sama sekali. Sebagai demonstrasi sepele tentang mengapa, jelaskan anggun, dan kemudian saya bertaruh bahwa sepuluh orang akan datang untuk tidak setuju dengan Anda.

Gaya pengkodean yang didukung bahasa benar-benar buruk. Belum lagi semua kode lawas yang akan rusak.

Khususnya, standar string dan aliran sebenarnya menyedot . std::stringtidak memiliki dukungan Unicode dan antarmuka kembung terburuk yang dapat Anda bayangkan. Streaming memiliki overhead yang mengerikan dan desain yang buruk, bahkan beralih ke warisan virtual, dan pointer fungsi, dan const char*dan uglies seperti itu. Saya tidak akan menghukum siapa pun karena sepenuhnya mengganti kedua kelas / grup kelas dengan yang kustom.

Tidak menggunakan kelas dan ruang nama tidak masalah untuk kode gaya papan tulis, dan ada banyak, banyak perpustakaan yang menyediakan fungsi yang tidak ada di kelas. Kelas paksa adalah ide yang sangat buruk.

DeadMG
sumber
+1 untuk pendekatan yang agak lebih realistis (kapan "kode elegan" berhenti bicara: /
Rook
2
"Gaya pengkodean yang didukung bahasa benar-benar buruk." Bisakah Anda memberikan beberapa contoh? Saya berpikir bahwa bahkan hal-hal sederhana seperti lekukan kode Python yang ditingkatkan meningkatkan keterbacaan kode.
sakisk
3
Saya tidak yakin apakah saya setuju dengan ini. Alasan utama untuk menggunakan CoffeeScript melalui JavaScript adalah karena CoffeeScript dirancang untuk menegakkan penulisan kode yang lebih elegan.
user16764
3
Tidak setuju dengan ini Beberapa desain bahasa dimaksudkan untuk mendorong praktik-praktik yang baik, dan sifat sebagian besar C ++ yang tersebar luas pada umumnya menghalangi hal ini. Faktanya, memilih bahasa, mempertahankan bagian-bagian yang baik dan meningkatkan sisanya adalah motivasi utama di balik keberadaan C ++ 11 .
Robert Harvey
1
@Ubby: "Menulis program jelek yang bekerja lebih baik daripada menulis program indah yang tidak melakukan apa-apa." Tentu, saya bisa setuju dengan itu. Tetapi artikel ini jauh melampaui itu dan tampaknya berpendapat bahwa keburukan sebenarnya adalah suatu kebajikan. Dan itu konyol sekali.
Mason Wheeler
8

C ++ adalah hibrid bukan karena memungkinkan seseorang untuk menulis kode gaya-C, tetapi karena mendukung beberapa paradigma pemrograman, seperti prosedural, berorientasi objek, dan generik. C ++ tidak memaksa Anda menjadi satu cara melakukan sesuatu, dan itulah kekuatannya, karena masalah yang berbeda dapat diselesaikan dengan lebih mudah menggunakan paradigma yang berbeda.

IMHO, akan lebih baik jika bahasa / kompiler dipaksa sampai batas tertentu programmer untuk menulis kode yang lebih elegan.

Maka pertama-tama Anda harus mendefinisikan apa arti elegan . Maka Anda harus melihat apakah definisi Anda tentang elegan sesuai untuk semua domain masalah dan platform yang digunakan C ++. Gaya pengkodean yang elegan untuk menulis pengolah kata untuk Windows mungkin sama sekali tidak cocok untuk menulis sistem tertanam.

Pertimbangkan untuk menulis kode C ++ untuk dijalankan pada DSP. Pertama, kompiler C ++ untuk DSP itu mungkin tidak mendukung fitur C ++ tertentu, seperti stream. Kedua, Anda sangat dibatasi oleh kecepatan CPU, dan mungkin memori, sehingga beberapa fitur C ++ hanya dapat membunuh kinerja Anda. Misalnya Anda mungkin harus menghindari fungsi virtual demi kecepatan. Pertimbangan seperti itu akan secara radikal mengubah gaya pemrograman Anda, dibandingkan dengan apa yang akan Anda gunakan pada PC, dan C ++ memungkinkan itu.

Sebagai rangkuman, C ++ adalah bahasa yang besar dan rumit dengan banyak fitur. Ada banyak alasan mengapa setiap himpunan bagian dari fitur-fitur itu mungkin tidak dapat diterapkan pada proyek tertentu: kecepatan, portabilitas, dukungan kompiler, atau bahkan pengalaman programmer dan keakraban. Untuk alasan itu bahasa memaksa pengembang untuk menggunakan fitur tertentu sebagai lawan dari yang lain untuk tugas yang diberikan adalah ide yang buruk. Pikirkan Java, di mana bahasa mengamanatkan bahwa setiap fungsi harus menjadi metode kelas. Ada begitu banyak kasus ketika membuat kelas hanya untuk membungkus metode adalah canggung dan tidak perlu, namun Anda harus melakukannya karena bahasa memaksa Anda untuk melakukannya.

Dima
sumber
1
Sangat setuju. Saya akan berpikir bahwa ketika seseorang mengatakan "C ++ fleksibel", saya akan berpikir begitu karena mendukung lebih banyak paradigma daripada C.
prelic
5

IMHO, akan lebih baik jika bahasa / kompiler dipaksa sampai batas tertentu programmer untuk menulis kode yang lebih elegan.

Tidak ada satupun memaksa siapa pun untuk menggunakan C ++ sejak awal. Jika bahasa tidak sesuai dengan Anda, maka gunakan yang berbeda - ada banyak bahasa yang ditagih sebagai "C ++ tanpa C".

Filosofi desain C ++ adalah membiarkan programmer memutuskan. Jika mereka ingin menembak diri mereka sendiri di kaki kemudian biarkan mereka. Ini memungkinkan banyak hal buruk untuk dilakukan, tetapi juga memungkinkan banyak fleksibilitas. Misalnya, tidak mungkin Boost dapat ditulis dalam bahasa seperti Java karena memanfaatkan fitur bahasa dan praktik yang biasanya dihindari. Ini juga tidak mungkin bahwa C ++ akan tumbuh sebesar sekarang ini - memiliki akses ke pustaka C yang luas merupakan nilai tambah yang besar, ambil atau tinggalkan.

Kompatibilitas C ++ dengan C jelas merupakan salah satu poin terlemahnya, tetapi juga perlu diingat bahwa itu adalah salah satu yang terhebat.


Saya akan menambahkan kutipan indah dari Jon Purdy yang menurut saya sangat relevan:

Semuanya bermuara pada pragmatisme versus keanggunan, dan bagi saya, terlepas dari obsesi saya terhadap kode yang tepat dan indah, menulis program jelek yang bekerja lebih baik daripada menulis program indah yang tidak melakukan apa-apa.

Menghapus hibrida dapat meningkatkan keanggunan, tetapi menghambat kemampuan.

Pubby
sumber
Apakah Anda percaya bahwa pragmatisme dan keanggunan saling bertentangan? Saya pikir Python, Ruby, dan Scala adalah contoh bahasa yang baik yang pragmatis dan elegan.
sakisk
1
@faif: Tidak, tapi kompatibilitas ke belakang dan keanggunan saling bertentangan. Ini juga berlaku untuk Python (2.x vs. 3.x).
dan04
4

Jika komite berusaha memaksa orang untuk menggunakan (anggapan seseorang) bahasa yang lebih elegan, itu mungkin akan diabaikan. Orang akan terus melakukan apa yang mereka inginkan, dan vendor kompiler akan mengikuti pasar (tetapi vendor kompiler memiliki cukup perwakilan di komite untuk mencegah hal ini).

Sebagian besar dari apa yang Anda anjurkan sebenarnya masalah penilaian, berdasarkan pada domain masalah. Ada banyak program kecil yang tidak perlu (misalnya) ruang nama. Mencoba memaksa saya untuk menggunakan namespace ketika saya sedang menulis filter teks 30-baris akan menjadi bodoh dan sombong. Bahkan jika Anda memutuskan itu hanya akan berlaku ketika lebih dari X baris kode, atau fungsi Y, atau apa pun yang terlibat, itu umumnya masih kontraproduktif. Ruang nama dirancang karena suatu alasan, untuk mencegah / menyembuhkan masalah tertentu. Mencoba memaksakan penggunaannya tanpa adanya masalah itu tidak menghasilkan apa-apa yang berguna bagi siapa pun.

Pada saat yang sama, saya pikir perlu dicatat bahwa beberapa orang benar-benar menghabiskan banyak waktu dan usaha untuk tidak hanya mengaktifkan keanggunan dalam C ++, tetapi untuk mengajar dan mengarahkan orang untuk menggunakan kemampuan tersebut untuk menulis kode yang lebih baik (misalnya, banyak Meningkatkan kontributor). Dengan demikian, orang-orang yang terus bersikeras menulis kode mereka sebagai "C dengan kelas" cukup banyak mengabaikan apa yang ada di luar sana. Saya pikir mereka akan sama nyamannya mengabaikan kompiler baru karena mereka mengabaikan semua yang telah dipelajari tentang cara menggunakan C ++ selama dekade terakhir atau lebih (misalnya, Desain C ++ Modern diterbitkan 11 tahun yang lalu sekarang - tetapi sebagian besar orang Anda sedang berbicara tentang rupanya belum pernah mendengarnya, apalagi membaca atau memahami bahkan bagian yang paling sederhana).

Jerry Coffin
sumber
2

Gagasan Anda merupakan dasar pemikiran desain di balik Jawa. Java memaksa Anda untuk menggunakan kelas, mengatur hierarki file sesuai dengan hierarki paket, menangkap pengecualian, dll. Orang-orang masih berhasil menulis kode mirip-C di dalamnya.

Sebagai programmer, kita kadang lupa solusi terbaik mungkin bukan solusi teknis. Peer reviews adalah solusi paling dikenal dalam hal ini.

Karl Bielefeldt
sumber
0

C ++ tidak memiliki "satu cara yang benar"; setiap pendekatan memiliki kelebihan dan kekurangan. Solusinya dapat ditulis dengan seratus cara berbeda.

Anda sebagai pengembang perangkat lunak harus memutuskan pendekatan mana yang terbaik untuk tugas yang dihadapi.

Coder
sumber
0

Saya pikir fakta bahwa semua hal yang Anda daftarkan adalah opsional menciptakan potensi untuk lebih elegan, bukan lebih sedikit. Fitur yang digunakan secara tidak perlu tidak tepat bagi saya.

Masalah yang perlu kita pecahkan menggunakan pemrograman sangat berbeda.
Beberapa diselesaikan dengan baik menggunakan prinsip-prinsip OO (misalnya GUI), beberapa meminjamkan diri mereka lebih baik untuk perawatan murni fungsional (misalnya hal-hal numerik), sementara beberapa yang terbaik dinyatakan dalam bahasa "dekat dengan silikon" tingkat rendah.

Banyak perangkat lunak perlu menyelesaikan submasalah yang paling baik diselesaikan dengan salah satu cara itu. Memaksa solusi ke dalam bentuk tertentu hanya akan mengarah pada kode yang kurang sesuai dengan tujuannya (Anda bahkan mungkin mengatakan "kurang elegan").

Inilah sebabnya mengapa hibriditas dari C ++ adalah hal yang baik - ini memungkinkan kita memecahkan berbagai masalah dengan cara yang sesuai dengan masalah , bukan dogma saat ini.
Tentu saja itu dapat disalahgunakan - setiap kali Anda memiliki hal yang fleksibel ada risiko Anda menekuknya dengan cara yang buruk - tetapi keanggunan berasal dari pemikiran dan pengalaman yang hati-hati, bukan dari kepatuhan terhadap apa pun yang menjadi tren.

molbdnilo
sumber