Apa yang membuat C begitu populer di zaman OOP? [Tutup]


91

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?


18
videogame, sistem tertanam, pemrograman perangkat keras (firmware), sistem operasi, dll.

25
Perhatikan bahwa Anda hanya mendapatkan apa yang Anda ukur - dalam kasus TIOBE, jumlah klik untuk +"<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.

40
Usia OOP? itu pernyataan yang cukup berani.
Mahmoud Hossam

57
Anda memiliki ilusi bahwa OOP adalah peluru perak, Anda harus kehilangan itu dengan cepat, tidak ada yang istimewa atau "baik" tentang OOP, itu hanya salah satu dari banyak strategi organisasi kode.
Raynos

23
@DeadMG: Panci, ketel. Data TIOBE mungkin tidak dapat diandalkan, tetapi pernyataan botak Anda bahwa "itu tidak populer" tidak memiliki sumber atau kutipan apa pun. Jika Anda akan menantang asumsi di balik pertanyaan, setidaknya berikan beberapa bukti untuk mendukungnya.
Daniel Pryden

Jawaban:


142

Beberapa faktor yang berkontribusi:

  • C ada di mana-mana. Apa pun platformnya, C mungkin tersedia.
  • C portabel. Tulis sepotong C bersih, dan kompilasi dengan modifikasi minimal pada platform lain - kadang-kadang bahkan bekerja di luar kotak.
  • C telah ada untuk sementara waktu. Kembali pada hari-hari ketika UNIX menaklukkan dunia, C (bahasa pemrograman pilihan UNIX) berbagi dalam dominasi dunianya, dan menjadi lingua franca dari dunia pemrograman. Setiap programmer yang serius dapat diharapkan untuk setidaknya membuat beberapa pengertian C; hal yang sama tidak dapat dikatakan tentang sebagian besar bahasa lain.
  • C masih merupakan bahasa default untuk sistem dengan rasa UNIX dan UNIX. Jika Anda ingin perpustakaan berhasil di tanah sumber terbuka, Anda perlu alasan yang cukup baik untuk tidak menggunakan C. Ini sebagian karena tradisi, tetapi lebih karena C adalah satu-satunya bahasa yang Anda anggap aman untuk didukung pada UNIX-like sistem. Menulis pustaka Anda dalam C berarti Anda dapat meminimalkan ketergantungan.
  • C itu sederhana. Ini tidak memiliki ekspresifitas OOP canggih atau bahasa fungsional, tetapi kesederhanaannya berarti dapat diambil dengan cepat.
  • C serba guna. Ini cocok untuk sistem embedded, driver perangkat, kernel OS, utilitas baris perintah kecil, aplikasi desktop besar, DBMS, mengimplementasikan bahasa pemrograman lain, dan hampir semua hal lain yang dapat Anda pikirkan.
  • C cepat. Sebagian besar implementasi C mengkompilasi langsung ke kode mesin, dan programmer memiliki kekuatan penuh atas apa yang terjadi di tingkat mesin. Tidak ada juru bahasa, tidak ada kompiler JIT, tidak ada VM atau runtime - hanya kode, kompiler, linker, dan bare metal.
  • C adalah 'gratis' (dalam arti bir dan ucapan). Tidak ada satu pun perusahaan yang memiliki dan mengendalikan standar, ada beberapa implementasi untuk dipilih, tidak ada masalah hak cipta, paten atau merek dagang untuk menggunakan C, dan beberapa implementasi terbaik adalah open-source.
  • C memiliki banyak momentum. Bahasa ini telah populer selama beberapa dekade, jadi ada sejumlah besar aplikasi, perpustakaan, alat, dan yang paling penting, komunitas, untuk mendukung bahasa tersebut.
  • C sudah matang. Standar terakhir yang memperkenalkan perubahan besar adalah C99, dan sebagian besar kompatibel dengan standar sebelumnya. Tidak seperti bahasa yang lebih baru (katakanlah, Python), Anda tidak perlu khawatir tentang perubahan perubahan dalam waktu dekat.
  • C kompatibel. Sebagian besar bahasa memiliki ikatan untuk berbicara dengan C. Ini berarti seseorang dapat mengembangkan perpustakaan dalam C menggunakan konvensi pemanggilan standar, dan merasa yakin bahwa hampir semua bahasa lain dapat terhubung dengan perpustakaan itu. Untuk menyebutkan beberapa bahasa populer yang digunakan secara luas: C #, Java, Perl, Python, PHP semuanya dapat terhubung dengan perpustakaan C tanpa banyak masalah.
  • C sangat kuat: jika bahasa tidak dapat melakukan sesuatu, semua kompiler populer memungkinkan menanamkan kode assembler yang dapat melakukan apa saja yang dapat dilakukan oleh perangkat keras. Digabungkan secara positif dengan poin di atas tentang kompatibilitas, ini berarti C dapat bertindak sebagai penghubung antara bahasa tingkat yang lebih tinggi dan "bare metal" perakitan.

