Saya seorang programmer C #, dan sebagian besar pengembangan saya adalah untuk situs web bersama dengan beberapa aplikasi Windows. Sejauh C berjalan, saya belum menggunakannya dalam waktu yang lama, karena tidak perlu. Itu mengejutkan saya ketika salah satu teman saya mengatakan bahwa dia perlu belajar C untuk menguji pekerjaan, sementara saya membantunya belajar C #.
Saya pikir seseorang hanya akan belajar C untuk pengujian jika ada pengembangan yang dilakukan dalam C. Dari pengetahuan saya, semua pengembangan terkait dengan COM dan desain perangkat keras juga dilakukan dalam C ++. Oleh karena itu, belajar C tidak masuk akal jika Anda perlu menggunakan C ++. Saya juga tidak percaya pada signifikansi historis, jadi mengapa membuang-buang waktu dan uang untuk belajar C?
Apakah C masih digunakan dalam setiap jenis pengembangan perangkat lunak baru atau yang lainnya?
sumber
Jawaban:
C memiliki keunggulan bahwa itu adalah bahasa yang relatif kecil , yang membuatnya mudah untuk mengimplementasikan kompiler C (sedangkan kompiler C ++ adalah monster untuk menulis), dan membuatnya lebih mudah untuk belajar bahasa . Lihat juga indeks TIOBE , yang menurutnya C sedikit di depan C ++.
Dalam (IMO) penurunan urutan pembenaran, C masih banyak digunakan untuk
Embedded stuff
Merupakan cara yang lebih mudah untuk mem-port sebuah kompiler C ke platform yang lebih kecil dibandingkan dengan mem-port sebuah kompiler C ++. Juga, pendukung C mengklaim bahwa C ++ "melakukan terlalu banyak di belakang mereka". Namun, IMO itu FUD.
Pemrograman sistem
Sekali lagi, itu biasanya karena klaim bahwa lebih mudah untuk "mengetahui apa yang dilakukan kompiler". Namun, banyak program yang disematkan akan mendapat manfaat dari, misalnya, templat dan fitur kunci C ++ lainnya.
Perangkat lunak open source
Itu sebagian besar masalah sikap, meskipun: OSS selalu lebih suka C daripada C ++ (padahal itu kebalikan dari sebagian besar industri). Kebencian irasional Torvalds sebenarnya mungkin menjadi alasan paling penting untuk ini di Linux .
sumber
std::vector
ataustd::map
untuk bagian tertentu dari kode - tetapi Anda tidak harus mengimplementasikan sendiri, tetapi dapat mengandalkan diuji dengan baik, sangat performant, dan implementasi perpustakaan yang dapat diandalkan yang menawarkan abstraksi tinggi.C banyak digunakan dalam pemrograman perangkat keras tertanam di mana sumber daya langka.
Kernel Linux ditulis dalam bahasa C karena, menurut Linus Torvalds, C ++ adalah bahasa yang mengerikan .
sumber
Semua bahasa modern yang saya lihat dapat berinteraksi dengan C:
Kebutuhan untuk berinteraksi dengan C berasal dari:
Ini berarti karena bahasa-bahasa tersebut dapat berkomunikasi dengan C, mereka dapat:
Dan saya berani bertaruh bahwa mereka semua bergantung pada C untuk runtimes mereka (kecuali mereka pergi perakitan penuh? Meragukan).
C adalah Lingua Franca dari bahasa pemrograman dan salah satu yang paling sederhana (berdasarkan ABI) tidak terikat dengan arsitektur tertentu (seperti perakitan), itu akan mengambil perubahan besar untuk menyingkirkannya.
sumber
Menurut pendapat saya, ini adalah pertanyaan yang sangat pendek terlihat seperti "Teman-teman saya dan saya mendengarkan Reggae. Apakah ada yang benar-benar masih mendengarkan Rap?".
Setiap bahasa di luar sana memiliki kegunaannya. Bahasa yang berbeda pasti memiliki relung mereka. Tetapi bertanya tentang C! Saya yakin lebih sedikit orang menggunakan C # daripada C setiap hari (dari sudut pandang yang sepenuhnya bias bekerja di toko di mana tidak ada yang menggunakan C #).
Google cepat mencari popularitas relatif bahasa.
Saya yakin semua ini tidak otoritatif tetapi kita bisa menggunakannya untuk melihat tren:
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/
Bahkan melihat rasio SO pada tag:
https://stackoverflow.com/tags
Jadi C adalah 18 topik paling populer di SO (dan ada banyak bahasa lain di sana).
Catatan: Indeks TIOBE di atas telah terus diperbarui selama lebih dari satu dekade (dan memiliki beberapa data kembali 3 dekade) seharusnya mengukur insinyur yang bekerja dalam setiap bahasa (meskipun saya tidak tahu seberapa akurat itu). Dari 10 bahasa teratas kecuali Java / Visual Basic itu mencerminkan apa yang diketahui orang di toko saya (meskipun rasio kami akan sedikit berbeda karena kami memiliki ukuran sampel yang jauh lebih kecil).
sumber
I am sure none of this is authoritative but we can use it to see trends
Tapi saya tidak setuju dengan pernyataan kedua Anda; C bukan lagi bahasa utama yang diajarkan di lembaga-lembaga pendidikan tinggi (jika itu maka batch lulusan baru tidak akan sama tidak berguna). Orang-orang cenderung belajar Java / C # tajam saat ini. Juga laporan Tiobe adalah tentang pekerjaan, bukan permintaan.Anda mungkin perlu menggunakan C saat sumber daya Anda rendah dan tidak memerlukan kemampuan berorientasi objek.
Banyak perangkat lunak yang digunakan saat ini masih ditulis dalam C, belum lagi driver perangkat keras.
Menurut indeks Tiobe , C masih merupakan bahasa yang paling banyak digunakan.
Seperti yang disarankan tcrosley, Anda mungkin ingin melihat pertanyaan terkait ini .
Anda juga harus memeriksa beberapa artikel terkait tentang perbedaan antara C dan C ++, seperti wiki ini atau ini misalnya.
sumber
Sepertinya Anda mencoba meyakinkan diri sendiri bahwa C tidak berguna dan karena itu dapat diabaikan. Mari uraikan pertanyaan Anda:
"Saya pikir seseorang hanya akan belajar C untuk pengujian hanya jika ada pengembangan yang dilakukan dalam C."
Tidak, ada banyak alasan untuk belajar C. Bahkan jika Anda tidak tahu bahwa saya masih akan menghindari menggunakan pernyataan selimut seperti itu, terutama dalam hubungannya dengan logika sirkuler. Jelas seseorang perlu tahu bahasa kode ditulis untuk dapat benar menguji / memperbaikinya tetapi yang mengasumsikan bahwa langauge masih digunakan sebagai yang diberikan dan benar untuk bahasa apa pun dan bukan hanya C.
"Sepengetahuan saya, semua pengembangan terkait dengan COM dan desain perangkat keras juga dilakukan dalam C ++."
Itu tidak benar.
"Karena itu, belajar C tidak masuk akal jika kamu perlu menggunakan C ++. Aku juga tidak percaya pada signifikansi historis, jadi mengapa membuang-buang waktu dan uang untuk belajar C?"
Ini adalah logika yang paling dipertanyakan dari semua. Pertama-tama, signifikansi historis adalah sesuatu yang harus Anda percayai, karena jika Anda melakukannya Anda akan tahu bahwa C adalah bagian dari C ++ dan, karena itu, mengetahui C dapat membantu Anda menjadi programmer C ++ yang lebih baik. Tentu saja, C juga berpengaruh pada sebagian besar bahasa yang datang setelahnya sehingga manfaatnya tidak berhenti di situ. Selain itu, karena C sangat penting sehingga tidak dapat dianggap hanya memiliki signifikansi historis. Ini masih banyak digunakan dan dengan demikian tidak dapat diturunkan ke posisi sekunder seperti itu. Anda dapat berargumen bahwa itu bukan bahasa yang harus digunakan oleh setiap programmer dan memiliki pengetahuan yang mendalam tentang dan itu akan benar tetapi tolong jangan membangun argumen Anda tentang mengatakan bahwa Anda tidak percaya sesuatu tanpa terlebih dahulu memeriksa kebenarannya.
sumber
Selain sistem yang disematkan, sebagian besar bahasa yang lebih baru memiliki beberapa cara untuk berinteraksi dengan C. Saat menulis perpustakaan yang ingin Anda gunakan dengan mudah dalam semua bahasa itu, C adalah pilihan yang jelas. C ++, sementara itu juga dapat berinteraksi dengan beberapa bahasa (seperti Python (hanya CPython)), C ++ tidak dapat berinteraksi dengan sejumlah besar bahasa karena beberapa fitur-fiturnya (terutama nama mangling, tetapi templat tidak membantu masalah ini). C ABI adalah salah satu yang paling mudah untuk antarmuka (saya tahu Anda dapat menulis C ++ dan menggunakan extern "C" untuk antarmuka. Saya tidak peduli).
Ini juga memiliki keuntungan bahwa C dan C ++ benar-benar bahasa terbaik untuk pemrograman sistem dan waktu kompilasi C jauh lebih cepat. Waktu kompilasi C ++ adalah yang terburuk dari semua bahasa yang saya gunakan.
Sekarang sementara ada bahasa lain yang ingin menjadi bahasa sistem yang populer di luar sana (saya tahu tentang D khususnya), sebagian besar perangkat lunak ditulis dalam C / C ++. Bahasa seperti D mengharuskan seseorang untuk membuat wrapper di sekitar pustaka C alih-alih hanya menggunakannya secara langsung (seperti yang Anda lakukan dari C ++).
sumber
extern(C)
dalam D, sedangkan dalam C ++ Anda menulisextern "C"
lihat langpop.com , terutama grafik dari Freshmeat dan Google Code. Ini menunjukkan bahwa C masih jauh di depan.
C masih populer di sistem di mana Anda harus dekat dengan logam (yaitu sistem tertanam) dan aplikasi yang haus kinerja.
sumber
Saya menggunakannya hampir setiap hari berkembang untuk iPad / iPhone. Banyak perpustakaan ditulis dalam C dan tidak memiliki setara Objective-C. Jadi ya, masih digunakan, dan oleh salah satu perangkat terbaru di pasaran.
Dengan C, Anda dapat memprogram banyak sistem tertanam, ini kecil dan praktis, dan mungkin akan ada selama bertahun-tahun yang akan datang (alias Anda tidak membuang waktu atau uang untuk mempelajarinya)
sumber
Umumnya untuk embedded system C masih banyak digunakan.
Pertanyaan ini memberikan beberapa contoh lain.
The Indeks TIOBE , yang mencoba untuk mengklasifikasikan bahasa dengan popularitas / penggunaan , secara konsisten menempatkan C di tempat pertama.
sumber
Portabilitas.
Lakukan daftar dari setiap sistem yang Anda pikir akan menjalankan kode C dan kemudian daftar serupa untuk setiap bahasa lain yang Anda suka.
Jika Anda datang dengan jawaban yang sama dengan saya maka kesimpulannya adalah ya.
sumber
Yah saya pikir C adalah bahasa yang paling kuat Karena alasan berikut!
1) AT pertama C, Ini adalah bahasa sistem (yang berarti dapat digunakan untuk melakukan pemrograman tingkat rendah dengan minimal atau tanpa run-time).
2) Kecepatan aplikasi yang dihasilkan. Kode sumber C dapat dioptimalkan lebih dari bahasa tingkat yang lebih tinggi karena set bahasa relatif kecil dan sangat efisien. Ini adalah sedekat yang Anda bisa dengan pemrograman dalam bahasa assembly, tanpa pemrograman dalam bahasa assembly. dan Anda bahkan dapat menggunakan perakitan dan C bersama!
3) C memiliki yang merupakan aplikasi dalam pemrograman Firmware (perangkat keras). Itu karena kemampuannya untuk menggunakan / bekerja dengan perakitan dan berkomunikasi langsung dengan pengontrol, prosesor dan perangkat lainnya.
4) C adalah blok bangunan untuk banyak bahasa lain yang dikenal saat ini. Lihat sejarah C dan Anda akan menemukan bahwa itu telah ada selama beberapa waktu (karena bahasa pemrograman tetap berjalan). Lihatlah Python misalnya bahasa pemrograman Tingkat Tinggi Berorientasi Objek sepenuhnya. Itu ditulis dalam C (mungkin C ++ juga). Itu memberi tahu Anda jika Anda ingin tahu apa yang terjadi di bawah tenda dalam bahasa lain; memahami C dan cara kerjanya sangat penting.
Bahasa aplikasi digunakan untuk pemrograman tingkat tinggi, misalnya menulis pengolah kata atau game. Contoh bahasa aplikasi adalah Java, C #. Alasannya adalah karena mengandung pengumpulan sampah, pengetikan otomatis, validasi run-time, dll - di mana fokusnya adalah produktivitas.
Bahasa sistem digunakan untuk pemrograman tingkat rendah. misal mikrokontroler, driver, dan kernel OS. Contohnya termasuk perakitan, C. Mereka membutuhkan sedikit atau tidak ada runtime untuk menjalankan kode secara langsung pada perangkat keras, dan fokusnya adalah bagi programmer untuk memiliki kontrol langsung atas perangkat keras.
Secara keseluruhan, ini menurun sebagai bahasa aplikasi, tetapi masih kuat sebagai bahasa sistem.
sumber
Oh ya, sudah biasa. Saya bekerja di bidang pemrosesan paket jaringan. Saya telah berada di dua perusahaan berbeda di mana kami memproses paket jaringan. Jadi, kami beroperasi pada level Ethernet atau IP, bukan pada level di atas TCP.
Menariknya, di kedua perusahaan C dipilih lebih dari C ++. Di salah satu perusahaan, salah satu dari dua produk dibangun di atas kernel Linux, sedangkan produk lainnya dibangun di ruang pengguna Linux. Produk kernel jelas menggunakan C karena kernel Linux diprogram dalam C, tetapi mereka memilih untuk menggunakan C untuk produk userspace juga. Kedua produk dikembangkan mulai dari sekitar tahun 2000 (produk kernel sedikit sebelum tahun 2000 dan produk userspace sedikit setelah tahun 2000).
Di perusahaan tempat saya pergi setelah itu, produk itu dibangun di atas C, bukan di C ++. Ini sebenarnya merupakan kelanjutan dari proyek dari pertengahan 1990-an, meskipun karena tuntutan peningkatan kinerja baru-baru ini, diputuskan bahwa pada dasarnya semuanya akan ditulis ulang. Kami memiliki opsi untuk memilih C ++ karena penulisan ulang ini, tetapi tidak melakukannya.
Di bidang pemrosesan paket jaringan, kinerja sangat penting. Jadi, saya ingin mengimplementasikan tabel hash saya sendiri yang memiliki kinerja lebih tinggi dari tabel hash yang ada. Saya, bukan penulis tabel hash, saya yang memilih fungsi hash apa yang akan digunakan. Mungkin saya ingin kinerja dan menggunakan MurMurHash3 . Mungkin saya menginginkan keamanan dan mencari SipHash . Pengalokasi memori jelas khusus. Faktanya, semua struktur data penting yang kami gunakan telah diimplementasikan secara kustom untuk kinerja setinggi mungkin.
Meskipun tidak ada yang akan mencegah penggunaan C ++, itu biasanya ide yang buruk. Satu pengecualian yang dilemparkan per paket akan menurunkan tingkat pemrosesan paket ke level yang tidak dapat diterima! Jadi, kita tidak bisa menggunakan pengecualian C ++. Terlalu lambat. Kami sudah menggunakan semacam kode berorientasi objek C dengan mengimplementasikan struktur data sebagai struct dan kemudian mengimplementasikan fungsi yang beroperasi pada struct tersebut. C ++ akan memungkinkan memiliki fungsi virtual, tetapi sekali lagi panggilan fungsi virtual akan mematikan kinerja jika digunakan di mana-mana. Jadi, lebih baik untuk menjadi eksplisit dan memiliki pointer fungsi jika panggilan fungsi virtual diperlukan.
C ++ akan melakukan banyak hal di belakang Anda: alokasi memori, dll. Di sisi lain, dalam C yang biasanya tidak terjadi. Anda dapat menulis fungsi yang mengalokasikan memori, tetapi biasanya terlihat dari antarmuka fungsi yang terjadi alokasi.
Sebagai contoh jenis optimasi mikro yang dapat Anda lakukan saat memprogram dalam C, lihat makro container_of di kernel Linux. Tentu, Anda bisa menggunakan container_of dalam kode C ++, tetapi siapa yang melakukannya? Maksud saya, ini sepenuhnya dapat diterima di sebagian besar program C, tetapi umumnya programmer C ++ akan segera mengusulkan sesuatu yang lain, seperti daftar tertaut yang mengalokasikan node tautan sebagai blok terpisah. Kami tidak ingin itu karena setiap blok memori yang dialokasikan buruk untuk kinerja.
Mungkin satu-satunya hal yang akan menguntungkan kita di C ++ adalah bahwa C ++ memungkinkan metaprogramming template, yang berarti Anda kadang-kadang dapat menghindari panggilan fungsi virtual sementara masih memiliki parameter fungsi, dan memungkinkan kompiler untuk inline fungsi. Tetapi metaprogramming template itu rumit, dan kami telah berhasil memenuhi semua persyaratan dalam C, jadi manfaat fitur ini di C ++ tidak terlalu kritis.
Di salah satu perusahaan, kami benar-benar memiliki bahasa yang dikompilasi khusus di mana bagian dari fitur diimplementasikan. Tebak yang merupakan bahasa target dari kompiler? Majelis? Tidak, kami harus mendukung arsitektur 32-bit dan 64-bit. C ++? Tentunya Anda bercanda. Jelas, itu adalah C dengan goto yang dihitung GCC . Jadi, bahasa khusus dikompilasi ke C (atau sebenarnya varian gcc dari C yang mendukung komputasi goto), dan kompiler C menghasilkan perakitan.
sumber
Saya masih menggunakan C setiap hari dan salah satu alasan utama adalah karena interop dengan bahasa lain dan SDK dirancang untuk digunakan oleh plugin yang dibuat oleh semua jenis kompiler dalam berbagai bahasa.
Saya tidak dapat menulis C ++ API yang menggunakan kelas dengan konstruktor dan destruktor dan vtables, fungsi yang berlebihan, melempar pengecualian, dll. Yang dapat digunakan dari Lua, C #, Python, C, dll. Apalagi plugin C ++ ditulis menggunakan kompiler yang berbeda dan pengaturan dari kita sendiri.
Saya tidak bisa menulis C # SDK yang bisa dipanggil dari Python, misalnya, atau SDK Python yang bisa dipanggil dari C #.
C adalah satu-satunya bahasa di sini yang memungkinkan saya untuk membuat API yang dapat dipanggil dari salah satu bahasa ini. Yang mengatakan saya sering menggunakan C ++ untuk mengimplementasikan antarmuka C ini (meskipun saya kadang-kadang hanya mengimplementasikannya dalam C).
Selain itu, saya kadang-kadang menemukan bahasa C paling mudah untuk bekerja dengan hal-hal seperti struktur data tingkat rendah dan pengalokasi memori. Semua keamanan tipe tambahan yang Anda peroleh di C ++ tidak membantu jika Anda menulis pengalokasi memori yang dirancang untuk menyatukan bit dan byte yang disejajarkan. Dan terhadap sistem tipe C ++ yang kaya dan penanganan pengecualian, tidak mudah untuk menggulung struktur data Anda sendiri - lihat saja berapa banyak upaya yang diperlukan untuk menulis struktur data sepele seolah-
std::vector
olah Anda ingin menjadikannya pengecualian-aman dan menghindari memohon ctors dan dtors pada elemen yang tidak Anda sisipkan ke wadah (saya berbicara sebagai orang yang telah menerapkan seluruh pustaka standar C ++). Ketika susunan yang dapat ditanami sangat sulit untuk diimplementasikan dengan baik, maka bayangkan pekerjaan yang diperlukan untuk mengimplementasikan BVH berkualitas-produksi.Saya lebih suka C ++ daripada C ketika saya ingin menggunakan struktur data yang ada atau menerapkan yang tingkat tinggi dengan menggunakan yang sudah ada, tetapi jika saya akan menerapkan struktur data tingkat rendah pada inti mesin yang tidak digunakan untuk struktur data yang ada, C pasti membuat itu jauh lebih mudah untuk dilakukan dengan sistem tipe sederhana yang memungkinkan Anda hanya melakukan
memcpy
hal - hal di sini danmemmove
hal - hal di sana,malloc
blok yang berdekatan dan direalloc
sana, tanpa khawatir tentang konstruktor, destruktor, dan pengecualian yang dilemparkan.sumber