Montajda C Kullanmanın Bazı Avantajları / Dezavantajları Nelerdir? [kapalı]


15

Şu anda Telekomünikasyon ve Elektronik mühendisliği okuyorum ve mikroişlemci programlamasında montajcıdan C'ye geçtik. Bunun iyi bir fikir olduğuna dair şüphelerim var. C'nin montaj ile karşılaştırıldığında bazı avantajları ve dezavantajları nelerdir?

Gördüğüm avantajlar / dezavantajlar:

Avantajları:

  • C sözdiziminin öğrenilmesinin Assembler sözdiziminden çok daha kolay olduğunu söyleyebilirim.
  • C'nin daha karmaşık programlar yapmak için kullanımı daha kolaydır.
  • C Öğrenimi bir şekilde öğrenici montajcıdan daha verimlidir çünkü C çevresinde Assembler'dan daha fazla gelişmekte olan şeyler vardır.

Dezavantajları:

  • Assembler, C'den daha düşük seviyeli bir programlama dilidir, bu nedenle doğrudan donanıma programlama için iyi bir seçimdir.
  • Bellek, kesmeler, mikro yazmaçlar vb.İle çalışmanızla ilgili çok daha esnektir.

17
Uhm ... yeni yüzyıla hoş geldin. Burada hoşuna gidecek. .NET , Java , Linux ve hatta PIC'leri programlamak için python kullanan kişilerle çalışan mikro denetleyicilerimiz var .
ZJR

@ZJR Bir PIC programlamak için Python'u nasıl kullanırsınız? Hangi PIC?
12'de

2
@detly Tam teşekküllü bir piton değil, sadece çekirdeğin bir altkümesi. İsterseniz denetleyici işlevi üzerinde bir kat python sözdizimi . pyastra , geri döndüğüm ilk örnek, ancak ATMEL'leri de yapan farklı bir dokümanı okumayı hatırlıyorum.
ZJR

4
Dürüst olmak gerekirse, modern işlemcilerin karmaşıklığı ile, birçok programcı yine de modern bir C derleyicisinin üretebileceğinden daha sıkı, daha verimli bir montajcı yazabilirse şaşırırdım. Örneğin, montajcıda bir EPIC mimarisi CPU'yu programlamaktan nefret ederim - Mel , Itanium ile evde olacaktı . * 8 ')
Mark Booth

5
@ZJR Bu yeni yüzyıl kulağa heyecan verici geliyor! Yine de, bu mikrodenetleyiciler için .NET çalışma zamanı, Java VM ve Linux'un hangi dilde yazıldığını merak ediyorum. İçinde olduğu gibi, gerçek mikrodenetleyici programlama hangi dilde yapıldı? Oh ... C ya da montajcı bu yüzyılda ...

Yanıtlar:


17

İşte size yardımcı olabilecek bazı yığın taşma cevapları (bunlar en iyi yanıttır, kabul edilen cevaplardır):

Avantajları

/programming/143561/is-there-a-need-to-use-assembly-these-days (yalnızca 10K kullanıcıları için) veya Arşiv

  • Montaj, önyükleyicinin en erken aşamalarında kullanılır. Yığın üzerindeki CPU güçleri mevcut olmadığında ve C derleyicisinin bir şeyleri yığına kaydetmeye çalışmasını engellemek zor. Önyükleyicinin büyük kısmı yine de ilk başlatma yapıldıktan sonra C ile yazılır.
  • Montaj, muteks kilitleme ilkellerini yazmak için kullanılır. Gerekli yerlerde bellek engelleme talimatları yayınlamak için bir C derleyicisi edinmek aslında imkansızdır.
  • Memset () veya memcpy () gibi rutinler genellikle montajda yapılır. Örneğin, bir son yineleme için bu döngünün ortasına atlamak için bir şube adresini dinamik olarak hesaplayan büyük bir açılmamış döngüye sahip bir memset () yazdım. AC rutini ekstra I $ özledim alarak, daha fazla kod üretirdi. Benzer şekilde, CPU komut setleri genellikle önbellek hattı yükünü veya C derleyicisinin kullanamayacağı memcpy'yi () önemli ölçüde hızlandırabilen diğer talimatları içerir.

