Quali sono alcuni vantaggi / svantaggi dell'utilizzo di C rispetto all'assemblaggio? [chiuso]


15

Attualmente sto studiando ingegneria in telecomunicazioni ed elettronica e siamo passati dall'assemblatore alla C nella programmazione a microprocessore. Dubito che sia una buona idea. Quali sono alcuni vantaggi e svantaggi di C rispetto all'assemblaggio?

I vantaggi / svantaggi che vedo sono:

vantaggi:

  • Posso dire che la sintassi C è molto più facile da imparare rispetto alla sintassi Assembler.
  • C è più facile da usare per creare programmi più complessi.
  • L'apprendimento del C è in qualche modo più produttivo dell'apprendimento dell'assemblatore perché ci sono più cose in sviluppo attorno a C dell'assemblatore.

svantaggi:

  • L'assemblatore è un linguaggio di programmazione di livello inferiore rispetto a C, quindi è un ottimo strumento per la programmazione direttamente sull'hardware.
  • È molto più flessibile alluderti a lavorare con memoria, interruzioni, micro-registri, ecc.

17
Uhm ... benvenuto nel nuovo secolo. Ti piacerà qui. Abbiamo microcontrollori che eseguono .NET , Java , Linux e persino persone che usano Python per programmare PIC .
ZJR

@ZJR Come si usa Python per programmare un PIC? Quale foto?
Detly

2
@detly Non è un vero pitone a tutti gli effetti, ma solo un sottoinsieme del core. Un cappotto di sintassi di Python sulla funzionalità del controller , se lo desideri. pyastra è il primo esempio che ho cercato su Google , ma ricordo di aver letto i documenti di un altro, che ha fatto anche ATMEL.
ZJR

4
Ad essere onesti, con la complessità dei moderni processori sarei sorpreso se molti programmatori potessero scrivere comunque un assemblatore più stretto ed efficiente di quanto un moderno compilatore C possa generare. Odierei provare a programmare una CPU con architettura EPIC nell'assemblatore, per esempio: Mel sarebbe a casa con l' Itanium . * 8 ')
Mark Booth

5
@ZJR Questo nuovo secolo sembra eccitante! Sono curioso però, in che lingua è stato scritto .NET runtime, Java VM e Linux, per quei microcontrollori? Come in, in quale lingua è stata eseguita l'effettiva programmazione del microcontrollore? Oh ... C o assemblatore anche questo secolo ...

Risposte:


17

Ecco alcune risposte di overflow dello stack che potrebbero esserti utili (queste sono le risposte migliori, risposte accettate):

vantaggi

/programming/143561/is-there-a-need-to-use-assembly-these-days (solo per utenti 10K) o Archive

  • L'assemblaggio viene utilizzato nelle prime fasi del bootloader. Quando la CPU si accende nello stack non è disponibile ed è difficile impedire al compilatore C di cercare di salvare elementi nello stack. La maggior parte del bootloader è comunque scritta in C, una volta effettuata la prima inizializzazione.
  • Assembly viene utilizzato per scrivere primitive di blocco mutex. È essenzialmente impossibile ottenere un compilatore C per emettere istruzioni sulla barriera di memoria nei punti richiesti.
  • Routine come memset () o memcpy () vengono spesso eseguite in assembly. Ad esempio, ho scritto un memset () con un grande ciclo non srotolato, che calcola dinamicamente un indirizzo di diramazione per saltare nel mezzo di quel ciclo per un'ultima iterazione. La routine AC avrebbe generato più codice, prendendo ulteriori $ I miss. Allo stesso modo, i set di istruzioni della CPU spesso includono il caricamento della riga della cache o altre istruzioni che possono velocizzare notevolmente memcpy (), che il compilatore C non utilizzerà.

svantaggi

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

  • ASM ha una scarsa leggibilità e non è realmente gestibile rispetto alle lingue di livello superiore.
  • Inoltre, ci sono molti meno sviluppatori ASM rispetto ad altre lingue più popolari, come C.
  • Inoltre, se usi un linguaggio di livello superiore e diventano disponibili nuove istruzioni ASM (ad esempio SSE), devi solo aggiornare il compilatore e il tuo vecchio codice può facilmente utilizzare le nuove istruzioni.

Esempio

L'ultimo post di seguito è un post Stack Overflow che delinea uno scenario che mostrerà un esempio di assemblaggio che è più veloce di C (quando si esegue la stessa funzione).

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


