Apakah bahasa pemrograman C masih digunakan?

96

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?

Monomeeth
sumber
46
Pernahkah Anda melihat kompiler C ++ untuk PIC?
SK-logic
195
Apakah saya satu-satunya yang sedih bahwa seseorang akan menyamakan belajar dengan membuang-buang waktu dan uang?
Jetti
37
" Setahu saya, semua pengembangan yang terkait dengan COM dan desain perangkat keras juga dilakukan dalam C ++ " - Kedengarannya bagi saya sepertinya Anda tidak benar-benar melakukan desain antarmuka perangkat keras.
Ed S.
32
Orang-orang lupa bahwa bahasa tingkat tinggi mewah yang kita semua cintai sering diterapkan dalam C.
David Cowden
13
@ThomasEding Bahasa Mati? Anda tentu memiliki pengetahuan yang sangat terbatas tentang bahasa pemrograman jika Anda menganggap C sebagai bahasa mati.
JesperE

Jawaban:

214

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 .

sbi
sumber
16
Itu lebih dari sekadar sejarah. Banyak dari apa yang Anda anggap paket sumber terbuka "inti" pada awalnya dikembangkan ketika C ++ tidak tersedia secara luas seperti sekarang dan sumber daya masih langka.
Blrfl
65
Indeks TIOBE adalah lelucon. Hit mesin pencari tidak ada artinya.
DeadMG
29
@Sedate: Templat yang umumnya menyebabkan kode mengasapi adalah mitos, berasal dari zaman kompiler C ++ kuno. Kompiler modern akan melipat contoh template yang identik. OTOH, templat memungkinkan templat meta-pemrograman, yang mengeksekusi kode pada waktu kompilasi, bukan pada waktu berjalan, menghasilkan lebih sedikit kode yang dihasilkan. Selain itu, mereka membuat program yang jauh lebih aman (lebih sedikit casting), sesuatu yang sering sangat penting dalam domain tertanam. EC ++ telah dihancurkan sampai mati oleh para ahli C ++ atas (antara lain) kebodohan belaka membuang templat.
sbi
18
@ James: Maksud Anda hal-hal seperti abstraksi yang efisien, pemrograman generik, dan keamanan jenis? Ya, siapa yang mau itu.
Xeo
11
@JesperE Seperti yang terjadi, saya telah berganti pekerjaan sejak saya menulis itu, dan saya sekarang pemrograman untuk perangkat yang tertanam. Kami menggunakan C ++, dan luar biasa apa yang dapat dilakukan oleh STL dan template-pemrograman untuk Anda ketika Anda memiliki perangkat keras yang lemah dan kendala waktu nyata yang sulit serta kebutuhan keandalan. (. Kami melakukan pembangkit listrik) Ya, Anda harus tahu apakah Anda harus menggunakan std::vectoratau std::mapuntuk 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.
sbi
119

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 .

Joonas Pulakka
sumber
14
Saya pikir sebagian besar kernel Windows juga C. Dan banyak sistem warisan.
Coder
14
Agar lengkap, Linus mencoba melakukan C ++ di kernel. Itu lebih merupakan masalah daripada nilai tambah. Bagaimanapun, pengembangan kernel adalah topik yang sangat spesifik, itu tidak berarti C ++ buruk secara umum.
deadalnix
75
Menurut yang lain , argumentasi Linus mengerikan.
sbi
36
Argumen Linus mungkin atau mungkin tidak valid, tetapi kernel Linux masih ditulis dalam plain C :-)
Joonas Pulakka
15
Linus adalah seorang git.
ubiyubix
94

Semua bahasa modern yang saya lihat dapat berinteraksi dengan C:

  • C ++
  • Jawa
  • C #
  • Python
  • Haskell
  • Tujuan C

Kebutuhan untuk berinteraksi dengan C berasal dari:

  • C memiliki ABI sederhana
  • C berada di sekitar untuk waktu yang lama

Ini berarti karena bahasa-bahasa tersebut dapat berkomunikasi dengan C, mereka dapat:

  • memanfaatkan perpustakaannya
  • berkomunikasi satu sama lain melalui C (misalnya, Dentang ditulis dalam C ++ tetapi menawarkan Python Bindings terhubung pada antarmuka C-nya).

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.

Matthieu M.
sumber
45

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

  • C #: 209845
  • 16 tag lainnya
  • C: 38790

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

Loki Astari
sumber
1
Jawaban ini membingungkan saya ... Anda melanjutkan tentang C # dan kemudian menunjukkan tag pertanyaan SO tetapi tidak ada yang benar-benar ada hubungannya dengan C yang digunakan. Popularitas (terutama di langpop, tempat mereka menggunakan kueri mesin pencari untuk menentukan popularitas) tidak benar-benar menunjukkan penggunaan bahasa modern, hanya pencarian modern pada suatu bahasa. Anda harus memperhitungkan, untuk pencarian, bahwa C sering digunakan di Universitas untuk kelas tingkat bawah sehingga dapat meningkatkan jumlah kueri dan juga posting SO.
Jetti
3
@Jetti: Itulah mengapa saya secara eksplisit mengatakan: I am sure none of this is authoritative but we can use it to see trendsTapi 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.
Martin York
Melihat ke belakang, sepertinya ada pilihan kata yang buruk di pihak saya. Saya tidak bermaksud kelas angka rendah (kelas awal), maksud saya kelas sistem (arsitektur komputer) adalah tempat C digunakan.
Jetti
4
Hitungan tag SO tidak menentukan popularitas bahasa secara umum, ini hanya menunjukkan popularitas bahasa di antara pengguna SO .
Ed S.
4
@ Id S. Jelas. Tetapi pertanyaannya bukan tentang popularitas. Ini tentang keberadaan C sebagai bahasa. Hitungan tag SO menunjukkan kepada kita bahwa itu jelas bukan bahasa mati. Fakta bahwa C berada di 2 teratas di situs lain tidak menjadikannya bahasa pertama / kedua yang paling banyak digunakan. Namun keberadaannya di 10 besar adalah penanda signifikan bahwa ia tidak mati. Tentu saja tidak satu pun dari hal ini yang membuktikan hanya indikator kuat bahwa C masih aktif digunakan.
Martin York
23

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.