Dezavantajları

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

  • ASM'nin okunaksızlığı zayıftır ve üst düzey dillere kıyasla gerçekten sürdürülemez.
  • Ayrıca, C gibi diğer popüler dillerden daha az ASM geliştiricisi vardır.
  • Ayrıca, daha üst düzey bir dil kullanırsanız ve yeni ASM talimatları (örneğin SSE) kullanılabilir hale gelirse, derleyicinizi güncellemeniz yeterlidir ve eski kodunuz yeni talimatları kolayca kullanabilir.

Misal

Aşağıdaki son gönderi, (aynı işlevi gerçekleştirirken) C'den daha hızlı bir montaj örneği gösterecek bir senaryoyu özetleyen bir Stack Overflow postudur.

/programming/577554/when-is-assembler-faster-than-c


20
  • C'nin montajına göre programlanması daha kolaydır. Yeniden şekillendirilmeye değmeyecek belli nedenler var.

  • Kullanımı daha kolay olan C, programları daha hızlı yazmanıza olanak tanır. Genellikle bu programların hata ayıklaması ve bakımı daha kolaydır. Ayrıca, C'deki büyük, karmaşık programları yönetmek daha kolaydır.

  • Çoğu zaman, bir derleyici tarafından üretilen kod, elle yazılmış montajcı kadar eşittir (hız ve verimlilik açısından) - daha iyi değilse.

  • C düşük seviyeli, ve çok daha düşük gitmek isteyeceğiniz nadirdir. Ek bir soyutlama katmanına sahip olmak nadiren kötü bir şeydir.

  • Alçalmanız gerektiğinde, Assembly'yi kullanabilirsiniz, aksi takdirde C'yi kullanabilirsiniz.

  • Assembly'yi C koduna yazabilirsiniz, ancak Assembly koduna C yazamazsınız.


6
Diyelim ki, C derleyicisi optimize edilmiş makine kodunun elle yazılmış montaj kodunuzdan daha iyi olduğunu göreceksiniz
kullanıcı

@ çarmıha gerilmişti - bu zaten 90'lı yılların ortalarından sonuna kadar yaygın (ve genellikle haklı) bir iddiaydı. Bir derleyici optimizasyonları güvenilir ve sistematik bir şekilde uygular - sadece fırsatı fark ettiğinde değil.
Steve314

15

AC programı farklı mikroişlemci mimarilerine derlenebilir.


4

mikroişlemci programlamasında montajcıdan C'ye geçtik. Bunun iyi bir fikir olduğuna dair şüphelerim var

Korkma, kimse artık% 100 montajcıda yeni programlar geliştirmiyor. Günümüzde C, en küçük, en dar 8-bit mimariler için bile kullanılabilir. Bununla birlikte , bazı montajcıları bilmek sizi daha iyi bir C programcısı yapar. Ayrıca, bir programda derleyicide yazılması gereken küçük ayrıntılar da vardır.

C sözdiziminin öğrenilmesinin Assembler sözdiziminden çok daha kolay olduğunu söyleyebilirim.

Evet sözdizimi kesinlikle daha kolay. Bununla birlikte, tüm C dilini tüm can sıkıcı ayrıntılarla öğrenmek, belirli bir toplayıcının tüm ayrıntılarını öğrenmekten çok daha karmaşıktır. C çok daha büyük ve daha geniş bir dildir. Ama sonra tekrar, tüm detayları öğrenmeniz gerekmeyebilir.

C'nin daha karmaşık programlar yapmak için kullanımı daha kolaydır.

Gerçekten de C, kapsülleme ve yerel kapsamlar / yerel değişkenler gibi modüler program tasarımı için mekanizmalar sağlar. C'nin standart bir kütüphanesi ve son 30 yılda yazılmış çok büyük miktarda kaynağı var. Ve en önemlisi, C taşınabilirdir.

C Öğrenimi bir şekilde öğrenici montajcıdan daha verimlidir çünkü C çevresinde Assembler'dan daha fazla gelişmekte olan şeyler vardır.