9
Saya pikir tidak semua argumen Anda benar. 1) C ada di mana-mana. C ++ adalah ubiquitos seperti C, karena ada kompiler C ++ ke C. 2) C portabel. Sama dengan C ++. 3). C telah ada untuk sementara waktu. Sama dengan C ++. 4). C serba guna. Sama dengan C ++. 5) C cepat. Sama dengan C ++. 6). C adalah 'gratis'. Sama dengan C ++. 7). C memiliki banyak momentum. Sama dengan C ++ lagi. 8) C sudah matang. Sama dengan C ++. Jadi Anda sebenarnya tidak menjawab pertanyaan itu.
Konstantin Solomatov

19
C11 adalah standar terbaru, bukan C99. Bukan berarti itu penting karena semua orang menggunakan '89.
Pubby

53
@KonstantinSolomatov: Jika Anda menulis perpustakaan yang akan dikonsumsi oleh orang lain, tolong bantu dunia dan tuliskan dalam C bukannya C ++. Jika Anda tidak dapat melakukannya, setidaknya tuliskan C API. Segala sesuatu di alam semesta dapat ditautkan ke kode C dengan cara apa pun, biasanya dengan upaya minimal. Sebaliknya, Anda akan sering mengalami masalah ABI besar ketika mencoba memanggil kode C ++ dari kode C ++ lainnya , apalagi dari bahasa lain.
Daniel Pryden

37
@KonstantinSolomatov - fakta bahwa ada kebutuhan untuk jenis C ++ ke C membuktikan bahwa C adalah yang ada di mana-mana.
detly

11
@KonstantinSolomatov: Tolong berhenti berpikir bahwa C adalah C ++. C tidak memiliki penutup. Beberapa ekstensi C do (seperti yang diterapkan oleh keluarga kompiler gcc) tetapi C sendiri tidak (yaitu, itu tidak dalam spesifikasi K&R asli atau salah satu dari standar C yang difinalisasi).
Donal Fellows

88

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!


18
Saya yakin beberapa orang keluar di bagian "Baca lebih lanjut hanya jika Anda tertarik pada eksplorasi tingkat fisika". Saya senang saya tidak melakukannya. Ini adalah jenis pemikiran yang mengguncang fondasi pemahaman kita, dan mungkin satu-satunya cara kita akan membuat kemajuan penting. Terima kasih untuk bacaan yang bagus.
Matt Esch

@ Raynos, $ MattEsch, terima kasih untuk Anda berdua atas kata-kata baik Anda, dan saya senang Anda menemukannya menarik!
Terry Bollinger

1
Mendaftar ke situs hanya untuk dapat memilih-jawaban yang mendalam pemikiran ini, luar biasa. =)
sgorozco

2
Sejalan dengan pikiran Anda, saya telah memprogram cukup lama dan menjadi seorang fanatik OOP, karena saya benar-benar melihat keterampilan pengkodean saya meningkat secara dramatis ketika saya mengadopsinya. Namun pengalaman telah menunjukkan kepada saya bahwa memaksa segala sesuatu menjadi objek dapat benar-benar merugikan. Saya sekarang menolak keras di alat pemetaan objek-ke-relasional (apa berantakan) atau skema serialisasi objek-grafik penuh yang mengkonsumsi 1000% bandwidth dibandingkan dengan protokol biner sederhana yang hanya mengirimkan melalui kawat jumlah yang tepat dari data biner yang diperlukan pada saat ini. Terima kasih untuk bacaan yang bagus.
sgorozco

2
Jawaban ini juga merupakan jawaban mengapa kita masih membutuhkan SQL!
HLGEM

