Quali sono alcuni vantaggi / svantaggi dell'uso di C su Assembly? [chiuso]

13

Attualmente sto studiando ingegneria in telecomunicazioni ed elettronica e siamo passati dall'assemblatore alla C nella programmazione di microprocessori. Ho dei dubbi sul fatto che questa 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 della sintassi di Assembler.
  • C è più facile da usare per realizzare programmi più complessi.
  • L'apprendimento C è in qualche modo più produttivo rispetto all'apprendimento dell'assemblatore, poiché in C è presente più materiale di sviluppo rispetto all'assemblatore.

Svantaggi:

  • Assembler è un linguaggio di programmazione di livello inferiore rispetto a C, quindi è utile per programmare direttamente sull'hardware.
  • È molto più flessibile che ti allude a lavorare con la memoria, gli interrupt, i micro-registri, ecc.
posta Daniel Conde Marin 09.03.2012 - 04:47
fonte

7 risposte

15

Ecco alcune risposte di overflow dello stack che possono aiutarti (queste sono le risposte migliori e le risposte accettate):

Vantaggi

link (solo per utenti 10K) o Archivio

  • Assembly viene utilizzato nelle prime fasi del bootloader. Quando la CPU non è disponibile nello stack, è difficile da mantenere il compilatore C dal tentativo di salvare le cose nello stack. La maggior parte del bootloader è comunque scritta in C, una volta terminata la prima fase di inizializzazione.
  • Assembly è usato per scrivere primitive di blocco mutex. È essenzialmente impossibile ottenere un compilatore C per emettere istruzioni per la barriera di memoria nei luoghi richiesti.
  • Le routine come memset () o memcpy () vengono spesso eseguite in assembly. Ad esempio, ho scritto un memset () con un grande loop srotolato, che calcola dinamicamente un indirizzo di ramo per saltare nel mezzo di quel ciclo per un'ultima iterazione. Una routine C avrebbe generato più codice, facendo mancare ulteriori missioni. Allo stesso modo, i set di istruzioni della CPU spesso includono il caricamento della linea cache o altre istruzioni che possono velocizzare notevolmente memcpy (), che il compilatore C non utilizzerà.

Svantaggi

link

  • ASM ha una scarsa leggibilità e non è realmente gestibile rispetto ai linguaggi di livello superiore.
  • Inoltre, ci sono molti meno sviluppatori ASM rispetto ad altri linguaggi più popolari, come C.
  • Inoltre, se si utilizza un linguaggio di livello superiore e nuove istruzioni ASM diventano disponibili (ad esempio SSE), è sufficiente aggiornare il compilatore e il vecchio codice può facilmente utilizzare le nuove istruzioni.

Esempio

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

link

    
risposta data 09.03.2012 - 05:07
fonte
18
  • C è più facile da programmare in, rispetto a Assembly. Ci sono ovvi ragioni che non valgono la pena di essere rimosse.

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

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

  • C è dannatamente di basso livello, ed è raro che tu voglia fare molto inferiore. Avere uno strato aggiuntivo di astrazione è raramente una brutta cosa.

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

  • Puoi scrivere Assembly in C-code, ma non C in Assembly-code.

risposta data 09.03.2012 - 04:57
fonte
14

Un programma C può essere compilato in diverse architetture di microprocessori.

    
risposta data 09.03.2012 - 05:09
fonte
4

we have migrated from assembler to C in microprocessor programming. I have doubts that this is a good idea

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

I can tell that C syntax is a lot easier to learn than Assembler syntax.

Sì, la sintassi è più facile, certamente. Tuttavia, imparare l'intero linguaggio C con tutti i fastidiosi dettagli è molto più complesso che imparare tutti i dettagli di un particolare assemblatore. C è un linguaggio molto più ampio e più ampio. Ma poi di nuovo, potresti non aver bisogno di imparare tutti i dettagli.

C is easier to use for making more complex programs.

In effetti, C fornisce meccanismi per la progettazione modulare del programma, 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.

