È saggio che uno sviluppatore di alto livello passi il tempo a studiare il montaggio? [chiuso]


33

È chiaro che la conoscenza di cose di basso livello è molto importante nel nostro lavoro.

Ma in una situazione in cui stai già sviluppando software commerciale di alto livello e quando hai già una direzione scelta ma non hai alcuna abilità di assemblaggio, non è più ragionevole concentrarsi sullo studio di cose relative alla tua direzione? Oppure c'è un motivo per cui dovresti dedicare del tempo ad imparare le basi di basso livello in ogni caso?

Quando è troppo tardi e quando non lo è? E se è non è troppo tardi, allora come si potrebbe andare a imparare in modo ottimale (nel senso di non spendere troppo tempo per ottenere una certa profondità e la comprensione)?


Molte domande in un solo post :)
Shamim Hafiz,

Mi è piaciuto Assembly Language Step by Step. All'inizio ci sono un sacco di cose da programmatore noobie, ma l'autore è molto divertente. Ho trovato utile avere un'idea generale e scrivo principalmente JavaScript.
Erik Reppen,

La mia prima lingua (insegnata) era un dialetto assembleare. Vedo come sarebbe utile (nella moltitudine di modi che altri hanno sottolineato) e ti aiuta a fornire input diversi per il resto della squadra.
Jamie Taylor,

Risposte:


43

Non riesco a credere che nessuno abbia menzionato il debug ...

Non scrivo una riga di codice assembly da molti anni ormai. Ma l'ho letto abbastanza spesso. Il debug di alto livello è ottimo quando disponi delle informazioni di origine e dei simboli, ma quando la tua libreria sofisticata genera un'eccezione non gestita sui computer dei clienti, è troppo tardi per richiedere che sia incluso nella licenza ...

Ma posso ancora aprire il disassemblatore e vedere cosa alla fine ha fatto la tua logica di alto livello , rintracciare i dati errati alla sua origine, scoprire chi ha cambiato il registro di controllo FPU ...

Questo mi ha salvato la pancetta più spesso di quanto mi importi. E non è mai troppo tardi per imparare: ci sono molti ottimi riferimenti ed esercitazioni in rete, e quasi tutti i programmi in esecuzione sul tuo computer possono fornire un ambiente pratico.


10
+1, e lo voterei di più se potessi. Ogni sviluppatore serio deve essere in grado di leggere ASM per questo, se non per altri motivi.
Mason Wheeler,

3
Il corollario di questo è l'ottimizzazione. Sapere come il complier traduce il tuo codice in assembly può aiutarti a renderlo notevolmente più veloce!
Lambacck,

3
L'Assemblea +1 è una delle uniche lingue che ti obbligano a capire come funziona effettivamente un processore. Ti aiuta nel tuo sviluppo con un linguaggio di alto livello. Da leggere: blogs.msdn.com/b/ericlippert/archive/2010/09/30/…

Conoscere il computer sottostante è INSANELY utile, sia per il debug, l'ottimizzazione o la pura curiosità. Seriamente, impara a leggere almeno una o due famiglie di linguaggio assembly. Anche se non l'hai mai letto o scritto dopo averlo appreso, influenzerà il modo in cui comprendi le cose in futuro. Ora, se preferisci scrivere in nessun'altra lingua, potrebbe essere un po 'troppo ...
Michael Trausch,

1
@Mason: non so se "ogni sviluppatore serio" deve essere in grado di leggere ASM. Se stai scrivendo JavaScript o usando un linguaggio di programmazione costruito su un framework spesso (come .NET o Java), non considererei in grado di leggere ASM come essenziale per essere uno sviluppatore serio. Detto questo, avere una comprensione di come il computer esegue le istruzioni a un livello molto basso può essere molto utile, anche in linguaggi e ambienti di programmazione di ordine superiore.
Scott Mitchell il

15

Non devi imparare il linguaggio degli assemblaggi, devi solo capire come funziona. Devi sapere cos'è XOR e contare in binario durante il sonno, ecc. Ma non ho mai avuto bisogno del codice assembly nel mio lavoro, mai.

Quindi, come dici tu, la conoscenza di cose di basso livello è importante, ma la conoscenza pratica nell'assemblaggio non lo è.