25

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.


11
Pemrograman fungsional itu hebat, tidak ada keberatan tentang itu. Tetapi C adalah bahasa yang agak buruk untuk pemrograman fungsional. Penutupan / blok adalah hack non-portabel dan datang dengan sintaks jelek (dan juga gotchas, saya yakin). Bahkan mengabaikan semua itu, Anda masih harus peduli dengan manajemen memori. C adalah bahasa yang bermanfaat, tetapi seperti halnya bahasa apa pun, Anda hanya membuat hidup Anda lebih sulit daripada jika Anda menyalahgunakannya untuk menggunakan paradigma yang tidak dibuat. Anda juga dapat meniru pemrograman fungsional di Jawa (lihat Guava ), tetapi juga tidak bagus.

7
Sangat sulit untuk memprogram dalam gaya fungsional tanpa pengumpul sampah.
Konstantin Solomatov

@KonstantinSolomatov: Pertama, itu sangat subjektif. Kedua, Anda dapat menambahkan pengumpulan sampah ke C jika perlu.
back2dos

Jika Anda ingin kompromi antara Java dan C ++, coba Obj-C :) Pasti sesuatu yang harus dicoba setiap programmer C / C ++.
Sulthan

21

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 ++.


2
Mmm .. C, tomat, dan keju gulung!
DeadMG

3
Nah, C ++ memang memiliki ABI. Hanya saja C ABI solid seperti rock sedangkan C ++ yang terlalu sering berubah. Plus banyak C ++ adalah template yang dikompilasi ke dalam aplikasi yang menggunakan, jadi Anda tidak dapat memperbaruinya. Ketika semua fungsi disembunyikan di balik panggilan fungsi, dimungkinkan untuk memperbaiki perpustakaan dan menjaga aplikasi tetap berfungsi.
Jan Hudec

12

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 ++ stringtipe 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 memanfaatkan stringkapabilitas 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.


2
Hukuman run-time adalah omong kosong. String C (null terminated) jauh lebih efisien daripada string C ++. Juga, kelas string bisa sama std
ringkasnya

1
Toolchain yang tidak menghapus fungsi yang tidak terpakai stringyang tidak digunakan jika Anda menghubungkan CRT secara statis adalah toolchain yang tidak sebanding dengan garam.
Billy ONeal

10
Yang konyol adalah, saya bekerja dengan perpustakaan di mana std::stringtidak 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 yang char*pasti. (String sangat kompleks, bahkan jika Anda mengharapkannya rumit.)
Donal Fellows

1
@DonalFellow Menarik. Inilah sebabnya mengapa standar C selalu mengabaikan hal-hal seperti string dan tabel hash, seperti ketidakhadiran mereka yang terkadang mengganggu saya.
Insinyur

@ArcaneEngineer: Tipe data dasar yang hilang di C adalah tipe "slice of T []" yang akan menggabungkan T * dan sebuah size_t, dapat diindeks seperti array, dapat terurai menjadi T *, dan dapat secara implisit dikonversi dari jenis T [n] (dengan ukuran yang dipasok secara otomatis oleh kompiler). Jenis seperti itu dapat memungkinkan batas otomatis memeriksa dalam banyak kasus di mana itu tidak mungkin, sementara membuat banyak jenis kode lebih bersih dan lebih mudah dibaca.
supercat

11

Sistem dan driver tertanam biasanya diprogram dalam C. Selain itu ada banyak sistem C warisan di luar sana yang masih dipertahankan dan diperluas.


2
Ya, C berjalan di atas segalanya. Dan itu adalah bahasa yang cukup mudah dipelajari (dibandingkan dengan c ++).
BenjaminB

10

Hal yang sama yang membuat palu manual populer di zaman palu pneumatik (palu udara): C masih merupakan alat yang tepat untuk pekerjaan tertentu.


6

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.


5
Lebih baik lagi, ada peluang adil bahwa kode yang dikompilasi 10 tahun yang lalu dapat dieksekusi hari ini.
Donal Fellows

@DonalFellows: Dan, untuk aplikasi yang menggunakan plug-in, ada peluang wajar bahwa aplikasi yang ditulis, dibangun, dan dirilis (dalam bentuk yang dapat dieksekusi) hari ini akan dapat menggunakan plug-in yang dikompilasi dengan alat bantu build yang bahkan belum pernah dibuat. dirancang belum.
supercat