20
  • C è più facile da programmare rispetto all'Assemblea. Ci sono ragioni ovvie che non vale la pena ripassare.

  • Essendo più facile da usare, C ti consente di scrivere programmi più velocemente. Generalmente questi programmi sono anche più facili da eseguire il debug e più facili da mantenere. Inoltre, è più facile gestire programmi complessi e di grandi dimensioni in C.

  • Spesso, il codice generato da un compilatore è altrettanto buono (in termini di velocità ed efficienza) come un assemblatore scritto a mano - se non meglio.

  • C è dannatamente di basso livello ed è raro che tu voglia andare molto più in basso. Avere uno strato aggiuntivo di astrazione raramente è una brutta cosa.

  • Quando devi scendere, puoi usare Assembly, altrimenti puoi usare C.

  • È possibile scrivere Assembly in codice C, ma non C in codice assembly.


6
Vorrei dire che a volte vedrai che il codice macchina ottimizzato per il compilatore C è migliore del tuo codice assembly scritto a mano
utente

@crucified: questa era già un'affermazione comune (e generalmente giustificata) tra la metà e la fine degli anni '90. Un compilatore applica ottimizzazioni in modo affidabile e sistematico, non solo quando nota l'opportunità.
Steve314

15

Il programma CA può essere compilato per diverse architetture di microprocessori.


4

siamo passati dall'assemblatore a C nella programmazione a microprocessore. Dubito che sia una buona idea

Non temere, nessuno sviluppa più nuovi programmi in assemblatore al 100%. Al giorno d'oggi, C può essere utilizzato anche per le architetture a 8 bit più piccole e più piccanti. Tuttavia , conoscere alcuni assemblatori ti rende un programmatore C significativamente migliore. Inoltre, ci sono sempre alcuni piccoli dettagli in un programma che devono essere scritti in assembler.

Posso dire che la sintassi C è molto più facile da imparare rispetto alla sintassi Assembler.

Sì, la sintassi è più semplice, certamente. Tuttavia, l'apprendimento dell'intero linguaggio C con tutti i dettagli fastidiosi è molto più complesso dell'apprendimento di tutti i dettagli di un particolare assemblatore. C è un linguaggio molto più grande e più ampio. Ma, di nuovo, potrebbe non essere necessario conoscere tutti i dettagli.

C è più facile da usare per creare programmi più complessi.

In effetti, C fornisce meccanismi per la progettazione di programmi modulari, come incapsulamento e ambiti locali / variabili locali. E C ha una libreria standard, oltre a un'enorme quantità di risorse scritte negli ultimi 30 anni. E, soprattutto, C è portatile.

L'apprendimento del C è in qualche modo più produttivo dell'apprendimento dell'assemblatore perché ci sono più cose in sviluppo attorno a C dell'assemblatore.

C ha molte funzionalità, librerie e risorse prefabbricate, quindi ci sarà meno reinventare la ruota. Ma a parte questo, la tua affermazione è soggettiva. Credo che sia una questione di preferenze personali.

Ad esempio, sono un programmatore esperto di C, che occasionalmente programma C ++. Mi trovo molto meno produttivo in C ++, perché non conosco quel linguaggio così come conosco C. Ma solo perché la penso così, non significa necessariamente che la programmazione in C sia più produttiva della programmazione in C ++. Un programmatore esperto in C ++ avrebbe sicuramente l'opinione opposta.

E ci sono molti aspetti "produttivi". Un aspetto molto importante è il tempo di manutenzione, e in particolare il tempo necessario per correggere i bug indotti dalla manutenzione. C è molto più facile da mantenere rispetto all'assemblatore.

L'assemblatore è un linguaggio di programmazione di livello inferiore rispetto a C, quindi è un ottimo strumento per la programmazione direttamente sull'hardware.

La programmazione hardware può essere eseguita direttamente in entrambe le lingue. Le uniche cose che non puoi fare in C sono accedere ai puntatori dello stack, ai registri delle condizioni, ecc., Del core della CPU stesso. Quindi se per programmazione hardware intendi parlare con la tua CPU, allora sì, assemblatore consente un po 'più di C. Se intendi accedere all'hardware esterno, allora assemblatore non ha alcun vantaggio rispetto a C. Ma forse svantaggi, poiché spesso è più difficile scrivere codice assembler generico per un particolare dispositivo esterno, rispetto al codice C generico.

È molto più flessibile alluderti a lavorare con memoria, interruzioni, micro-registri, ecc.

Questo non è corretto C ti consente anche di fare tutto ciò, anche se potresti dover fare affidamento sul codice C specifico del compilatore come la parola chiave interrupt.


Alla fine, è necessario conoscere entrambe le lingue per programmare MCU, con enfasi su C.


In che modo l'intero linguaggio C è più complesso di alcuni dei linguaggi macchina più arcani? Avendo fatto entrambe le cose, penso che C senza le librerie sia notevolmente meno complesso. Se ti riferisci alla libreria standard C, hai bisogno di qualcosa del genere anche in assemblatore, per fare qualcosa di utile. C può essere un linguaggio sempre più ampio, ma non è necessario conoscerlo con lo stesso livello di dettaglio. a = b[i] + c;è molto meno complicato delle istruzioni per caricare b[i](che richiede il calcolo) e cnei registri (che devono essere resi disponibili), aggiungere e archiviare.
David Thornley,

