Hampir setiap orang sekarang akan mengucapkan berkat:
kinerja !
Oke, C memang memungkinkan untuk menulis kode atletik. Namun, ada bahasa lain yang bisa melakukannya! Dan kekuatan optimalisasi kompiler modern luar biasa. Apakah C memiliki beberapa kelebihan yang tidak dimiliki bahasa lain? Atau sama sekali tidak perlu untuk instrumen yang lebih fleksibel dalam domain?
programming-languages
c
embedded-systems
tanaman merambat
sumber
sumber
Jawaban:
Itu bagian dari itu; penggunaan sumber daya deterministik penting pada perangkat dengan sumber daya terbatas untuk memulai, tetapi ada alasan lain.
sumber
C dirancang untuk memodelkan CPU, karena C dibuat untuk membuat Unix portable lintas platform, bukan hanya menulis bahasa assembly.
Ini berarti bahwa program C bekerja dengan baik sebagai bahasa pemrograman untuk program yang perlu memiliki tingkat abstraksi yang sangat dekat dengan CPU yang sebenarnya, yang merupakan kasus untuk perangkat keras tertanam.
Catatan: C dirancang sekitar tahun 1970 dan CPU lebih sederhana saat itu.
sumber
Salah satu alasan dominasi adalah bahwa ia memiliki alat yang tepat untuk tugas tersebut. Setelah dikembangkan di platform tertanam di Java dan C / C ++, saya dapat memberi tahu Anda bahwa pendekatan telanjang ke tulang C ++ lebih alami. Menyelamatkan pengembang dari perasaan bahwa ia sedang melompat-lompat karena bahasa terlalu tinggi adalah hal yang cukup menjengkelkan. Salah satu contoh yang baik adalah tidak adanya variabel yang tidak ditandatangani di Jawa.
Dan fitur-fitur praktis dari VM / bahasa yang ditafsirkan biasanya tidak layak dan ditinggalkan dari implementasi, misalnya pengumpulan sampah.
sumber
C membutuhkan dukungan runtime yang sangat sedikit di dalam dan dari dirinya sendiri, sehingga overhead jauh lebih rendah. Anda tidak menghabiskan memori atau penyimpanan pada dukungan runtime, menghabiskan waktu / upaya untuk meminimalkan dukungan itu, atau harus mengizinkannya dalam desain proyek Anda.
sumber
switch
es mengerikan, dan mesin yang sama dibangun dengan hierarki kelas bagus dan dapat dipertahankan.switch
, bisa dibilang) masih digunakan di banyak aplikasi embedded. Lebih mudah di-debug, lebih mudah diverifikasi.Seperti disebutkan dalam jawaban lain, C dikembangkan pada awal tahun 1970-an untuk menggantikan bahasa assembly pada arsitektur komputer mini. Saat itu, komputer ini biasanya berharga puluhan ribu dolar, termasuk memori dan periferal.
Saat ini, Anda bisa mendapatkan daya komputer yang sama atau lebih besar dengan mikrokontroler 16-bit tertanam yang harganya empat dolar atau kurang dalam jumlah tunggal - termasuk built-in RAM dan pengontrol I / O. Mikrokontroler 32-bit harganya mungkin satu atau dua dolar lebih.
Ketika saya memprogram orang-orang kecil ini, yang merupakan apa yang saya lakukan 90% dari waktu ketika saya tidak merancang papan tempat mereka duduk, saya suka memvisualisasikan apa yang akan dilakukan prosesor. Jika saya dapat memprogram dengan cukup cepat di assembler, saya akan melakukannya.
Saya tidak ingin segala macam lapisan abstraksi. Saya sering men-debug dengan melangkah melalui daftar dissembler di layar. Jauh lebih mudah untuk melakukannya ketika Anda telah menulis program dalam C untuk memulai.
sumber
Itu tidak sepenuhnya mendominasi karena C ++ semakin banyak digunakan karena kompiler telah meningkat dan kinerja perangkat keras telah meningkat. Namun C masih sangat populer karena beberapa alasan;
Dukungan luas. Hampir setiap vendor chip menyediakan kompiler ac dan setiap kode contoh dan driver kemungkinan akan ditulis dalam c. Kompiler C ++ semakin umum, tetapi bukan sertifikat mati untuk chip yang diberikan, dan mereka sering buggier. Anda juga tahu bahwa setiap insinyur yang disematkan akan dapat bekerja di c. Ini adalah bahasa perindustrian.
Performa. Yup, Anda mengatakannya. Kinerja masih raja dan dalam lingkungan di mana rutinitas inti masih sering ditulis dalam assembler, atau setidaknya dioptimalkan dalam c dengan mengacu pada output perakitan, tidak pernah meremehkan pentingnya ini. Seringkali target yang disematkan akan berbiaya sangat rendah dan memiliki ingatan yang sangat kecil dan beberapa mips.
Ukuran. C ++ cenderung lebih besar. Tentunya apapun yang menggunakan STL akan lebih besar. Umumnya baik dari segi ukuran program dan jejak memori.
Konservatisme. Ini adalah industri yang sangat konservatif. Sebagian karena biaya kegagalan seringkali lebih tinggi dan debugging sering kurang dapat diakses, sebagian karena itu tidak perlu diubah. Untuk proyek tertanam kecil c melakukan pekerjaan dengan baik.
sumber
Untuk sistem embedded, yang paling penting adalah kinerja . Tapi seperti yang Anda katakan, mengapa C dan bukan bahasa pemain lainnya?
Banyak orang sejauh ini menyebutkan ketersediaan kompiler , tetapi tidak ada yang menyebutkan ketersediaan pengembang . Lebih banyak pengembang yang sudah tahu C daripada, katakanlah, OCaml.
Mereka adalah tiga biggies.
sumber
Perangkat lunak tertanam sangat berbeda.
Pada aplikasi desktop, abstraksi dan perpustakaan menghemat banyak waktu pengembangan. Anda memiliki kemewahan melempar pasangan lain megabita atau gigabita RAM atau sekitar 2 + GHz 64-bit core CPU pada suatu masalah, dan orang lain (pengguna) membayar untuk perangkat keras itu. Anda mungkin tidak tahu sistem apa yang akan dijalankan aplikasi.
Dalam proyek tertanam, sumber daya seringkali sangat terbatas. Dalam satu proyek saya bekerja pada (prosesor seri 17X-PIC) perangkat keras memiliki 2Kwords memori program, 8 tingkat (in-hardware) stack dan 192 byte (<0,2 kB) RAM. Pin I / O yang berbeda memiliki kemampuan yang berbeda dan Anda mengkonfigurasi perangkat keras sesuai kebutuhan dengan menulis ke register perangkat keras. Debugging melibatkan osiloskop dan penganalisis logika.
Dalam embedded, abstraksi sering menghalangi dan akan mengelola (dan biaya) sumber daya yang tidak Anda miliki. Misalnya kebanyakan sistem embedded tidak memiliki sistem file. Oven microwave adalah sistem tertanam. Pengendali mesin mobil. Beberapa sikat gigi listrik. Beberapa headphone peredam bising.
Salah satu faktor yang sangat penting bagi saya dalam mengembangkan sistem embedded adalah mengetahui dan mengendalikan apa yang diterjemahkan kode dalam hal instruksi, sumber daya, memori dan waktu eksekusi. Seringkali urutan instruksi yang tepat mengontrol mis. Waktu untuk bentuk gelombang antarmuka perangkat keras.
Abstraksi dan 'sihir' di belakang layar (mis. Pengumpul sampah) sangat bagus untuk aplikasi desktop. Pengumpul sampah menghemat BANYAK waktu untuk mengejar kebocoran memori, ketika memori dialokasikan secara dinamis.
Namun di dunia embedded real-time kita perlu tahu dan mengontrol berapa lama, kadang-kadang hingga nanodetik, dan tidak bisa melempar beberapa MB RAM atau CPU yang lebih cepat pada suatu masalah. Salah satu contoh sederhana: ketika melakukan peredupan perangkat lunak LED dengan mengendalikan siklus tugas (CPU hanya memiliki kontrol on / off LED), itu TIDAK OK untuk prosesor untuk pergi dan melakukan mis pengumpulan sampah selama 100 ms karena tampilan akan terlihat flash terang atau keluar.
Contoh yang lebih hipotetis adalah pengontrol mesin yang langsung menyalakan busi. Jika CPU itu mati dan melakukan pengumpulan sampah selama 50 ms, mesin akan berhenti sejenak atau menembak pada posisi poros engkol yang salah, berpotensi mematikan mesin (saat lewat?) Atau merusaknya secara mekanis. Anda bisa membuat seseorang terbunuh.
sumber