1
Io secondo. Si può guadagnare un buon vivere di programmazione e non hanno di leggere / ASM scrittura. Ci sono alcune posizioni che lo richiedono. La lettura di una discarica dopo una condizione di competizione nel codice ha interrotto il processo. O se scrivi programmi ad alta intensità di perf (come parallelismo GPU / OpenCL). La percentuale di lavori di sviluppo in cui ti verrà richiesto di eseguire queste attività è molto piccola.
yzorg,

11

Se davvero non hai competenze di programmazione di basso livello, ti consiglio vivamente di impararne alcune nel tempo libero. Non devi diventare un esperto in questo; raggiungere un certo livello di competenza. Devi fare molto del lavoro di matematica da solo, piuttosto che dipendere dal compilatore o dalle librerie per farlo per te. Ti aiuterà a capire la leggibilità nella programmazione, poiché la maggior parte delle istruzioni di assemblaggio corrispondono a un'istruzione del processore. Devi gestire tu stesso la complessità in programmi leggermente più grandi, senza il beneficio di cose come if...else. Questo ti aiuterà a scrivere programmi di alto livello più semplici, poiché l'esperienza di assemblaggio ti avrebbe insegnato quanto è più facile da leggere.

Inoltre, ricorda che l'assemblea non è una lingua! È un termine generico, che in sostanza significa l'insieme di istruzioni di un processore che è stato astratto in un linguaggio simbolico. Processori diversi hanno set di istruzioni diversi e quindi linguaggi di assemblaggio diversi. Quando impari il "montaggio", impari un processo, non una lingua.


8

Trarrai sempre vantaggio dal picco sotto le coperte e dalla comprensione un po 'di più di ciò che si trova sotto l'astrazione su cui ti trovi. Come un mio professore universitario ha affermato una volta "Tutti i bravi programmatori comprendono l'hardware" - non devi essere in grado di creare e manipolare circuiti, ma dovresti avere una comprensione di ciò che sta accadendo laggiù - farà solo è meglio.

Prova l' organizzazione e la progettazione dei computer


1

- L'apprendimento permanente e permanente è una componente essenziale di una carriera nello sviluppo di software. Se sei interessato a continuare a conoscere la programmazione e come migliorare il tuo mestiere, allora sì, a un certo punto dovresti imparare l'assemblaggio in quanto ti esporrà a un linguaggio completamente nuovo e al modo di scrivere il codice. Per lo stesso motivo, consiglio di sperimentare molti linguaggi / stili di programmazione tra cui Ruby / Python (linguaggio dinamico), Haskell / F # (linguaggio funzionale puro), Lisp / Scheme (linguaggio funzionale), ecc ...

Direi che è troppo tardi se non sei più interessato a saperne di più sull'arte della programmazione. Ad esempio, se hai raggiunto il punto della tua carriera in cui potresti presto passare dalla programmazione in un'altra area come Gestione, Ingegneria dei sistemi, Vendite / Marketing, ecc. Se pensi di voler spostarti in una nuova area in nei prossimi anni mi concentrerei di più sulle competenze necessarie per sviluppare in quell'area, piuttosto che sull'arte della programmazione.


1

Dovresti sapere cos'è e cosa sta facendo il computer. Imparare qualcosa come Knuth's MIX ti aiuterà. Principalmente in grado di giudicare l'efficienza del tuo codice. Vai a prendere l'arte della programmazione per computer e leggila. Ti renderà un programmatore più intelligente.


1

Non è più ragionevole concentrarsi sullo studio di cose relative alla tua direzione? Oppure c'è un motivo per cui dovresti dedicare del tempo ad imparare le basi di basso livello in ogni caso?

Risposta:

  1. Se non hai intenzione di cambiare direzione per programmare il sistema incorporato, non c'è motivo di imparare l'assemblaggio. Anche se l'assemblaggio dipende dalla CPU, potresti apprendere alcune nozioni di base, ma le tue conoscenze si baseranno sull'architettura della CPU e sul set di istruzioni per quella CPU.
  2. Diciamo che codice per Windows. Se vuoi imparare un linguaggio di livello inferiore rispetto a quello di alto livello che potrebbe avvantaggiarti della direzione corrente, ti consiglio di imparare Windows I in profondità, API di Windows, gestione della memoria di Windows, ecc. Basta imparare il sistema operativo / piattaforma che stai codificando.
  3. Migliora le tue abilità sul tuo attuale linguaggio di alto livello, come la gestione della memoria, la raccolta dei rifiuti ecc. Se vuoi passare a un livello basso.