C, önceden hazırlanmış işlevselliğe, kitaplıklara ve kaynaklara sahiptir, bu nedenle tekerleğin yeniden icat edilmesi daha az olacaktır. Ancak bunun dışında ifadeniz özneldir. Bunun kişisel tercih meselesi olduğuna inanıyorum.

Örneğin, bazen C ++ programlayan deneyimli bir C programcısıyım. Kendimi C ++ 'da çok daha az üretken buluyorum, çünkü C'yi bildiğim kadar iyi bilmiyorum ama bu şekilde hissettiğim için C dilinde programlama C ++' da programlamadan daha verimli olduğu anlamına gelmiyor. Deneyimli bir C ++ programcısı tam tersi bir görüşe sahip olacaktır.

Ve "üretken" in birçok yönü var. Çok önemli bir husus bakım süresi ve özellikle bakımın neden olduğu hataları düzeltmek için geçen süredir. C'nin bakımı montajcıdan çok daha kolaydır.

Assembler, C'den daha düşük seviyeli bir programlama dilidir, bu nedenle doğrudan donanıma programlama için iyi bir seçimdir.

Donanım programlama doğrudan her iki dilde de yapılabilir. C'de yapamayacağınız tek şey CPU çekirdeğinin kendisinin yığın işaretleyicilerine ve durum kayıtlarına vb. Yani, donanım programlaması ile kendi CPU'nuzla konuşmayı kastediyorsanız, evet, montajcı C'den biraz daha fazlasına izin verirse, harici donanıma erişmek istiyorsanız, montajcı C'ye hiçbir faydası yoktur. Ama belki de dezavantajları belirli bir harici aygıt için genel C kodu yerine genel birleştirme kodu.

Bellek, kesmeler, mikro yazmaçlar vb.İle çalışmanızla ilgili çok daha esnektir.

Bu doğru değil. İnterrupt anahtar kelimesi gibi derleyiciye özgü C koduna güvenmeniz gerekebilse de C, bunların hepsini de yapmanıza izin verir.


Sonunda, MCU'ları programlamak için C'ye vurgu yaparak her iki dili de bilmeniz gerekir.


C dilinin tamamı, daha gizli makine dillerinden bazılarından daha karmaşık mıdır? Her ikisini de yaptıktan sonra, kütüphane olmadan C'nin daha az karmaşık olduğunu düşünüyorum. C Standart Kitaplığa atıfta bulunuyorsanız, yararlı bir şey yapmak için montajcıda böyle bir şeye ihtiyacınız vardır. C daha büyük ve daha geniş bir dil olabilir, ancak aynı ayrıntı düzeyine kadar bilmenize gerek yoktur. a = b[i] + c;yükleme b[i](hesaplama alır) ve ckayıtlara (kullanılabilir olması gerekir), ekleme ve saklama talimatlarından çok daha az karmaşıktır .
David Thornley

1
@DavidThornley C hakkında ne kadar çok şey öğrenirseniz, ne kadar karmaşık olduğunun farkına varırsınız. Tanımlanmamış / tanımlanmamış / impl.-tanımlı davranış vakalarının yüzlerce tanesini biliyor musunuz? Tüm örtük tür tanıtım kurallarını ayrıntılı olarak biliyor musunuz (tamsayı tanıtımları, normal aritmetik dönüşümler)? Tür belirteçleriyle ilgili tüm kurallar ve sözdizimi? Dizi işaretçileri de dahil olmak üzere çeşitli statik / dinamik çok boyutlu dizilerin tüm biçimleri (bir dizinin 1. öğesine işaretçilerle karıştırılmamalıdır) C99 ve C11'in tüm özellikleri? Ve bunun gibi.

1
@Lundin: C ile ilgili önemli olan, tüm bu soruları sorabilmeniz ve somut cevaplar bulabilmenizdir. Standarda uygun derleyiciler, uygulama tanımlı 62 ("yüzlerce" değil) davranış için nasıl davrandıklarını belgelemelidir. Meclisin basit sadeliği, onu kendi öğle yemeğinizi getirme teklifi yapar ve bu da C'nin kendi kodunuzla uğraştığı karmaşıklığı ortadan kaldırır. Herhangi bir mimari için montajda kaç kayan noktalı kitaplık yazıldığını ve davranışlarının neden uygulama tanımlı olduğunu sorarak argümanınıza karşı koyabilirim.
Blrfl

