Chiedi a Hackaday: impara l'assemblaggio prima, per ultimo o mai?
CasaCasa > Blog > Chiedi a Hackaday: impara l'assemblaggio prima, per ultimo o mai?

Chiedi a Hackaday: impara l'assemblaggio prima, per ultimo o mai?

Jul 15, 2023

Qualche giorno fa mi sono imbattuto in un post online in cui qualcuno indicava il libro “Impara a programmare con Assembly” e chiedeva se qualcuno avesse mai imparato il linguaggio assembly come primo linguaggio di programmazione. Ho dovuto sorridere perché, se hai una certa età, la tua prima lingua potrebbe essere stata l'assemblaggio, anche se si trattava di assemblaggio per macchine che non sono mai esistite.

Naturalmente, è successo molto tempo fa. È più probabile che, al giorno d'oggi, se hai più di 40 anni, potresti aver imparato prima il BASIC. Diventa più giovane e inizi a orientarti verso Java, Javascript o anche C. Mi ha fatto pensare, però: le persone dovrebbero imparare l'assembly e, se sì, quando?

Non sono estraneo ai linguaggi assembly, ma non sono sicuro di conoscere una risposta moderna e difendibile a questa domanda. Puoi trovare molti tutorial, ovviamente (inclusi alcuni miei). Ci sono molti casi in cui poche righe di assembly incorporato possono fare una grande differenza in un programma. Anche il debug di un compilatore difettoso può richiedere tagli di assembly. Quindi sembra che almeno alcune persone debbano ancora imparare l'assemblaggio. Ciò lascia aperta la questione di quando impararlo e, di conseguenza, chi ha bisogno di impararlo.

La mia risposta tradizionale sarebbe che tutti dovrebbero impararlo il prima possibile. Ma potrebbe essere perché è così che facevo anni fa. Non sono convinto che sia la risposta giusta per tutti oggi. Comunque farò il mio caso.

Se sei soddisfatto di scrivere codice per convalidare i codici postali in Javascript, probabilmente non avrai bisogno di imparare l'assembly. Ma se vuoi davvero diventare un grande programmatore, prima o poi dovrai affrontarlo. Impararlo presto ha alcuni vantaggi. Se capisci cosa sta realmente accadendo a livello di CPU, un puntatore in C non sembra un concetto difficile. Essere in grado di guardare l'output di un compilatore e capire cosa significa è spesso illuminante quando stai cercando di imparare qualcosa di nuovo.

L'unico problema è che il linguaggio assembly moderno è difficile. I set di istruzioni della CPU sono strani e ci sono problemi con le CPU che eseguono l'esecuzione fuori ordine. Poi c'è il codice rilocabile e altri dettagli su cui è facile inciampare e di cui non è molto utile sapere molto.

Quindi ci sono due strade da percorrere. Innanzitutto, scegli una CPU più vecchia. Qualcosa come lo Z80, il 1802 o il 6502 non è così difficile da imparare e ci sono moltissime risorse disponibili. Non hai hardware del genere? Che importa? Usa un emulatore. Probabilmente puoi anche trovarne alcuni che vengono eseguiti nel browser e hanno eccellenti capacità di debug non disponibili nell'hardware reale. Ho programmato su dozzine di CPU e sono tutte abbastanza simili. Data la stranezza del 1802, potrei non consigliarlo anche se lo adoro anch'io. D'altra parte è molto semplice da imparare. Il PDP-8 o il PDP-11 sono altri buoni candidati, anche se oggigiorno si vedono raramente come fanno le cose i minicomputer.

Oppure scegli una macchina che non esiste. La maggior parte di questi sono stati creati per l'apprendimento, quindi questo è un vantaggio, e molti di loro hanno anche emulatori moderni. Se dovessi sceglierne uno, suggerirei Mix. I libri di Knuth sono classici e utilizzano Mix. Hanno influenzato tutti, quindi vedrai echi delle idee di Knuth in ogni sistema informatico che toccherai. (Quello non è un computer quantistico, almeno.)

Basta non andare troppo indietro. Programmare l'EDSAC, il TUTAC o il 4004 probabilmente non è affatto rappresentativo dell'informatica moderna. Onestamente, nessuna di queste CPU lo è. Ma possono aiutare a preparare il terreno per affrontare processori più avanzati, se necessario. Come il vecchio adagio: devi gattonare prima di camminare e camminare prima di correre.

Potresti facilmente discutere anche dall'altra parte. Forse il linguaggio assembly ha più senso una volta capito perché sono necessari puntatori per creare elenchi collegati e perché il salto condizionale è una cosa. Se programmi da un po', alcune idee come i numeri esadecimali e gli indirizzi potrebbero già esserti familiari.

Probabilmente il momento sbagliato per impararlo, però, è quando hai un bug intrattabile e sospetti che il compilatore stia ottimizzando il tuo codice in modo errato. Oppure a mezzanotte prima di una scadenza, quando hai bisogno di eliminare quel qualcosa in più dal tuo codice.