1
@DavidThornley Più impari su C, più ti rendi conto di quanto sia complesso. Conosci tutte le centinaia di casi di comportamento indefinito / non specificato / definito dall'impl.? Conosci tutte le regole di promozione del tipo implicito in dettaglio (promozioni intere, solite conversioni aritmetiche)? Tutte le regole e la sintassi peculiari relative agli identificatori di tipo? Tutte le varie forme di array multidimensionali statici / dinamici, inclusi i puntatori di array (da non confondere con i puntatori al primo elemento di un array) Tutte le caratteristiche di C99 e C11? E così via.

1
@Lundin: L'importante di C è che tu sia in grado di porre tutte quelle domande e trovare risposte concrete. I compilatori conformi allo standard sono tenuti a documentare come si comportano per i 62 comportamenti (non "centinaia") definiti dall'implementazione. La semplice semplicità di Assembly lo rende una proposta da portare a casa, che a sua volta scarica la complessità che C affronta sul tuo codice. Potrei contrastare il tuo argomento chiedendo quante librerie in virgola mobile sono state scritte in assembly per una determinata architettura e perché il loro comportamento è definito dall'implementazione.
Blrfl

1
@Lundin: 62 è il numero di comportamenti definiti dal compilatore elencati nella sezione 4 del manuale GCC. Tralasciando ciò che è definito dalla libreria si ottiene un confronto mele-mele poiché non esiste una libreria standard per l'assemblaggio. L'obbligo di documentare è la prima frase del §J.3. GCC e la manciata di compilatori commerciali che ho comprato o usato da quando C89 è stato ratificato (Intel, Sun, IBM, Portland Group) documento, quindi il tuo "più" che non si preoccupa non può definirsi conforme. Parlando di standard, come funziona l'assemblaggio di x86 scritto con la sintassi Intel su un assemblatore con sintassi AT&T?
Blrfl

1
@Lundin: la mia macchina è fantastica, grazie. Il volante, l'acceleratore, il freno, la frizione e lo stelo degli indicatori di direzione sono tutti in posizioni standard, hanno un comportamento standard e gli altri comandi sono tutti chiaramente contrassegnati con simboli ISO standard. Tutte le cose definite dall'implementazione come il sistema di intrattenimento, HVAC, nav, cruise control, ecc. Sono documentate in un libro grasso nel vano portaoggetti. L'assemblaggio è come il mio Plymouth del 1973: non c'era molto da fare, ma in forma grezza non era vicino come capace come quello che sto guidando ora. Il montaggio è allo stesso modo; la complessità sta in ciò che aggiungi ad esso.
Blrfl

1

A seconda di come devi andare incorporato, C produrrà programmi lenti e di grandi dimensioni. Ciò aumenterà sensibilmente il costo di quella parte del prodotto. Potrebbe essere una goccia nell'oceano per il prodotto complessivo o potrebbe cambiare radicalmente il prodotto. Sì, alcuni potrebbero dire che gli sforzi di sviluppo e manutenzione del software sono più economici, anche in questo caso può essere vero o falso, se è profondamente integrato e mira a una parte a bassa potenza, piccola e poco costosa, non stai parlando di molto codice. Quel codice è principalmente specifico per quel fornitore o quel chip specifico quindi essere in C ha zero vantaggi di portabilità, devi comunque riscrivere prima di ogni target. Con la serie cortx-m di ARM stiamo appena iniziando a essere in grado di far competere C con asm, non che le persone non abbiano mai usato C o altri linguaggi di livello superiore nei loro prodotti integrati,

Il dibattito tra C e ASM, da un punto di vista professionale, si riduce sempre a scriverlo in C e usare ASM dove è possibile giustificarlo. E puoi giustificarlo. Nel mondo incorporato ci sono prestazioni e dimensioni.

Devi includere l'obiettivo in questa discussione. Sebbene molti abbiano usato C con Microchip (le foto più vecchie, non la pic32 che è mips) ad un costo enorme, è un set di istruzioni terribile per compilatori, set di istruzioni molto educativo e interessante ma compilatore ostile. msp430, avr, arm, thumb, mips, tutto buono per i compilatori. 8051 anche male.

