Pada halaman Wikipedia untuk Windows , dinyatakan bahwa Windows ditulis dalam Assembly untuk bootloader dan pengalih tugas, dan C dan C ++ untuk rutinitas kernel.
IIRC, Anda dapat memanggil fungsi C ++ dari extern "C"
blok d. Saya bisa menggunakan C untuk fungsi kernel sehingga aplikasi C murni dapat menggunakannya (suka printf
dan semacamnya), tetapi jika mereka hanya bisa dibungkus dengan extern "C "
blok, lalu mengapa kode dalam C?
c++
c
language-choice
kernel
Cole Johnson
sumber
sumber
this
variabelJawaban:
Sebagian besar karena alasan historis. Beberapa bagian dari kernel windows awalnya ditulis dalam C, karena 1983, lebih dari tiga dekade lalu, ketika Windows 1.0 dilepaskan , C ++ hampir tidak dirilis. Sekarang perpustakaan-C ini akan tetap di sana "selamanya", karena Microsoft membuat kompatibilitas mundur sebagai titik penjualan dan menulis ulang versi yang kompatibel dengan bug dari C-parts di C ++ memerlukan banyak sekali usaha tanpa manfaat yang efektif.
sumber
Seperti yang telah ditunjukkan oleh kebanyakan orang, alasannya sejauh ini historis, tetapi ada hal lain yang tidak disebutkan dan saya percaya itu adalah alasan orang masih menulis kode C untuk level rendah.
C adalah bahasa kecil dalam arti bahwa speknya (relatif) pendek. C ++ sangat besar dan itu meremehkan. Ini mungkin tidak terlalu menjadi masalah bagi programmer (walaupun saya pikir memang demikian), tetapi ini sangat penting jika Anda ingin melakukan verifikasi formal . Selain itu, ada alat yang sudah mapan untuk analisis kode C, yang dapat membantu mencegah bug, dll.
Dan ini sangat penting dalam perangkat lunak tertanam, di mana biaya bug yang digunakan sangat tinggi, relatif terhadap industri lainnya (bandingkan Web, di mana Anda dapat menerapkan tambalan segera ke semua pengguna). Belum lagi perangkat lunak yang sangat penting dan hal-hal medis.
Ada upaya untuk menggeser C dari posisi dominannya dalam pemrograman tingkat rendah dengan bahasa yang bahkan lebih baik, seperti BitC, tetapi sejauh ini mereka belum berhasil.
sumber
sumber
Alasannya tidak teknis. Sedikit perakitan tidak bisa dihindari, tetapi mereka tidak dipaksa untuk menggunakan C sesekali, yang mereka inginkan . Perusahaan saya menggunakan kernel miliknya sendiri, yang ditulis hampir seluruhnya dalam C ++, tetapi kami tidak perlu mendukung antarmuka C ke kernel seperti kebanyakan orang lain, karena kernel tertanam kami secara monolitik dikompilasi dengan aplikasi C ++ kami. Saat Anda memiliki antarmuka C, seringkali lebih mudah untuk menulis kode antarmuka dalam C, meskipun mungkin untuk menggunakannya
extern "C"
untuk menulisnya dalam C ++.Bahkan kami memiliki segelintir file C, sebagian besar karena kode pihak ketiga. Kode tingkat rendah pihak ketiga hampir selalu disediakan dalam C, karena jauh lebih mudah untuk memasukkan kode C ke dalam aplikasi C ++ daripada sebaliknya.
sumber
Pengembang kernel seringkali adalah tipe orang, yang merasa lebih bahagia, ketika langsung terbukti dari sumbernya, apa yang sebenarnya dilakukan oleh kode.
C ++ memiliki lebih banyak fitur, yang menyembunyikan apa yang kode lakukan lebih dari sekadar kode C menyembunyikannya: overload, metode virtual, templat, referensi, lemparan ... C ++ juga memiliki lebih banyak sintaks yang harus Anda kuasai untuk bahkan memahami C ++ kode menggunakannya.
Saya pikir kekuatan C ++ adalah alat yang sangat kuat untuk membuat perpustakaan dan kerangka kerja, yang kemudian membuat pengembangan aplikasi menjadi mudah. Sangat sering pengembang aplikasi C ++ akan benar-benar hilang dalam jeroan template yang dipenuhi perpustakaan, bahkan ketika ia sangat kompeten dalam membuat aplikasi menggunakan perpustakaan itu. Dan menulis hak pustaka C ++ adalah tugas pemrograman yang sangat menantang, dan hanya dilakukan untuk memberikan kerangka kerja yang bagus untuk kepentingan pengembang aplikasi. Pustaka C ++ tidak secara internal sederhana, mereka (atau dapat ...) hanya kuat namun sederhana dari sudut pandang pemrogram aplikasi.
Tetapi kernel API tidak bisa menjadi C ++ API, itu harus API agnostik bahasa, jadi sebagian besar hal-hal baik di C ++ tidak akan langsung dapat digunakan di antarmuka itu. Selain itu, kernel tidak benar-benar dibagi menjadi bagian "perpustakaan" dan "aplikasi" yang dikembangkan secara independen, dengan lebih banyak upaya secara logis pergi ke satu perpustakaan, untuk membuat pembuatan aplikasi yang mudah.
Selain itu, keamanan dan stabilitas lebih penting di dalam kernel, dan metode virtual jauh lebih dinamis dan karenanya lebih sulit untuk mengisolasi dan memverifikasi, daripada panggilan balik biasa atau mekanisme C-seperti lainnya.
Singkatnya, walaupun Anda tentu saja dapat menulis program C apa pun termasuk kernel sebagai C ++, sebagian besar kekuatan C ++ tidak digunakan dengan baik di kernel. Dan banyak yang berpendapat, bahwa alat pemrograman seharusnya mencegah Anda melakukan hal-hal yang seharusnya tidak Anda lakukan. C ++ tidak mau.
sumber
Bjarne Stroustrup, dalam sebuah wawancara pada Juli 1999 :
sumber
C adalah bahasa tingkat sangat rendah, dengan desainnya. Satu langkah lagi dari assembler; mengetahui chipset yang Anda targetkan, Anda bisa, dengan sedikit pengetahuan, secara manual "mengkompilasi" C ke dalam ASM. Bahasa "dekat-ke-logam" semacam ini adalah kunci untuk optimasi tingkat tinggi (untuk kinerja, efisiensi memori, dll). Namun, karena sedekat ini dengan logam, Anda tidak mendapatkan banyak gratis dengan bahasa ini; itu adalah bahasa prosedural, non-berorientasi objek, dan dengan demikian untuk bekerja dengan konstruksi seperti itu melibatkan banyak kode boilerplate untuk membuat dan menggunakan konstruksi multi-nilai dalam memori.
C ++ adalah "C one better", menambahkan sejumlah fitur kemudahan penggunaan seperti alokasi memori dinamis, built-in struktur marshalling, perpustakaan besar kode yang telah ditentukan, dll, dengan mengorbankan beberapa kerugian efisiensi (masih jauh lebih baik dari lingkungan runtime yang dikelola). Untuk coder rata-rata, keuntungannya jauh lebih besar daripada kerugian di area basis kode yang tidak perlu kontrol anal-retribusi alokasi memori dll.
Kombinasi keduanya sangat tradisional; Anda menggunakan C untuk menulis area basis kode yang paling kritis terhadap kinerja, dan efisien-memori, yang kemudian dapat Anda gunakan dengan cara yang lebih abstrak melalui pemanggilan metode dari kode C ++, yang dapat lebih terorganisir dan dirancang dengan lebih elegan daripada pemain yang berkinerja tinggi , kode C dioptimalkan uber-oogly.
sumber
iostream
. "Terlalu lambat" tidak pernah menjadi alasan yang baik untuk menggunakan C lebih dari C ++.Bisa jadi dengan C Anda menghabiskan sebagian besar waktu Anda untuk memikirkan masalah yang ada dan bagaimana membuat kode solusinya. Dalam C ++ Anda akhirnya berpikir tentang C ++ dan segudang fitur, fungsi, dan sintaksis yang tidak jelas.
Juga di banyak toko C ++ kode Anda dipantau oleh "polisi mode" yang terpesona oleh serangkaian pola desain terbaru, atau, pernyataan terbaru yang tidak dapat dipahami dari dewa besar Stroustrup. Kode cantik menjadi lebih dihargai daripada kode kerja, menemukan penggunaan untuk set templat Boost terbaru lebih dikagumi daripada menemukan solusi kerja untuk bisnis.
Pengalaman saya adalah bahwa untuk semua fitur pintar dan kemurnian OO dari C ++, pengkodean dalam plain C membuat pekerjaan dilakukan lebih cepat dan lebih efektif.
sumber
Mungkin saja bagian-bagian C tidak mudah dibawa-bawa ke kompiler C ++ yang digunakan untuk bagian-bagian C ++. Mungkin kode C akrab dengan kompiler C dengan cara yang tidak sesuai dengan kompiler C ++.
Jika Anda memiliki kompiler C ++ berkualitas, hampir tidak ada alasan untuk mencampur C dan C ++ dalam sebuah proyek. Hampir.
Salah satu alasannya adalah bahwa proyek Anda membagikan kode C dengan proyek lain, kode tersebut tidak dikompilasi sebagai C ++, dan Anda tidak ingin mempertahankan garpu C ++ dari kode itu.
sumber
Saya pikir Anda memilikinya mundur -
extern "C"
blok memastikan bahwa konvensi pemanggilan C digunakan untuk semua fungsi di dalam blok. Jadi Anda dapat memanggil fungsi C murni dari C ++, bukan fungsi C ++ dari C. Terlepas dari itu, saya membayangkan bahwa alasan orang menggunakan C dan C ++ adalah karena banyak perpustakaan tingkat rendah ditulis menggunakan C, dan lebih mudah untuk menggunakan sesuatu yang sudah ada (dan mungkin didebug dan dioptimalkan) daripada menulis sendiri. OTOH, C ++ menawarkan banyak fitur tingkat tinggi yang bagus yang lebih disukai orang, jadi mereka menggunakannya untuk yang lain.sumber
Ada berbagai level platform tertanam yang menggunakan C sebagai bahasa pemrograman (tentu saja Anda bebas menggunakan bahasa assembly kapan saja)
Untuk 'Level' saya berbicara tentang level sumber daya SRAM dan ROM Internal untuk suatu sistem.
Platform ini terkadang dibatasi sumber daya (mis. Beberapa platform 8.051 hanya memiliki 128 byte SRAM Pengguna).
Tidak ada artinya untuk mendukung alokasi memori dinamis dengan jumlah RAM yang begitu kecil. (baru / hapus) atau bahkan malloc di C.
Salah satu peningkatan utama dari C ke C ++ adalah paradigma berorientasi objek. C ++ cocok untuk perangkat lunak dengan jejak memori yang lebih besar
tetapi tidak dalam firmware tertanam yang memiliki batasan ukuran hingga 32KB. (mis. dalam plaform MCU 16-bit)
Tidak perlu memiliki kompiler C ++ yang umumnya lebih rumit daripada kompiler C. (setidaknya penyedia SDK tidak akan repot untuk melakukan ini).
Sebenarnya saya hampir tidak dapat menemukan kompiler C ++ melalui platform ARM7 32-bit.
Itu tidak sebanding dengan kompleksitasnya
Dalam Some 8051 (8 bit): 1MB ROM, 128B RAM
TI MSP430 (16 Bit): ROM 32KB, RAM 4KB
ST Mikroelektronika ARM 32-bit Cortex ™ -M3 CPU Core (STM32F103T4): 16 atau 32 Kbytes memori Flash 6 atau 10 Kbytes SRAM
sumber
Saya melihat beberapa kemungkinan alasan:
Diedit: Ternyata, argumen ketiga tidak benar (lihat komentar).
sumber
extern "C"
).Karena C bisa dibilang bahasa yang lebih baik daripada C ++. Dan karena beberapa kode ditulis sebelum C ++ menjadi populer dan orang tidak punya alasan untuk menggantinya.
Dan karena C ++ memiliki banyak fitur yang dapat merusak kode Anda jika Anda tidak hati-hati saat menggunakannya di kernel.
sumber
[stuff] that C++ expects
. Mengapa C ++ menggunakan lebih banyak tumpukan daripada C? Mengapa C ++ membutuhkan lebih banyak dll daripada C? Simply NOT TRUE