Jose Faeti
sumber
4
ahem !! itu poin yang bagus. Saya tidak pernah berpikir bahwa "kemampuan OOP sebenarnya menambah overhead untuk bahasa". Terima kasih telah menjelaskan poin yang valid ini. Sekarang, saya bisa mengerti, di mana C berada di depan yang lain
Pankaj Upadhyay
7
@ Pankaj C ++ umumnya tidak selalu menambahkan banyak waktu overhead, banyak kompleksitas bahasa adalah prinsip "tidak membayar untuk apa yang tidak Anda gunakan" - jika Anda tidak menggunakan pengecualian maka pengecualian tidak memperlambat atau menambah ukuran kode Anda. Kompilernya lebih besar dan lebih kompleks
Martin Beckett
2
ada C di bidang yang disematkan, lihat juga pertanyaan dan jawaban ini: programmers.stackexchange.com/questions/84514/…
tcrosley
6
Anda tidak pernah benar - benar membutuhkan kemampuan OOP, itu hanya berfungsi dengan baik dalam beberapa skenario.
Ed S.
2
@ Jose Faeti: Bos saya akan setuju karena bos saya adalah pria yang berpengalaman dan rasional. Dia tidak setuju dengan agama pemrograman.
Ed S.
20

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.

GonzoKnight
sumber
7
C adalah himpunan bagian dari C ++ , Apakah itu yang Anda maksudkan ?? . C bukan Subset dari C ++; Infact mereka sangat berbeda. Ya, C ++ adalah perangkat tambahan dari C, atau kadang-kadang disebut sebagai C dengan kelas dan OOP , tetapi untuk mengatakan C adalah bagian, tidak membenarkan
Pankaj Upadhyay
7
C ++ sebagian besar merupakan superset dari versi lama C, dan C sudah berada pada arah yang agak berbeda sejak saat itu. Beberapa aspek dari bahasa telah pergi ke arah yang sebagian besar paralel, tetapi yang lain tidak (dan C ++ memiliki banyak hal lain di samping).
Donal Fellows
Saya setuju dalam pemungutan suara untuk klarifikasi fakta itu, tidak semua program C yang valid adalah program C ++ yang valid, yaitu C ++ bukan superset dari C. Namun, ini adalah superset tentang bagaimana C pada saat membuat keputusan untuk menjadi sebuah superset, seperti yang disebutkan oleh Donal Fellows. Sama sekali tidak masuk akal untuk mengatakan bahwa itu lagi, ketika itu tidak lagi benar.
Joshua Hedges
16

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

jsternberg
sumber
D dapat memanggil kode C secara langsung, sama seperti C ++. Yang Anda butuhkan hanyalah prototipe fungsi (sekali lagi, sama seperti C ++). Anda hanya menulis extern(C)dalam D, sedangkan dalam C ++ Anda menulisextern "C"
Peter Alexander
@ Peter Alexander Saya tahu extern (C) di D. Itulah yang saya maksud ketika saya mengatakan file wrapper. Anda tidak dapat secara langsung memasukkan header C (yang dapat Anda lakukan dalam C ++, dengan asumsi header C menggunakan extern "C" dan memiliki blok #ifdef __cplusplus, yang kebanyakan dilakukan). Lalu ada ketidakcocokan lain di antara hanya menggunakan extern (C) (terutama bagaimana string ditangani. Setahu saya, mereka tidak memiliki terminator nol di D. Jadi Anda harus secara khusus mengubah array ketika meneruskannya ke C).
jsternberg
11

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.

tehnyit
sumber
4
JANGAN BUKA URL ini! Situs web tidak ada lagi dan URL diarahkan ke beberapa halaman spam yang mengganggu.
Nikolay Suvandzhiev
11

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)

Valentin Radu
sumber
2
"Objective-C masih muda" sebenarnya dari pertengahan 1980-an, sekitar setua C ++. Namun, sebagian besar orang yang menggunakannya tidak menemukannya sampai tahun 2007.
Benar, apa yang ingin saya katakan pada dasarnya adalah bahwa ada banyak perpustakaan C yang tidak memiliki padanan dalam Objective-C untuk iOS. Memang bahasa itu sendiri, tidak muda sama sekali (diperiksa dengan Wiki). Terima kasih telah menunjukkannya.
Valentin Radu
7

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.

Xavier T.
sumber
Posisi Kedua (setelah Jawa).
Martin York
7
Menarik bahwa C ++ dan Java keduanya cenderung tren menurun dalam popularitas selama 10 tahun terakhir, sementara C tetap lebih atau kurang statis.
Paul R
7

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.

tidbeck
sumber
5

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.

niko
sumber
1

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.

ahli hukum agama
sumber
0

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::vectorolah 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 memcpyhal - hal di sini dan memmovehal - hal di sana, mallocblok yang berdekatan dan di reallocsana, tanpa khawatir tentang konstruktor, destruktor, dan pengecualian yang dilemparkan.

user204677
sumber