Apa Beberapa Kelebihan / Kerugian Menggunakan C over Assembly? [Tutup]


15

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.

17
Uhm ... selamat datang di abad baru. Anda akan menyukainya di sini. Kami memiliki mikrokontroler yang menjalankan .NET , Java , Linux , dan bahkan orang yang menggunakan python untuk memprogram PIC .
ZJR

@ZJR Bagaimana Anda menggunakan Python untuk memprogram PIC? Gambar yang mana?
Detly

2
@detly Ini bukan python lengkap penuh, hanya sebagian dari inti. Lapisan sintaksis python atas fungsi pengontrol , jika Anda mau. pyastra adalah contoh pertama saya googled kembali, tapi saya agak ingat pernah membaca dokumen yang berbeda, yang juga melakukan ATMEL.
ZJR

4
Sejujurnya, dengan kompleksitas prosesor modern saya akan terkejut jika banyak programmer dapat menulis assembler yang lebih ketat dan lebih efisien daripada yang bisa dihasilkan oleh compiler C modern. Saya benci mencoba memprogram arsitektur EPIC CPU dalam assembler misalnya - Mel akan betah dengan Itanium . * 8 ')
Mark Booth

5
@ZJR Abad baru ini terdengar mengasyikkan! Saya ingin tahu, dalam bahasa apa runtime .NET, Java VM dan Linux ditulis, untuk mikrokontroler itu? Seperti bahasa apa yang digunakan pemrograman mikrokontroler sebenarnya? Oh ... C atau assembler abad ini juga ...

Jawaban:


17

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

  • Assembly digunakan pada tahap awal bootloader. Ketika kekuatan CPU pada stack tidak tersedia, dan sulit untuk menjaga kompiler C dari mencoba untuk menyimpan sesuatu ke stack. Sebagian besar bootloader tetap ditulis dalam C, setelah inisialisasi paling awal selesai.
  • Majelis digunakan untuk menulis primitif penguncian mutex. Pada dasarnya tidak mungkin untuk mendapatkan kompiler C untuk memancarkan instruksi penghalang memori di tempat yang diperlukan.
  • Rutinitas seperti memset () atau memcpy () sering dilakukan dalam perakitan. Sebagai contoh, saya menulis memset () dengan loop terbuka yang besar, yang secara dinamis menghitung alamat cabang untuk melompat ke tengah loop untuk satu iterasi terakhir. AC rutin akan menghasilkan lebih banyak kode, mengambil I $ misses ekstra. Demikian juga, set instruksi CPU sering menyertakan cache line load atau instruksi lain yang secara dramatis dapat mempercepat memcpy (), yang tidak akan digunakan oleh kompiler C.

Kekurangan

/programming/2684364/why-arent-programs-written-in-assembly-more-often

  • ASM memiliki keterbacaan yang buruk dan tidak dapat dipertahankan dibandingkan dengan bahasa tingkat yang lebih tinggi.
  • Juga, ada lebih sedikit pengembang ASM daripada bahasa lain yang lebih populer, seperti C.
  • Selain itu, jika Anda menggunakan bahasa tingkat yang lebih tinggi dan instruksi ASM baru tersedia (misalnya SSE), Anda hanya perlu memperbarui kompiler Anda dan kode lama Anda dapat dengan mudah menggunakan instruksi baru.

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


20
  • 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.


6
Saya akan mengatakan, mungkin kali Anda akan melihat kode mesin yang dioptimalkan compiler C lebih baik daripada kode perakitan tulisan tangan Anda
pengguna

@crucified - ini sudah menjadi klaim umum (dan biasanya dibenarkan) di pertengahan hingga akhir 90-an. Kompiler menerapkan optimisasi secara andal dan sistematis - tidak hanya ketika ia memperhatikan peluang.
Steve314

15

Program AC dapat dikompilasi ke arsitektur mikroprosesor yang berbeda.


4

kami telah bermigrasi dari assembler ke C dalam pemrograman mikroprosesor. Saya ragu bahwa ini adalah ide yang bagus

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.