0

Penso che tu raggiunga un punto di rendimenti decrescenti mentre la tua carriera avanza. Cioè, dovresti imparare presto il linguaggio degli assemblaggi, poiché porta a una migliore comprensione fondamentale di tutto ciò che viene dopo. Tuttavia, se sei già nella forza lavoro e hai qualche anno di esperienza, avrai già un'idea del modo in cui funzionano le cose, quindi l'apprendimento dei dettagli effettivi potrebbe non fornirti così tante informazioni .


0

Non so quanto sarebbe utile studiare l'assemblaggio. Ma almeno fare un po 'di programmazione in un linguaggio come C sarebbe utile. Di recente ho dovuto fare un po 'di programmazione in C e l'ho trovato piuttosto illuminante. C rimuove gran parte dell'astrazione presente nelle lingue di livello superiore. Quelle astrazioni non arrivano senza un costo. Devi gestire più dettagli di livello inferiore in C, dove come in una lingua di livello superiore tali dettagli vengono gestiti per te. Facendo un po 'di programmazione in C dovrai prendere coscienza di quei dettagli. Quindi, quando torni nella tua lingua di tutti i giorni, avrai ancora quella consapevolezza e apprezzerai meglio ciò che sta realmente accadendo. Ciò dovrebbe aiutarti a renderti un programmatore migliore.


0

Nella professione di insegnante, almeno qui nel Regno Unito, gli insegnanti devono essere qualificati molto al di là di ciò che insegnano. Un insegnante di scuola media superiore dovrebbe essere laureato nella materia che ha insegnato, e anche gli insegnanti di scuola elementare hanno titoli di studio e devono essere competenti in tutte le materie principali fino a un livello GCSE di buona qualità (scuola superiore esami di uscita ?, nessun vero equivalente negli Stati Uniti).

Perché? Perché per insegnare qualcosa di buono, o davvero usare qualcosa di buono, devi capirlo. Ciò richiede la comprensione della struttura sottostante, la catena di decisioni che precede quella con cui stai lavorando. Per comprendere correttamente il codice di alto livello, è necessario comprendere il livello su cui è costruito, come funziona, dove si trovano i suoi punti di forza e di debolezza. Questo è ricorsivo, per comprendere il livello sottostante, è necessario comprendere anche il livello sottostante.

Alla fine, questo è il motivo per cui i decenti corsi universitari / di informatica in Informatica richiedono buone capacità matematiche prima di ogni altra cosa, poiché questo è effettivamente il gradino più basso.

Maths -> Physics                ->
      -> Chemistry -> Materials -> Hardware Design -> Microcode      -> Assembler
                                                   -> Bus Interfaces -> Peripherals

... Assembler    -> Low Level      -> High Level   ->
... OS / Drivers -> API Level      -> Applications -> User

Se ti manca la conoscenza in queste aree, la tua comprensione è compromessa sotto di essa. Più è vicino al livello in cui operi un altro livello, più è importante avere un radicamento in esso.

Quindi: devi conoscere assemblatore come programmatore di alto livello?  Aiuterà.


0

Era stato molto importante nella mia vita precedente come guru di supercomputer. Allora sentivo che non avresti capito una macchina fino a quando non avessi scritto almeno diverse centinaia di righe di assemblatore, e mi sarei armeggiato cercando di ridurre le prestazioni. Dato che pochissimi programmatori volevano andare così in profondità, mi ha reso davvero indispensabile. E ho ancora un linguaggio comune quando parlo con i tipi di designer HW.

Ma in realtà il bisogno / beneficio per questo è in gran parte un paio di decenni passati. Tra i progressi del compilatore e l'esecuzione avanzata fuori servizio HW c'è ben poco spazio per poter interpretare l'eroe scrivendo più assemblatore. Sebbene ritenga utile capire come funzionano le cose. Ho intenzione di insegnare ai miei figli (matricole CS major) a programmare in un assemblatore molto semplificato su una semplice macchina virtuale, solo così hanno un'idea di ciò che accade. Speriamo di poter giocare con cose come lo srotolamento, il pipelining del software, le cache e il prefetching, il caricamento in basso ecc. Quindi almeno sapranno che ad un certo livello queste cose stanno succedendo.

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.