Saya banyak kode dalam C dan C ++, tetapi tidak berharap C menjadi bahasa kedua yang paling populer, sedikit di belakang Java.
Indeks Komunitas Pemrograman TIOBE
Saya ingin tahu mengapa, di usia OOP ini, C masih begitu populer? Perhatikan bahwa 4 dari 5 bahasa pemrograman populer adalah "modern", bahasa yang mampu berorientasi objek.
Sekarang, saya setuju bahwa Anda dapat menggunakan OOP dalam C sampai batas tertentu, tapi agak menyakitkan dan tidak elegan (setidaknya setidaknya dibandingkan dengan C ++ saya kira). Jadi, apa yang membuat C begitu populer? Apakah ini efisiensi; tingkat rendah; sebagian besar perpustakaan yang sudah ada atau yang lain?
programming-languages
object-oriented
c
GradGuy
sumber
sumber
+"<language> programming"
di mesin pencari populer. Sebuah posting blog "Mengapa tidak ada yang melakukan pemrograman C lagi" menghitung C dalam indeks ini. Heck, bahkan pertanyaan ini dapat dilakukan segera setelah Google mengambilnya.Jawaban:
Beberapa faktor yang berkontribusi:
sumber
Saya selalu cenderung menyalahkan popularitas C pada perlunya bahasa assembly universal. Ini kombinasi kekhususan di tingkat mesin, standarisasi, dan portabilitas ekstrim memungkinkan C berfungsi sebagai yang de facto bahasa assembly universal, dan untuk alasan itu saya menduga perannya akan berlanjut tanpa henti.
Saya harus menyebutkan bahwa saya selalu sedikit terkejut ketika OOP disajikan dalam kursus pemrograman sebagai semacam "model akhir" yang merupakan satu-satunya titik akhir yang mungkin untuk pemrograman yang baik. Seperti banyak aspek pemrograman lainnya, nilai OOP adalah kompromi antara banyak faktor yang bersaing, termasuk bagaimana otak manusia mengatur informasi, bagaimana kelompok masyarakat mendukung perangkat lunak dalam jangka panjang, dan dalam kasus pemrograman berorientasi objek, beberapa aspek yang cukup dalam tentang bagaimana alam semesta itu bekerja.
Dan poin terakhir itu layak dipalu sedikit. Baca lebih lanjut jika Anda tertarik dalam eksplorasi tingkat fisika tentang mengapa gaya pemrograman tertentu ada, bagaimana mereka bekerja bersama, dan ke mana dunia menuju ke masa depan saat kami memperluas lebih lanjut tentang konsep-konsep seperti ...
Objek dalam fisika adalah segala sesuatu yang mempertahankan koherensi yang dapat dikenali dari waktu ke waktu. Itu pada gilirannya memungkinkan makhluk sederhana seperti kita untuk pergi dengan mewakili objek hanya menggunakan sejumlah kecil bit, tanpa membahayakan kelangsungan hidup kita terlalu buruk. Tetapi dalam hal fisika dalam jumlah besar, jumlah hal yang harus Anda dapatkan dengan tepat agar penyederhanaan semacam itu mudah dan umum sangat besar. Sebagai manusia, kita tidak terlalu memikirkan semua itu karena terus terang, kita tidak akan berada di sini jika itu tidak benar.
Kedengarannya terlalu abstrak? Sebenarnya tidak. Bayangkan misalnya mencoba menavigasi jalan ke rumah teman Anda jika alih-alih mobil yang Anda temui berosilasi dengan cepat bidang plasma dan kondensasi sesaat dari materi bergerak dengan rentang kecepatan yang sangat besar. Skenario seperti itu mungkin memotong peluang sosialisasi secara mendalam, ya? Kita membutuhkan objek, kita adalah objek, dan keberadaan objek memberi kita tingkat penyederhanaan yang sangat penting dan sangat penting dari lingkungan di sekitar kita.
Jadi mari kita tarik semua itu kembali ke perangkat lunak. Apa yang dikatakan objek di dunia nyata tentang objek dalam hal pemrograman?
Yah, untuk satu hal itu berarti bahwa apa yang mendefinisikan objek "baik" dalam perangkat lunak harus benar-benar apakah jenis data yang Anda tangani dengan mudah mendukung gagasan kegigihan yang dapat dikenali dari waktu ke waktu .
Dengan definisi tersebut, bentuk OOP yang paling mudah mudah dikenali. Mereka adalah orang-orang yang sedikit keluar dengan hanya menggunakan data yang sudah "dilampirkan" atau didefinisikan oleh beberapa objek dunia nyata, benar-benar fisik seperti seseorang, rumah, atau mobil. Bahkan hari ini, ini masih terlalu sering satu - satunya definisi objek yang orang dapatkan dalam kursus perangkat lunak. Itu terlalu buruk, karena bahkan program berorientasi objek sepele membutuhkan definisi yang lebih luas dari itu.
Kategori objek kedua dan yang jauh lebih menarik terdiri dari apa yang saya sebut peristiwa dunia nyata yang diabadikan . Dengan "diabadikan" maksud saya hal-hal yang setidaknya secara singkat ada sebagai entitas yang didefinisikan dengan baik atau koleksi di dunia nyata, tetapi yang kemudian bubar dan tidak ada lagi sebagai koleksi yang bermakna secara fisik. Sebuah simposium adalah contoh yang bagus: Simposium ini ada untuk sementara waktu sebagai kumpulan tempat dan orang yang didefinisikan dengan baik. Namun sayang, bahkan konferensi terbaik pun harus berakhir, dan bagian-bagian individu yang membuatnya beralih ke kegiatan lain.
Tetapi dengan menggunakan komputer dan jaringan, kita dapat membuat simposium sementara seperti tampak seperti objek jangka panjang dengan menangkap dan mempertahankan memori sebagai objek perangkat lunak. Banyak hal yang kita lakukan dengan komputer dan basis data sama dengan keabadian jenis sementara ini, di mana kita sebenarnya berusaha membuat alam semesta kita lebih kaya dengan menangkap dan memperluasnya dengan cara yang tidak mungkin ada secara fisik. Misalnya, apakah Anda melihat Pandora nyata belakangan ini? Pengambilan dan perluasan karya dunia nyata semacam itu membantu memperkaya dan memperpanjang hidup kita sendiri, ekonomi, dan pilihan dengan cara yang luar biasa. Bagi saya ini adalah pusat pemrograman berorientasi objek, tempat di mana ia memiliki, dan terus memiliki, dampak paling luar biasa.
Kategori terakhir OOP terdiri dari objek yang tidak memiliki koneksi dekat dengan peristiwa eksternal, tetapi merupakan infrastrukturdiperlukan untuk mendukung perpanjangan realitas kita yang berkelanjutan dengan menggunakan benda-benda yang diabadikan dari dunia nyata. Di sinilah Anda bisa turun hingga ke (semi) logam komputer, menciptakan kepingan-kepingan realitas persisten yang seperti unsur-unsur kimia dari dunia nyata dapat digabungkan dengan cepat dan dengan cara yang menarik untuk membangun dunia internal baru. Komputasi mobile telah membantu mempromosikan pertumbuhan pendekatan rekombinatorial semacam ini, yang sekali lagi meniru fitur rekombinatorial dari dunia fisik. Ini juga sulit: Apa yang tampak seperti pilihan yang baik mungkin terbukti dari waktu ke waktu merupakan pilihan yang buruk, biasanya karena pada akhirnya menghalangi keanekaragaman dan ekspansi alih-alih mendukungnya.
Kategori terakhir ini juga menunjukkan risiko menggunakan hanya satu model untuk pemrograman, karena seperti dunia nyata, dunia terprogram juga membutuhkan proses yang tidaksesuai dengan benda yang relatif tidak berubah. Bumi penuh dengan benda-benda, tetapi matahari penuh dengan aliran energi yang sangat dinamis yang pada akhirnya diperlukan untuk "mendorong" benda-benda dan aktivitas-aktivitas di bumi berenergi lebih rendah. Demikian pula, dalam menciptakan dunia komputasi ada kasus-kasus di mana Anda harus berurusan dengan aliran dan transformasi dan konteks yang berubah dengan cepat yang, meskipun tidak terlalu seperti objek dalam diri mereka, tetap sangat penting untuk memungkinkan objek yang lebih sederhana, lebih ramah-manusia yang digunakan pada level yang lebih tinggi . Bukan kebetulan bahwa banyak pemrograman yang dilakukan pada level kernel tidak seperti objek, atau cenderung bergantung pada bahasa seperti C yang lebih berorientasi pada pemrosesan. Ini adalah domain yang lebih dalam yang melengkapi keragaman menarik yang kita lihat lebih tinggi di dunia yang dihasilkan komputer.
Area lain di mana OOP bisa serba salah adalah terlalu fokus pada konsep objek lama .
Objek di dunia nyata, dan terutama objek hidup , memiliki tingkat kemampuan yang benar-benar menakjubkan untuk berinteraksi dengan lingkungannya dengan cara yang kompleks dan halus. Widget kompos yang melihat satu sama lain, melakukan beberapa kompatibilitas dan pemeriksaan kewarasan, dan mungkin bahkan menemukan beberapa cara baru untuk berinteraksi lebih dekat dengan konsep objek biologis dunia nyata daripada kerangka kerja sederhana dan skema pewarisan sederhana yang kita cenderung untuk fokus pada (biasanya karena kebutuhan!) di tingkat kode. Ini adalah salah satu area pertumbuhan untuk objek-objek di dunia cyber, semakin banyak pendekatan "seperti agen" di mana reaktivitas terhadap lingkungan adalah norma bahkan dalam pemrograman itu sendiri.
Dan banyak untuk "kritik" saya terhadap OOP! Meski begitu, saya harap saya telah menunjukkan mengapa menciptakan dunia maya yang lebih kaya berarti mencakup keragaman gaya pemrograman, daripada mengasumsikan bahwa "hanya satu" yang dibutuhkan. Perasaan saya adalah bahwa hal yang sangat menarik belum datang, tidak peduli seberapa biasa apa yang kita lakukan sekarang!
sumber
Pertama, Anda tidak perlu OOP untuk semuanya, terlepas dari dogma apa pun mengenai hal ini telah dipopulerkan. Tidak seperti Java, C memungkinkan pointer fungsi dan bahkan penutupan yang membuka pintu untuk pemrograman fungsional dan menyelesaikan cukup banyak ruang masalah yang ditangani OOP, karena menyediakan sarana injeksi ketergantungan. Juga hati-hati penggunaan macro benar-benar dapat membuat beberapa hal yang sangat bagus, karena sglib membuktikan.
Dengan cara yang aneh, orang bisa melihat C sebagai kompromi yang baik antara Java dan C ++. Harap dicatat saya tidak mengatakan bahwa C adalah campuran keduanya. Tetapi berbeda dengan Java, bahasa ini agak kuat sementara berbeda dengan C ++ memiliki kompleksitas yang dapat dikelola.
Ini adalah bahasa lama, yang telah tumbuh andal dan konsisten, sementara tidak benar-benar tumbuh lebih rumit. Dan selain itu, ia memiliki sistem ekologi raksasa dan berjalan di mana-mana.
sumber
C memiliki ABI (Application Binary Interface) C ++ tidak. Ini membuat C lebih bermanfaat daripada C ++ dalam kasus tertentu. Jika saya akan menulis perpustakaan dan dapat mengirimkan binari untuk penggunaan orang lain, C ++ adalah alat yang salah untuk pekerjaan itu. Jika saya akan menulis perpustakaan yang akan digunakan oleh bahasa lain lagi C adalah alat yang tepat untuk pekerjaan itu. Saya belum pernah mendengar bahasa yang tidak mendukung FFI (Antarmuka Fungsi Asing) ke C, di sisi lain C ++ tidak akan berfungsi dengan perpustakaan yang ditulis dalam C ++ jika kompiler yang berbeda digunakan.
Pada dasarnya bermuara pada C mengisi peran yang tidak cocok untuk C ++.
sumber
Salah satu keuntungan menggunakan bahasa C lebih dari seperti C ++ atau Java adalah bahwa tidak ada banyak keajaiban terjadi di bawah tenda. Tidak ada konstruktor dijalankan ketika item dialokasikan, dan tidak ada destruktor dijalankan ketika objek keluar dari ruang lingkup. Tidak ada nama mangling dan tidak ada vtables. Kinerja lebih mudah diprediksi; Anda tidak perlu khawatir tentang pengumpul sampah mengganggu rutinitas dan membuang waktunya.
Konstruktor, destruktor, nama mangling, vtable, pengumpul sampah, dll., Dapat meringankan beberapa kompleksitas dalam kode yang Anda tulis, tetapi kemudian kompleksitas itu menjadi bagian dari bahasa itu sendiri, di mana Anda memiliki sedikit atau tidak ada kontrol atasnya . Anda mungkin berakhir dengan waktu pengembangan yang lebih lama (menjengkelkan, tetapi dapat ditoleransi), jejak memori runtime yang lebih besar (mungkin atau mungkin tidak dapat ditoleransi) atau kinerja lebih lambat. Dengan C Anda dapat menghilangkan beberapa kompleksitas itu sampai Anda memiliki fungsi yang Anda butuhkan .
Sebagai contoh, C ++
string
tipe data adalah tahun cahaya lebih mudah untuk bekerja dengan dari string C-gaya, tapi itu sepotong cukup berat kode, dan menambahkan beberapa bobot untuk ukuran gambar Anda. Saya jarang melihat ada orang yang memanfaatkanstring
kapabilitas penuh dalam salah satu program. String C-style, walaupun lebih sulit untuk diajak bekerja sama, memberikan penalti lebih sedikit dalam hal waktu lari dan ukuran gambar, dan untuk masalah tertentu mungkin lebih menarik karena alasan itu.sumber
std
string
yang tidak digunakan jika Anda menghubungkan CRT secara statis adalah toolchain yang tidak sebanding dengan garam.std::string
tidak cukup canggih . Jika Anda benar-benar serius tentang string, baik dalam hal kinerja dan kemampuan, Anda kembali menggunakan C dan melakukan semuanya sendiri lagi, meskipun tidak menggunakan yang lama yangchar*
pasti. (String sangat kompleks, bahkan jika Anda mengharapkannya rumit.)Sistem dan driver tertanam biasanya diprogram dalam C. Selain itu ada banyak sistem C warisan di luar sana yang masih dipertahankan dan diperluas.
sumber
Hal yang sama yang membuat palu manual populer di zaman palu pneumatik (palu udara): C masih merupakan alat yang tepat untuk pekerjaan tertentu.
sumber
Kesederhanaan, konsistensi, dan presisi.
Sederhana - Anda tidak perlu lingkungan pengembangan yang kompleks, perpustakaan yang luas, atau mesin virtual.
Ini konsisten - kebanyakan C ditulis 10 tahun yang lalu dapat dikompilasi hari ini.
Presisi - memungkinkan Anda untuk turun ke level mesin, mengetahui lokasi memori yang diperlukan. Ini bagus untuk kinerja dan perangkat keras tertanam.
Ini bukan untuk semuanya, tapi itu masih alat yang berguna.
sumber
Saya mengutip dua poin dari jawaban lain, karena mereka menangkap dengan tepat alasan mengapa saya masih menggunakan C dari waktu ke waktu (meskipun itu bukan bahasa pilihan utama saya):
Saya pikir ini sangat benar. Saya belajar C pada awal nighties: itu sederhana, beberapa kata kunci dan konstruksi, sebagian besar pekerjaan yang dilakukan oleh perpustakaan. Lalu saya tidak menggunakan C selama beberapa tahun. Sekitar tahun 2002 saya membutuhkan implementasi algoritma yang cepat, saya menginstal kompiler C dan mengimplementasikannya. Saya tahu bahasanya, saya tahu apa gunanya, untuk apa tidak baik (saya tidak akan pernah mengimplementasikan aplikasi web dalam bahasa C!), Dan itu ada di sana saat saya membutuhkannya. Tidak ada kejutan.
Dengan C ++ saya punya pengalaman berbeda. Saya mempelajarinya sekitar tahun 1995 dan itu berarti perubahan paradigma besar dari imperatif ke OOP. Bagus! Saya menggunakannya untuk beberapa proyek hingga 1999. Selama beberapa tahun saya tidak menggunakan C ++ dan ketika saya mengambilnya lagi (2008) saya menemukan banyak fitur baru yang sudah ada dalam bahasa tersebut, dan bahkan lebih terencana (sementara itu diperkenalkan di C ++ 11). Saya merasa saya harus belajar bahasa itu lagi.
Sebagai pengembang, saya lebih suka bahasa dewasa dan stabil. Saya suka sekali belajar bahasa, memahami prinsip-prinsip desainnya, apa manfaatnya, dan menggunakannya ketika saya pikir itu adalah alat yang tepat untuk pekerjaan itu. Saya juga suka belajar bahasa yang berbeda dan memilih bahasa yang sesuai dengan kebutuhan saya (C, C ++, Java, Scala, Haskell, dan sebagainya). Apa yang saya tidak suka adalah harus belajar bahasa yang sama lagi dan lagi karena itu semakin berkembang, dan tidak pernah mencapai kedewasaan.
IMHO, bahasa pemrograman harus memiliki desain yang jelas, koheren, dan stabil. Saya suka pendekatan desainer seperti Niklaus Wirth: setiap kali dia merasa perlu untuk bahasa yang berbeda, dia merancang yang baru (Pascal, Modula-2, Modula-3, Oberon). Saya tidak suka bahasa yang mengalami perubahan penting setiap 5-10 tahun: mereka seperti memindahkan target dan saya tidak pernah merasa perlu menginvestasikan waktu saya untuk mempelajarinya secara mendalam, karena versi yang saya pelajari sekarang mungkin akan usang dalam beberapa tahun pula.
Dalam hal ini C adalah IMO pemenang: itu baik untuk aplikasi tertentu dan kurang cocok untuk yang lain, tetapi memiliki keunggulan karena sederhana dan relatif stabil.
sumber
Saya terkejut bahwa belum ada yang menyebut Worse Is Better . Sudah lebih dari 20 tahun saat ini, tetapi masih layak dibaca. Sementara kadang-kadang sedikit di-pipi, itu melakukan pekerjaan yang sangat baik untuk menguraikan bagaimana dan mengapa bijaksana sering menang atas yang ideal, menggunakan C (diadu dengan LISP) sebagai salah satu contoh utama.
sumber
Anda mungkin ingin bertanya mengapa orang menggunakan C daripada C ++ meskipun pada kenyataannya ketika Anda memiliki kompiler C, Anda juga biasanya memiliki kompiler C ++.
sumber
Tidak ada. TIOBE adalah indeks yang tidak berharga. Jika Anda benar-benar melihat pengukurannya, itu merupakan tebakan mutlak terbaik.
sumber
Banyak Perangkat Lunak Legacy
Banyak perusahaan tidak dapat mengubah, langsung semua kode mereka ke C ++ atau serupa.
Banyak perusahaan tidak mampu mengubah kode mereka.
Banyak perusahaan yang mampu mengubah kode mereka, tetapi tidak peduli, atau "murah".
Banyak perusahaan dalam proses migrasi, tetapi belum selesai.
Orientasi Objek Tersembunyi
(Non Berorientasi Objek) Kode sumber C dirancang sebagai kode sumber Berorientasi Objek C, aplikasi yang dimodelkan dengan Orientasi Objek, dan dikodekan dengan "C murni", atau alat yang menerjemahkan dari "C ++" atau program OO lainnya. masuk ke C.
Saya mendengar bahwa beberapa permainan video dilakukan dengan cara itu. Beberapa alat lintas platform juga, dan pustaka antarmuka visual GTK (GObject, GLibrary) untuk distribusi OS Linux GNome.
sumber
Saya melihat beberapa penjawab memberikan mengapa C adalah yang paling populer, sudah ada sejak lama, tersedia di sebagian besar platform, gratis, dll.
Tetapi hal yang sama dapat dikatakan tentang bahasa lain, Pascal gratis misalnya - gratis, dan didukung untuk hampir semua platform.
Pascal ditemukan sekitar tahun 1970, C ditemukan sekitar tahun 1972, jadi saya pikir Pascal sudah ada selama C.
Secara pribadi saya pikir C adalah bahasa yang paling populer karena hanya ada lebih banyak kode sumber terbuka yang tersedia untuk digunakan kembali oleh siapa pun. Dan ya levelnya lebih rendah dari Pascal, jadi semakin dekat dengan assembly tetapi jauh lebih mudah dibaca daripada assembly.
Saya pikir ada terlalu banyak bahasa pemrograman di luar sana. Sebagai programmer kita harus mengetahui sebagian besar yang penting, tetapi pada akhirnya tidak perlu untuk itu. Satu bahasa pemrograman dapat diimplementasikan untuk melakukan semuanya, mulai dari membangun situs web hingga permainan komputer iOS.
C sepertinya bahasa global itu, tapi saya berharap itu akan menjadi sesuatu seperti Object Pascal. Mengapa Object Pascal, itu adalah bahasa pemrograman yang lebih mudah dibaca, kode OOP cenderung lebih dapat digunakan kembali dan lebih sedikit bug yang rentan (menurut saya) daripada C.
Aplikasi yang sangat besar lebih mudah dikelola dengan Object Pascal daripada C / C ++.
Seperti memiliki bahasa pemrograman yang telah ada sejak tahun '70, dan tidak menyukai bahasa yang berubah setiap 5 atau 10 tahun. Seiring berjalannya waktu kemajuan teknologi dan metode pemrograman ditingkatkan. Jika suatu bahasa berubah secara drastis setiap beberapa tahun maka itu mungkin tidak dipikirkan dengan baik oleh perancangnya. Tetapi 1970 hingga 2012 hampir setengah abad, tidak apa-apa untuk membuat perubahan pada bahasa saat itu untuk memasukkan kemajuan yang digunakan dalam pengembangan Perangkat Lunak.
C sendiri telah direvisi beberapa kali. Jadi, itu tidak lebih baik daripada bahasa lain dari sudut pandang itu.
sumber
Karena C memiliki basis pengguna yang sangat besar. Ya itu sedikit menangkap-22, tetapi ketika saya mengajukan pertanyaan tentang C over pada StackOverflow, saya mendapatkan jawabannya hampir secara instan. Pertanyaan yang sama tentang Python bisa memakan waktu berjam-jam untuk dijawab.
Sehubungan dengan C ++, IMO lebih rumit untuk dipelajari. Selain itu, setelah mencoba OOP selama 10 tahun, saya merasa itu tidak selalu berguna, dan sering kali lebih mudah menggunakan pemrograman prosedural sebagai gantinya.
sumber