Saya dapat mengatakan bahwa sintaks C jauh lebih mudah dipelajari daripada sintaks 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.

C lebih mudah digunakan untuk membuat program yang lebih kompleks.

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.

Belajar C entah bagaimana lebih produktif daripada belajar assembler karena ada lebih banyak hal yang berkembang di sekitar C daripada Assembler.

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.

Assembler adalah bahasa pemrograman level lebih rendah dari C, jadi ini membuatnya bagus untuk pemrograman langsung ke perangkat keras.

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.

Jauh lebih fleksibel menyinggung Anda untuk bekerja dengan memori, interupsi, register-mikro, dll.

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.


Dengan cara apa keseluruhan bahasa C lebih kompleks daripada beberapa bahasa mesin yang lebih misterius? Setelah melakukan keduanya, saya pikir C tanpa perpustakaan jauh lebih kompleks. Jika Anda merujuk ke Perpustakaan Standar C, Anda memerlukan sesuatu seperti itu di assembler, juga, untuk melakukan sesuatu yang bermanfaat. C mungkin bahasa yang lebih besar dan lebih luas, tetapi Anda tidak perlu mengetahuinya dengan tingkat detail yang sama. a = b[i] + c;jauh lebih rumit daripada instruksi untuk memuat b[i](yang mengambil perhitungan) dan cke register (yang harus disediakan), menambah, dan menyimpan.
David Thornley

1
@ Davidvidhorn Semakin banyak Anda belajar tentang C, semakin Anda menyadari betapa rumitnya itu. Apakah Anda tahu semua ratusan kasus perilaku yang tidak terdefinisi / tidak ditentukan / ditentukan-impl? Apakah Anda mengetahui semua aturan promosi jenis implisit secara terperinci (promosi bilangan bulat, konversi aritmatika biasa)? Semua aturan khusus dan sintaksis tentang penentu tipe? Semua berbagai bentuk array multi-dimensi statis / dinamis, termasuk pointer array (jangan bingung dengan pointer ke elemen 1 array) Semua fitur C99 dan C11? Dan seterusnya.

1
@Lundin: Yang penting tentang C adalah Anda bisa menanyakan semua pertanyaan itu dan menemukan jawaban konkret. Compiler yang memenuhi standar diminta untuk mendokumentasikan bagaimana mereka berperilaku untuk 62 (bukan "ratusan") perilaku yang didefinisikan implementasi. Kesederhanaan semata-mata Assembly menjadikannya suatu tawaran makan siang Anda sendiri, yang pada gilirannya melepaskan kompleksitas yang berhubungan dengan C ke kode Anda sendiri. Saya bisa melawan argumen Anda dengan bertanya berapa banyak perpustakaan floating-point telah ditulis dalam perakitan untuk arsitektur tertentu dan mengapa perilaku mereka ditentukan oleh implementasi.
Blrfl

1
@Lundin: 62 adalah jumlah perilaku yang ditentukan kompiler yang tercantum di bagian 4 manual GCC. Meninggalkan perpustakaan untuk membuat perbandingan apel-ke-apel karena tidak ada perpustakaan standar untuk perakitan. Persyaratan untuk mendokumentasikan adalah kalimat pertama §J.3. GCC dan beberapa kompiler komersial yang saya beli atau gunakan sejak C89 disahkan (Intel, Sun, IBM, Portland Group) dokumen, sehingga "sebagian besar" Anda yang tidak repot tidak dapat menyebut diri mereka sesuai. Berbicara tentang standar, bagaimana merakit x86 yang ditulis dengan sintaks Intel pada assembler dengan sintaks AT&T berhasil untuk Anda?
Blrfl