6

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):

  • C itu sederhana. Ini tidak memiliki ekspresifitas OOP canggih atau bahasa fungsional, tetapi kesederhanaannya berarti dapat diambil dengan cepat.
  • C sudah matang. Standar terakhir yang memperkenalkan perubahan besar adalah C99, dan sebagian besar kompatibel dengan standar sebelumnya. Tidak seperti bahasa yang lebih baru (katakanlah, Python), Anda tidak perlu khawatir tentang memecah perubahan dalam waktu dekat.

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.


4

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.


Hal-hal yang saya masukkan ke dalam kategori 'lebih buruk tapi lebih baik': Bahasa Inggris, PHP, Windows. .. McDonald's mungkin. Meskipun saya masih iri / lebih suka Spanyol, Python, Linux, dan Artisan French Cooking; sebisa mungkin, jika tidak umum mungkin.
ThorSummoner

1

Anda mungkin ingin bertanya mengapa orang menggunakan C daripada C ++ meskipun pada kenyataannya ketika Anda memiliki kompiler C, Anda juga biasanya memiliki kompiler C ++.

  • Bahasa C lebih sederhana dari pada C ++. Saya tidak tahu perusahaan mana pun yang menggunakan standar C ++ lengkap dalam konvensi pengkodean mereka. Lihatlah gaya kode C ++ Google sebagai contoh: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
  • C jauh lebih cepat untuk dikompilasi. Berkat kurangnya konstruksi yang sulit dikompilasi.

Tautan ini rusak.
ar2015

0

Tidak ada. TIOBE adalah indeks yang tidak berharga. Jika Anda benar-benar melihat pengukurannya, itu merupakan tebakan mutlak terbaik.


10
Fakta bahwa TIOBE tidak berharga tidak berarti C tidak populer
Raynos

Namun, hal itu jelas mengalahkan argumen yang disajikan dalam OP- bahwa C itu populer dan karena itu harus ada gunanya.
DeadMG

2
Ukuran yang lebih baik dari popularitas C adalah bahwa hampir setiap platform memiliki kompiler C
Raynos

@ Raynos: Itu bukan pengukuran sama sekali. Satu-satunya hal yang berarti adalah mudah diimplementasikan. Itu tidak mengatakan apa-apa tentang berapa banyak orang yang menggunakannya, atau mengapa.
DeadMG

2
Tidak sepenuhnya, saya dengan senang hati menerima sudut pandang yang berlawanan. Jawaban satu baris Anda tampaknya tidak banyak diterapkan, dan Anda argumentatif dan tidak konstruktif dengan respons Anda.
mattnz

0

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.


3
Setengah bagian terakhir dari jawaban ini perlu didekobekan.
aramis

@aramis. Bagian kedua berarti: Banyak kode tampaknya menjadi donde langsung dalam "C", tetapi, sebenarnya dalam bahasa lain, dan ditiru oleh "C"
umlcat

0

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.


3
Satu masalah dengan Pascal adalah bahwa versi bahasa "resmi" meninggalkan beberapa fitur yang sangat diperlukan. Untuk sementara, PC dan Macintosh memiliki kompiler Pascal yang jauh lebih bermanfaat daripada kompiler C yang ada pada saat itu, tetapi kompiler semacam itu menambahkan ekstensi bahasa yang tidak didukung oleh standar "resmi". Saya pikir jika ada upaya untuk membuat standar resmi yang mengkodifikasi ekstensi tersebut, Pascal bisa menggantikan hack bahasa yang dikenal sebagai "C".
supercat

0

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.


apakah Anda membandingkan mengajukan pertanyaan SO untuk C # atau Java?
nyamuk

@gnat itu adalah contoh terisolasi dari C v Python (yang omong-omong memiliki lebih banyak pertanyaan!). Saya tidak punya pengalaman dengan C # (apakah Anda memperhatikan saya tidak menanyakan pertanyaan SO untuk C # atau jav?)
puk

Heh, saya menemukan komunitas #python di StackOverflow hampir selalu super cepat. Meskipun saya akan terkejut jika komunitas C mengungguli komunitas javascript untuk kecepatan jawaban. (Sebagian besar karena volume)
ThorSummoner
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.