1
@Lundin: 62, GCC kılavuzunun 4. bölümünde listelenen derleyici tanımlı davranışların sayısıdır. Kitaplık tanımlı olanı bırakmak, standart bir kitaplık karşılaştırması yapar, çünkü montaj için standart bir kitaplık yoktur. Belgeleme şartı §J.3'ün ilk cümlesidir. GCC ve C89'dan beri satın aldığım veya kullandığım bir avuç derleyici (Intel, Sun, IBM, Portland Group) belgesi, bu yüzden rahatsız etmeyen "çoğu" kendinize uygun diyemezsiniz. Standartlardan bahsetmişken, Intel sözdizimi ile yazılmış x86'yı AT&T sözdizimi olan bir derleyiciye nasıl monte edersiniz?
Blrfl

1
@Lundin: Arabam harika, teşekkürler. Direksiyon simidi, gaz pedalı, fren, debriyaj ve dönüş sinyal kolu standart yerlerdedir, standart davranışa sahiptir ve diğer kontrollerin tümü ISO standardı sembolleriyle açıkça işaretlenmiştir. Eğlence sistemi, HVAC, nav, seyir kontrolü vb.Gibi uygulama tanımlı tüm şeyler, eldiven bölmesindeki bir yağ kitabında belgelenmiştir. Meclis 1973 Plymouth'um gibi: pek bir şey yoktu, ama ham haliyle şu an sürdüğüm kadar yetenekli bir yer değildi. Meclis de aynı şekilde; karmaşıklık ona eklediğiniz şeyde gelir.
Blrfl

1

Ne kadar gömülü olmanız gerektiğine bağlı olarak, C büyük, yavaş programlar üretecektir. Bu da ürünün bu kısmının maliyetini belirgin şekilde artıracaktır. Tüm ürün için okyanusta bir düşüş olabilir veya ürünü kökten değiştirebilir. Evet, bazıları yazılım geliştirme ve bakım çabalarının daha ucuz olduğunu söyleyebilir, yine doğru veya yanlış olabilir, eğer bu derin gömülü ve düşük güç, küçük ve ucuz bir parçayı çok fazla koddan bahsetmediğiniz bir parçayı hedefliyorsa. Bu kod çoğunlukla o satıcıya özeldir veya belirli bir çip C'de olmak sıfır taşınabilirlik avantajına sahiptir, yine de her hedefi önceden yeniden yazmanız gerekir. ARM'nin korteks-m serisi ile şimdi C'nin asm ile rekabet edebilmesine başlıyoruz, insanların gömülü ürünlerinde C veya diğer üst düzey dilleri kullanmadıkları değil,

C ve ASM tartışması, profesyonel olarak, her zaman C'ye yazmak ve haklı çıkarabileceğiniz ASM'yi kullanmak için kaynar. Ve haklı çıkarabilirsiniz. Gömülü dünyada performans ve boyut vardır.

Hedefi bu tartışmaya dahil etmek zorundasınız. Birçoğu C'yi Microchip ile (eski resimler değil, mips değil pic32) kullanmış olsa da, derleyiciler için korkunç bir komut seti, çok eğitici ve ilginç talimat seti ama derleyici düşmanca. msp430, avr, kol, başparmak, mips, tüm derleyiciler için iyi. 8051 de kötü.

Dilden bile daha fazlası araçlar. Kod geliştirme ve yönetimi hakkında endişelenmenin bir argüman olduğu durumlarda, bugün ve yarın orada olmak için araçlara ihtiyacınız var. Bir grup tarafından yönetilen tek bir gcc modu dahil olmak üzere tek bir kaynak araca sahip olmak iş açısından risklidir. Birden fazla montajcı bulmanız muhtemeldir ve bu takımda yer almaya layık olan herkes bir haftasonunda bir montajcıyı kırdırabilir (yazdığınız montaj ghee whiz direktifi ve makro mutlu olmadığı sürece). Hem asm hem de C için, 10 yıllık bir linux dağıtımını çalıştırmak için sanal bir makine kullanmak anlamına gelse bile, daha iyi bir şansa sahip olduğunuz açık kaynak araçlarını (veya kendi şirket içi araçlarınızı) kullanmak istersiniz. ürünün ömrü.