1
@Lundin: Mobil saya bagus, terima kasih. Kemudi, akselerator, rem, kopling, dan tangkai sinyal belok semua berada di tempat standar, memiliki perilaku standar, dan kontrol lainnya semuanya ditandai dengan jelas dengan simbol standar ISO. Semua hal yang ditentukan implementasi seperti sistem hiburan, HVAC, nav, cruise control, dll. Didokumentasikan dalam buku besar di kompartemen sarung tangan. Assembly seperti Plymouth 1973 saya: tidak ada banyak, tetapi dalam bentuk mentah itu tidak sedekat apa yang saya kendarai sekarang. Majelis adalah cara yang sama; kompleksitasnya datang dari apa yang Anda tambahkan ke dalamnya.
Blrfl

1

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.


Argumen-argumen ini terdengar kuno bagi saya. Jika Anda menggunakan kompiler modern yang ditulis dalam 10 tahun terakhir, maka saya yakin Anda akan kesulitan menulis program assembler yang jauh lebih efektif daripada program C. Kecuali mungkin, Anda menggunakan arsitektur dinosaurus berusia 30 tahun seperti PIC atau 8051, maka Anda akan memiliki program yang lambat apa pun yang Anda lakukan ...

Cukup sepele untuk memperbaiki perakitan lambat yang dihasilkan oleh gcc dan llvm paling modern. 4.x gcc menghasilkan kode lebih lambat, kurang efisien daripada seri 3.x (untuk beberapa target, setidaknya yang telah saya evaluasi, misalnya ARM). Saya pikir penting untuk menghilangkan gagasan bahwa kompiler bekerja lebih baik daripada manusia karena tidak. Dan bahkan ketika itu dilakukan, itu hanya terjadi ketika manusia tahu apa yang mereka lakukan. "kenali alat Anda" jika Anda ingin menggunakannya secara efektif. Mulailah dengan C dan gunakan ASM bila diperlukan jika Anda dapat membenarkannya ...
old_timer

Karena gcc adalah open source, itu adalah binatang aneh. Mungkin port tertentu dibuat dengan buruk. Semua optimasi kode harus dilakukan untuk platform tertentu, itu bukan tugas sepele. Akan lebih adil untuk membandingkan kinerja assembler manual versus kompiler komersial untuk platform itu.

gcc adalah multi-target sehingga ia melakukan pekerjaan yang cukup baik rata-rata tetapi bukan pekerjaan yang bagus untuk target tertentu. Dan itulah yang diharapkan. tetapi poin Anda tentang kompiler modern, 10 tahun terakhir, dll. Hanya tidak tahan, kompiler tidak menjadi lebih baik sejauh kode yang dihasilkan mereka menjadi lebih baik sejauh bahasa dan target dan fitur dengan biaya kode yang dihasilkan. Gagasan bahwa setiap kompiler modern memungkinkan kode terbaik hanya salah. Sangat benar bahwa rata - rata JAUH lebih baik daripada kode tangan assembler, sulit untuk membuat proyek yang berukuran layak dalam asm lebih baik daripada C
old_timer

itulah sebabnya kebanyakan orang mengatakan menggunakan C sampai ada masalah kemudian tangan perbaikan masalah dalam asm jika Anda dapat membenarkannya. apakah Anda benar-benar memerlukan sedikit peningkatan kinerja, apakah itu benar-benar masalah kinerja Anda, apakah Anda ingin mempertahankan kode ini dengan asm di dalamnya, akankah Anda terus memeriksa setiap kompiler masa depan untuk melihat apakah outputnya memperbaiki atau mengurangi masalah Anda ke tingkat yang dapat diterima, dll.
old_timer

1

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


-3
  1. Relatif baik untuk efisiensi pemrograman.
  2. Lebih mudah memprogram menggunakan bahasa c daripada menggunakan assembly.
  3. Bahasa C bisa lebih cepat dari bahasa assembly.
  4. Dimungkinkan untuk menulis rakitan dalam kode C tetapi tidak dalam kode rakitan.

3
hanya keuntungan ....
Kiran Sapkale

3
Ini hanya sebagian besar versi reworded dari What Are Some Kelebihan / Kerugian Menggunakan C over Assembly? ; Anda tidak menambahkan sesuatu yang baru ke diskusi di sini.
Martijn Pieters
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.