Learning C is somehow more productive than learning assembler cause there is more developing stuff around C than Assembler.

C ha un sacco di funzionalità, librerie e risorse pre-fatte, quindi ci sarà meno re-inventare la ruota. Ma a parte questo, la tua affermazione è soggettiva. Credo che sia una questione di preferenze personali.

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

E ci sono molti aspetti da "produttivi". Un aspetto molto importante è il tempo di manutenzione e in particolare il tempo necessario per correggere i bug causati dalla manutenzione. C è molto più semplice da gestire rispetto all'assembler.

Assembler is a lower level programming language than C,so this makes it a good for programming directly to hardware.

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

Is a lot more flexible alluding you to work with memory,interrupts,micro-registers,etc.

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

Alla fine, devi conoscere entrambe le lingue per programmare gli MCU, con enfasi su C.

    
risposta data 19.03.2012 - 16:40
fonte
1

A seconda di come è necessario andare, C produrrà programmi grandi e lenti. Che 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 meno costosi, anche questo può essere vero o falso, se questo è profondamente radicato e mira a una parte a bassa potenza, piccola e poco costosa, non si parla di molto codice. Quel codice è per lo più specifico per quel produttore o quel chip specifico, quindi essere in C ha zero benefici di portabilità, devi comunque riscrivere su ogni target. Con la serie cortex-m di ARM stiamo solo ora iniziando a essere in grado di far competere C con asm, non che la gente non abbia usato C o altri linguaggi di alto livello nei loro prodotti incorporati, ma lo hanno fatto a un costo. / p>

Il dibattito C vs ASM, professionalmente, si riduce sempre a scrivere in C e utilizzare ASM dove è possibile giustificarlo. E tu puoi giustificarlo. Nel mondo embedded ci sono prestazioni e dimensioni.

Devi includere il bersaglio in questa discussione. Anche se molti hanno usato C con Microchip (le foto più vecchie, non le pic32 che sono mips) ad un costo enorme, è un set di istruzioni terribile per compilatori, set di istruzioni molto istruttivo e interessante ma compilatore ostile. msp430, avr, arm, thumb, mips, tutto buono per i compilatori. 8051 anche male.

Anche più della lingua gli strumenti. Esp in quei casi in cui la preoccupazione per lo sviluppo e la gestione del codice è un argomento, hai bisogno di strumenti per essere lì oggi e domani. Avere un unico strumento di origine, anche includendo un singolo mod gcc, gestito da un gruppo, è rischioso dal punto di vista del business. È probabile che tu trovi più di un assemblatore, e chiunque sia degno di essere in quella squadra potrebbe montare un assemblatore in un fine settimana (purché l'assemblea che scrivi non sia una direttiva del ghie whiz e una macro felice). Per entrambi asm e C vorresti usare strumenti open source (o i tuoi strumenti in house) in cui 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, usa / learn / teach sia C che asm, inizia con C e usa asm dove puoi giustificarlo.

    
risposta data 10.03.2012 - 15:17
fonte
1

Per l'assemblaggio c'è un compromesso inevitabile tra manutenibilità e prestazioni del codice. È possibile scrivere assembly di facile lettura / manutenzione o 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 leggere / mantenere C che è ragionevolmente ben ottimizzato.

Un programmatore di linguaggio assembly eccellente sarà in grado di battere il compilatore quasi sempre, ma la maggior parte delle volte sceglierà deliberatamente di scrivere codice di facile lettura / manutenzione; e quindi un programmatore di linguaggio assembly eccellente sarà battuto il più delle volte da un compilatore.

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

    
risposta data 22.12.2014 - 18:47
fonte
-3
  1. Relativamente positivo per l'efficienza della programmazione.
  2. È facile programmare usando il linguaggio c piuttosto che usare l'assembly.
  3. Il linguaggio C può essere molto più veloce del linguaggio assembly.
  4. È possibile scrivere assembly nel codice C ma non C nel codice assembly.
risposta data 22.12.2014 - 16:22
fonte

Leggi altre domande sui tag