Ancora più della lingua gli strumenti. Soprattutto nei casi in cui preoccuparsi dello sviluppo e della gestione del codice è un argomento, sono necessari strumenti per essere presenti oggi e domani. Avere un unico strumento sorgente, anche includendo una singola mod gcc, gestita da un gruppo, è rischioso dal punto di vista aziendale. È probabile che tu trovi più di un assemblatore, e chiunque sia degno di far parte di quella squadra potrebbe montare un assemblatore in un fine settimana (purché l'assemblaggio che scrivi non sia ghee whiz direttiva e macro felice). Sia per asm che per C vorresti usare strumenti open source (o i tuoi strumenti di casa) dove hai maggiori possibilità, anche se significa usare una macchina virtuale per eseguire una distribuzione Linux di 10 anni, di avere strumenti disponibili per la vita del prodotto.

La linea di fondo, ancora una volta, usa / impara / insegna sia in C che in asm, inizia con C e usa asm dove puoi giustificarlo.


Questi argomenti mi sembrano vecchio stile. Se stai usando un moderno compilatore che è stato scritto negli ultimi 10 anni, credo che avrai difficoltà a scrivere un programma di assemblaggio che è significativamente più efficace di un programma C. A meno che tu non stia forse usando un'architettura di dinosauro di 30 anni come PIC o 8051, allora avrai un programma lento, qualunque cosa tu faccia ...

È abbastanza banale riparare l'assemblaggio lento generato dai più moderni gcc e llvm. Il gcc 4.x produce un codice più lento, meno efficiente della serie 3.x (per alcuni target, almeno quelli che ho valutato, ad esempio ARM). Penso che sia importante dissipare l'idea che il compilatore sta facendo meglio degli umani perché non lo è. E anche quando lo fa lo fa solo quando l'umano sa cosa sta facendo. "Conosci i tuoi strumenti" se vuoi usarli in modo efficace. Inizia con C e usa ASM quando necessario se puoi giustificarlo ...
old_timer

Poiché gcc è open source, è una strana bestia. Forse quel particolare porto è mal fatto. Tutte le ottimizzazioni del codice devono essere eseguite per la piattaforma specifica, non è un compito banale. Sarebbe più giusto confrontare le prestazioni dell'assemblatore manuale rispetto a un compilatore commerciale per quella piattaforma.

gcc è multi-target, quindi fa un lavoro abbastanza buono in media ma non è un ottimo lavoro per un determinato target. Ed è quello che ci si aspetta. ma il tuo punto su un compilatore moderno, negli ultimi 10 anni, ecc. Semplicemente, i compilatori non stanno migliorando per quanto riguarda il codice prodotto, ma stanno migliorando per quanto riguarda le lingue, gli obiettivi e le funzionalità a costo del codice prodotto. L'idea che qualsiasi compilatore moderno renda possibile il miglior codice è semplicemente falsa. Molto vero che in media è MOLTO meglio dell'assemblatore codificato a mano, difficile realizzare qualsiasi progetto di dimensioni decenti in asm meglio di C
old_timer

ed è per questo che la maggior parte della gente dice di usare C fino a quando non c'è un problema, quindi riparalo a mano in asm se puoi giustificarlo. hai davvero bisogno di quel piccolo guadagno in termini di prestazioni, è davvero dove si trova il tuo problema di prestazioni, vuoi mantenere questo codice con asm in esso, continuerai a controllare ogni futuro compilatore per vedere se il suo output ripara o riduce il tuo problema a un livello accettabile, ecc.
old_timer

1

Per l'assemblaggio c'è un inevitabile compromesso tra manutenibilità del codice e prestazioni. È possibile scrivere un assembly di facile lettura / manutenzione oppure scrivere codice altamente ottimizzato; ma non puoi fare entrambe le cose.

Per C, il compromesso non scompare del tutto, ma è molto meno evidente: puoi scrivere facilmente C da leggere / mantenere C che è ragionevolmente ottimizzato.

Un eccellente programmatore di linguaggio assembly sarà in grado di battere il compilatore quasi sempre, ma la maggior parte delle volte sceglierà deliberatamente di scrivere codice facile da leggere / mantenere; e quindi un eccellente programmatore di linguaggio assembly sarà battuto per la maggior parte del tempo da un compilatore.

Il modo intelligente è utilizzare sia assembly che C (anziché solo assembly o solo C), ad esempio utilizzare C per parti del codice in cui un programmatore di linguaggio assembly eccellente avrebbe scelto di scrivere codice gestibile / lento e utilizzare assembly per il resto (dove "altamente ottimizzato e difficile da mantenere" è in realtà giustificato).


-3
  1. Relativamente buono per l'efficienza di programmazione.
  2. È facile programmare usando il linguaggio c piuttosto che usare assembly.
  3. Il linguaggio C può essere molto più veloce del linguaggio assembly.
  4. È possibile scrivere assembly in codice C ma non C in codice assembly.

3
vantaggi solo ....
Kiran Sapkale,

3
Questa è solo una versione riformulata di Quali sono alcuni vantaggi / svantaggi dell'utilizzo di C over Assembly? ; non hai aggiunto nulla di nuovo alla discussione qui.
Martijn Pieters,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.