Saat ini saya sedang belajar teknik di Telekomunikasi dan Elektronik dan kami telah bermigrasi dari assembler ke C dalam pemrograman mikroprosesor. Saya ragu bahwa ini adalah ide yang bagus. Apa saja kelebihan dan kekurangan C dibandingkan dengan perakitan?
Keuntungan / kerugian yang saya lihat adalah:
Keuntungan:
- Saya dapat mengatakan bahwa sintaks C jauh lebih mudah dipelajari daripada sintaks Assembler.
- C lebih mudah digunakan untuk membuat program yang lebih kompleks.
- Belajar C entah bagaimana lebih produktif daripada belajar assembler karena ada lebih banyak hal yang berkembang di sekitar C daripada Assembler.
Kekurangan:
- Assembler adalah bahasa pemrograman level lebih rendah dari C, jadi ini membuatnya bagus untuk pemrograman langsung ke perangkat keras.
- Jauh lebih fleksibel menyinggung Anda untuk bekerja dengan memori, interupsi, register-mikro, dll.
Jawaban:
Berikut adalah beberapa jawaban stack overflow yang dapat membantu Anda (ini adalah respons teratas, jawaban yang diterima):
Keuntungan
/programming/143561/is-there-a-need-to-use-assembly-these-days (hanya untuk pengguna 10K), atau Arsip
Kekurangan
/programming/2684364/why-arent-programs-written-in-assembly-more-often
Contoh
Posting terakhir di bawah ini adalah posting Stack Overflow yang menguraikan skenario yang akan menunjukkan contoh perakitan yang lebih cepat dari C (saat melakukan fungsi yang sama).
/programming/577554/when-is-assembler-faster-than-c
sumber
C lebih mudah diprogram, dibandingkan dengan Assembly. Ada alasan yang jelas tidak layak untuk diulang.
Menjadi lebih mudah digunakan, C memungkinkan Anda untuk menulis program lebih cepat. Secara umum, program-program ini juga lebih mudah di-debug dan lebih mudah dirawat. Selain itu, lebih mudah untuk mengelola program besar dan kompleks di C.
Seringkali, kode yang dihasilkan oleh kompiler sama baiknya (dalam hal kecepatan dan efisiensi) seperti assembler yang ditulis tangan - jika tidak lebih baik.
C sangat rendah levelnya, dan jarang Anda ingin turun jauh lebih rendah. Memiliki lapisan abstraksi tambahan jarang merupakan hal yang buruk.
Ketika Anda perlu menurunkan, Anda dapat menggunakan Majelis, jika tidak Anda dapat menggunakan C.
Anda dapat menulis Majelis dalam kode-C, tetapi bukan C dalam kode-Majelis.
sumber
Program AC dapat dikompilasi ke arsitektur mikroprosesor yang berbeda.
sumber
Jangan takut, tidak ada yang mengembangkan program baru di assembler 100% lagi. Saat ini, C dapat digunakan bahkan untuk arsitektur 8-bit paling kecil dan paling jelek. Namun , mengetahui assembler membuat Anda seorang programmer C yang jauh lebih baik. Juga, selalu ada beberapa detail kecil dalam suatu program yang perlu ditulis dalam assembler.
Ya sintaks lebih mudah, tentu saja. Namun, mempelajari seluruh bahasa C dengan semua detail yang mengganggu jauh lebih kompleks daripada mempelajari semua detail assembler tertentu. C adalah bahasa yang jauh lebih besar dan lebih luas. Tetapi sekali lagi, Anda mungkin tidak perlu mempelajari semua detailnya.
Memang, C menyediakan mekanisme untuk desain program modular, seperti enkapsulasi dan lingkup lokal / variabel lokal. Dan C memiliki perpustakaan standar, ditambah sejumlah besar sumber daya yang ditulis selama 30 tahun terakhir. Dan yang paling penting, C itu portabel.
C memiliki banyak fungsi, perpustakaan, dan sumber daya yang sudah dibuat sebelumnya, sehingga akan ada sedikit penemuan kembali roda. Namun terlepas dari itu, pernyataan Anda bersifat subyektif. Saya percaya ini masalah pilihan pribadi.
Sebagai contoh, saya adalah seorang programmer C yang berpengalaman, terkadang pemrograman C ++. Saya menemukan diri saya jauh kurang produktif dalam C ++, karena saya tidak tahu bahasa itu juga saya tahu C. Tapi hanya karena saya merasa seperti itu, itu tidak selalu berarti bahwa pemrograman dalam C lebih produktif daripada pemrograman dalam C ++. Seorang programmer C ++ berpengalaman pasti akan memiliki pendapat yang berlawanan.
Dan ada banyak aspek untuk "produktif". Aspek yang sangat penting adalah waktu pemeliharaan, dan terutama waktu yang diperlukan untuk memperbaiki bug yang disebabkan oleh pemeliharaan. C jauh lebih mudah dirawat daripada assembler.
Pemrograman perangkat keras dapat dilakukan secara langsung dalam bahasa apa pun. Satu-satunya hal yang tidak dapat Anda lakukan di C adalah mengakses penunjuk tumpukan dan register kondisi dll, dari inti CPU itu sendiri. Jadi jika dengan pemrograman perangkat keras yang Anda maksud berbicara dengan CPU Anda sendiri, maka ya, assembler memungkinkan sedikit lebih banyak daripada C. Jika Anda maksud mengakses perangkat keras eksternal, maka assembler tidak memiliki kelebihan dibandingkan C. Tetapi mungkin kerugiannya, karena seringkali lebih sulit untuk menulis kode assembler generik untuk perangkat eksternal tertentu, daripada kode C generik.
Ini tidak benar. C memungkinkan Anda untuk melakukan semua itu juga, walaupun Anda mungkin harus bergantung pada kode C khusus-kompiler seperti kata kunci interrupt.
Pada akhirnya, Anda perlu mengetahui kedua bahasa untuk memprogram MCU, dengan penekanan pada C.
sumber
a = b[i] + c;
jauh lebih rumit daripada instruksi untuk memuatb[i]
(yang mengambil perhitungan) danc
ke register (yang harus disediakan), menambah, dan menyimpan.Tergantung pada seberapa tertanam Anda harus pergi, C akan menghasilkan program besar dan lambat. Yang jelas akan meningkatkan biaya porsi produk itu. Ini mungkin merupakan penurunan di lautan untuk keseluruhan produk atau secara radikal mengubah produk. Ya, beberapa orang mungkin mengatakan bahwa pengembangan perangkat lunak dan upaya pemeliharaan lebih murah, lagi yang bisa benar atau salah, jika itu tertanam dalam dan bertujuan untuk bagian yang berdaya rendah, kecil, dan murah Anda tidak berbicara tentang banyak kode. Kode itu sebagian besar khusus untuk vendor itu atau chip tertentu sehingga berada di C tidak memiliki manfaat portabilitas, Anda harus menulis ulang untuk setiap target. Dengan seri cortex-m dari ARM, kami baru saja mulai dapat membuat C bersaing dengan asm, bukan berarti orang tidak pernah menggunakan C atau bahasa tingkat tinggi lainnya dalam produk yang disematkan,
Debat C vs ASM, secara profesional, selalu bermuara untuk menuliskannya dalam C dan menggunakan ASM di mana Anda dapat membenarkannya. Dan Anda bisa membenarkannya. Di dunia yang tertanam ada kinerja dan ukuran.
Anda harus memasukkan target dalam diskusi ini. Meskipun banyak yang telah menggunakan C dengan Microchip (foto yang lebih lama, bukan pic32 yang merupakan mips) dengan biaya besar, itu adalah set instruksi yang mengerikan untuk kompiler, set instruksi yang sangat mendidik dan menarik tetapi kompiler tidak ramah. msp430, avr, lengan, ibu jari, mips, semua bagus untuk kompiler. 8051 juga buruk.
Bahkan lebih dari alat bahasa. Terutama dalam kasus-kasus di mana khawatir tentang pengembangan dan manajemen kode adalah argumen, Anda perlu alat untuk berada di sana hari ini dan besok. Memiliki alat sumber tunggal, bahkan termasuk mod gcc tunggal, yang dikelola oleh satu kelompok, berisiko dari perspektif bisnis. Anda mungkin menemukan lebih dari satu assembler, dan siapa pun yang layak menjadi anggota tim itu dapat menyiapkan assembler di akhir pekan (selama majelis yang Anda tulis bukanlah arahan jagoan ghee dan arahan makro senang). Untuk asm dan C Anda tentu ingin menggunakan alat open source (atau alat rumah Anda sendiri) di mana Anda memiliki peluang yang lebih baik, bahkan jika itu berarti menggunakan mesin virtual untuk menjalankan distro linux berusia 10 tahun, karena memiliki alat yang tersedia untuk kehidupan produk.
Intinya, sekali lagi, gunakan / pelajari / ajarkan baik C dan asm, mulailah dengan C dan gunakan asm di mana Anda dapat membenarkannya.
sumber
Untuk perakitan ada kompromi yang tak terhindarkan antara pemeliharaan kode dan kinerja. Anda dapat menulis perakitan yang mudah dibaca / dikelola, atau Anda dapat menulis kode yang sangat dioptimalkan; tapi kamu tidak bisa melakukan keduanya.
Untuk C, kompromi tidak hilang begitu saja, tetapi jauh lebih tidak terlihat - Anda dapat menulis yang mudah dibaca / dikelola C yang dioptimalkan dengan cukup baik.
Programmer bahasa assembly yang sangat baik akan mampu mengalahkan kompiler hampir sepanjang waktu, tetapi sebagian besar waktu mereka dengan sengaja akan memilih untuk menulis kode yang mudah dibaca / dikelola; dan karenanya programmer bahasa assembly yang bagus akan dikalahkan oleh kompiler sebagian besar waktu.
Cara cerdas adalah dengan menggunakan rakitan dan C (alih-alih hanya rakitan atau hanya C) - mis. Gunakan C untuk bagian kode di mana programmer bahasa rakitan yang hebat akan memilih untuk menulis kode yang dapat dipertahankan / lambat, dan menggunakan rakitan untuk sisanya (di mana "sangat dioptimalkan dan sulit untuk dipelihara" sebenarnya dibenarkan).
sumber
sumber