Sonuç olarak, hem C hem de asm'yi kullanın / öğrenin / öğretin, C ile başlayın ve haklı kılabileceğiniz asm'yi kullanın.


Bu argümanlar bana eski moda geliyor. Son 10 yıl içinde yazılmış modern bir derleyici kullanıyorsanız, o zaman bir C programından çok daha etkili bir montaj programı yazmak için zor zamanınız olacağına inanıyorum. Belki de, PIC veya 8051 gibi 30 yıllık bir dinozor mimarisi kullanmıyorsanız, o zaman ne yaparsanız yapın yavaş bir programa sahip olacaksınız ...

En modern gcc ve llvm tarafından üretilen yavaş montajı düzeltmek oldukça önemsizdir. 4.x gcc, 3.x serisinden daha yavaş ve daha az verimli kod üretir (bazı hedefler için, en azından değerlendirdiğim, örneğin ARM). Derleyicinin insanlardan daha iyi olduğu fikrini ortadan kaldırmanın önemli olduğunu düşünüyorum çünkü öyle değil. Ve bunu yapsa bile, sadece insan ne yaptığını bildiğinde yapar. etkin bir şekilde kullanmak istiyorsanız "araçlarınızı tanıyın". C ile başlayın ve gerek duyduğunuzda ASM kullanın ...
old_timer

Gcc açık kaynak olduğu için garip bir canavardır. Belki de bu liman kötü yapılmış. Tüm kod optimizasyonları belirli bir platform için yapılmalıdır, bu önemsiz bir görev değildir. Manuel montajcının performansını bu platform için ticari bir derleyiciyle karşılaştırmak daha adil olur.

gcc çok hedeflidir, bu nedenle ortalama olarak oldukça iyi bir iş çıkarır, ancak belirli bir hedef için harika bir iş değildir. Ve beklenen de bu. ama modern bir derleyici hakkındaki görüşünüz, son 10 yıl vs. Herhangi bir modern derleyicinin mümkün olan en iyi kodu oluşturduğu fikri yanlıştır. Ortalama olarak el kodlu montajcıdan çok daha iyi olduğu doğru,
asmdaki

Bu yüzden çoğu kişi bir sorun olana kadar C'yi kullanın, sonra haklı çıkarırsanız sorunu asm'de elle onarın. bu küçük performans kazanımına gerçekten ihtiyacınız var mı, gerçekten performans probleminizin olduğu yerde, bu kodu içinde asm ile korumak istiyor musunuz, çıktının onarımını veya sorununuzu azaltıp azaltmadığını görmek için gelecekteki her derleyiciyi kontrol etmeye devam edecek misiniz? kabul edilebilir bir seviyeye vb.
old_timer

1

Montaj için kod sürdürülebilirliği ve performans arasında kaçınılmaz bir uzlaşma var. Montajı kolay okunur / bakımı yapılabilir veya yüksek düzeyde optimize edilmiş kod yazabilirsiniz; ama ikisini birden yapamazsın.

C için uzlaşma tamamen ortadan kalkmaz, ancak çok daha az fark edilir - okunması / bakımı kolay, iyi optimize edilmiş C yazabilirsiniz.

Mükemmel bir montaj dili programcısı derleyiciyi neredeyse her zaman yenebilir, ancak çoğu zaman kasıtlı olarak bunun yerine kolay okunur / bakımı kolay kod yazmayı seçer; bu nedenle mükemmel bir montaj dili programcısı bir derleyici tarafından çoğu zaman dövülecektir.

Akıllı yol, hem montaj hem de C'yi kullanmaktır (sadece montaj veya sadece C yerine) - örneğin, mükemmel bir montaj dili programcısının bakım / yavaş kod yazmayı seçeceği kodlar için C'yi kullanın ve geri kalanı ("yüksek derecede optimize edilmiş ve bakımı zor" aslında haklıdır).


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.