Assemblea come primo linguaggio di programmazione? [chiuso]


12

Che idea credi sarebbe quella di insegnare all'Assemblea delle persone (qualche variante) come primo linguaggio di programmazione? Ci vorrebbe molto più sforzo dell'apprendimento ad esempio di Java o Python, ma si avrebbe una buona comprensione della macchina più o meno dal "giorno uno di programmazione" (rispetto almeno a molti linguaggi di livello superiore). Cosa pensi? È un'idea realistica, almeno per coloro che sono pronti a fare lo sforzo extra? Vantaggi e svantaggi?

Nota: non sono un insegnante, sono solo curioso


5
Penso che sia più adatto alle persone che studiano informatica e non all'ingegneria / sviluppo software
Imran Omar Bukhsh

1
@Imran Sono d'accordo in linea di principio, ma ogni programma a livello universitario che mi viene in mente ha una laurea in Informatica che viene guadagnata da persone che per lo più continuano a lavorare in Ingegneria del Software. (Suppongo che questa domanda riguardi una base seria per una carriera di programmazione, non ad esempio un corso di indagine delle scuole superiori)
G__

7
@Imran - L'ho trovato un po 'sorprendente. L'informatica è sicuramente più incline alla matematica e alla teoria? Più interessato a scenografie, algebre astratte e notazione asintotica che a manipolare bit e scrivere infinite ripetizioni di move-blah-to-blah.
Steve314,

2
L'informatica ha certamente argomenti astratti, ma è anche molto "vicino all'hardware" per alcuni aspetti. Una volta ho partecipato a LICS, una conferenza di informatica. Ricordo che aveva documenti sulla localizzazione dei dati di vari algoritmi di ordinamento che immagino forniscano basi teoriche allo studio dell'efficienza pratica degli algoritmi. Per quanto riguarda il montaggio, trovo personalmente che abbia qualche somiglianza con alcuni modelli di calcolo teorici (macchine di Turing, macchine da banco ...)
Joh,

1
Ogni programmatore dovrebbe almeno leggere come funziona l'assemblaggio, IMO. Mi ha dato molte intuizioni e in genere non sono il più vicino a Chrome possibile. Il linguaggio dell'assemblea di Jeff Duntemann Step by Step è una lettura divertente per i principianti.
Erik Reppen,

Risposte:


14

Sarebbe difficile ispirare un nuovo programmatore con il codice assembly. Un saluto dinamico, il sito web dell'utente è molto più interessante con meno sforzo. Non sto dicendo che le lezioni fondamentali siano le stesse, ma un corso introduttivo avrà un grande contenuto di ispirazione, altrimenti non ci sarà un secondo corso.

Ricordo che i miei primi corsi di programmazione erano stati tenuti in Scheme ed ero per lo più frustrato dal fatto che non potevo semplicemente compilare in un file .exe ed "eseguire" il mio programma (pensavo che MS Visual Basic fosse la fine della programmazione). Solo anni dopo ho capito davvero con quale potente strumento stavo giocando. Penso che l'avrei apprezzata di più e avrei ottenuto quelle lezioni meglio se avessi avuto una prima esperienza in qualcosa di un po 'più pragmatico all'inizio.


20
Ho visto molti studenti che erano molto più sorpresi mentre facevano lampeggiare i LED e muovere il motore.
whatsisname

1
@Whatsisname +1, che renderebbe una bella demo impressionante, purché possa essere fatto senza essere scoperto dall'elettronica. Naturalmente, ciò potrebbe essere fatto anche con un linguaggio di livello superiore, ad esempio l'hacking di Roomba, se il "driver" fosse una scatola nera fornita dall'istruttore.
G__

1
Molti nuovi programmatori sono stati ispirati dall'assemblaggio su VIC20, C = 64 e macchine simili.
Gaius,

2
@Gaius Non all'inizio! Accendi quelle macchine e sei in un interprete di base. L'assemblea arriva dopo una buona dose di esperienza e colpisce i limiti di ciò che può fare di base ...
G__

1
@whatsisname ma puoi usare qualcosa come un Arduino per far lampeggiare i LED e spostare i motori senza dover imparare il montaggio
Ken Liu

12

Penso che sia una pessima idea sia per gli studenti di ingegneria del software che di CS, e in generale per chiunque sia più interessato alla programmazione che all'elettronica.

Esso può essere fatto, ma non significa che deve essere fatto. In passato, il modo di fare cose davvero interessanti con i computer di casa era imparare prima l'assemblaggio. Questo a causa delle prime limitazioni hardware: i linguaggi di livello superiore non erano abbastanza potenti e abbastanza veloci. Al giorno d'oggi, puoi fare cose molto più interessanti, in un tempo più breve, con un linguaggio di livello superiore.

Cosa sembra più interessante, scrivere un prototipo veloce per un gioco semplice e giocare con le variazioni di un algoritmo o lottare con registri e cose di basso livello?


3
Come pianista, avrei sicuramente trovato più interessante entrare subito con alcune canzoni, ma per diventare decente devi esercitarti in arpeggi, scale, ecc. E poi fare cose davvero rivoluzionarie (suonare con "pianoforti preparati" e simili) devi sapere come funziona il piano dall'interno. È tutto quanto vuoi conoscere il tuo mestiere.
Giovanni,

10
@ John a CashCommons: cattiva analogia. Iniziare con l'assemblatore è come avviare martelli, tastiera, pesi e ammortizzatori. E poi passiamo alla teoria musicale (cerchio dei quinti) per spiegare il business dei tasti neri e dei tasti bianchi. Passando poi a ancora più teoria musicale prima di suonare una scala.
S. Lott

3
@ S.Lott: Ehhhhh ... non comprarlo del tutto. Posso scrivere un programma di tipo "ciao mondo" in assemblea senza preoccuparmi dei transistor. Non è necessario essere un progettista di chip per essere un programmatore. Le conoscenze di cui stai parlando sarebbero le basi per la costruzione o la riparazione di un piano, che è solo vagamente correlato alla sua esecuzione.
Giovanni,

3
@ John a CashCommons: "costruzione o riparazione di un piano". Questa è l'analogia con l'assemblatore. Un banale "ciao mondo" in assemblatore può essere scritto, ma sono solo chiamate API del sistema operativo - in effetti ignorando tutti i dettagli terrificanti di assemblatore. Per scrivere i driver I / O, l'assemblatore è essenziale. Allo stesso modo i martelli e gli ammortizzatori riguardano la costruzione e la manutenzione, non le prestazioni.
S. Lott,

1
@ S.Lott: Hmmmm ... Immagino che il particolare set di istruzioni dipenda dal chip, vero? Buon punto.
Giovanni,

7

Non penso sia un'idea terribile, ma quanto sarà complesso un programma che darai a questi studenti? Il montaggio richiede molto più lavoro. Potrebbe essere OK avviarli per cose molto semplici e poi spostarli in qualcosa in cui è più facile lavorare, una volta che hanno ottenuto un apprezzamento per lavorare al livello inferiore. Gli studenti alle prime armi a volte hanno delle idee in testa, programmano il prossimo Halo, o MS Office o AutoCAD o qualcosa del genere, e quando vedono quanto lavoro passa in un semplice linguaggio di assemblaggio, possono essere spaventati, quindi chiariscilo che ci sono cose migliori dell'assemblaggio e poi spostali su quello una volta che hanno visto i concetti. Puoi anche provare a insegnare insieme in concomitanza con qualcos'altro come C.

Inoltre, quale linguaggio assembly? Ricordo in qualche modo che MIPS era relativamente facile da lavorare e penso che funzioni in un emulatore, quindi non c'è pericolo di causare problemi alla macchina reale , anche se ora potrebbero esserci strumenti migliori di quello.

Questo potrebbe funzionare bene, se fatto bene. Solo stai attento...


+1 per la complessità della cosa problematica. Il mio voto sarebbe di contrastare alcune implementazioni assembler con implementazioni linguistiche di livello superiore. E magari usare, ad esempio, l'assemblatore 68000 in un emulatore piuttosto che x86 - Non so come si sia evoluto l'assemblatore x86 / amd64, ma il 68000 era molto più pulito e facile da usare rispetto all'8086 di allora. Forse vale anche la pena considerare: un assemblatore di macchine virtuali come è possibile ottenere con LLVM. Non è lo stesso del vero assemblatore, ma condivide molti principi simili ed è probabilmente più pertinente.
Steve314,

Insegnare ASM contemporaneamente a C suona come una buona idea
Anto

@ Steve314: non sto lavorando sull'assemblatore x86, ma sembra che sia diventato più complicato dell'8086.
David Thornley

@ David - Me lo aspetto, ma potrebbe essere diventato più semplice in qualche modo. Nei 8086 giorni, la gamma di modalità di indirizzo disponibili dipendeva dal registro in uso e dalle istruzioni. Su 68000, c'erano (per la maggior parte dei casi) registri di dati e registri di indirizzi, con ogni tipo usato abbastanza uniformemente, senza problemi is-this-an-a-base-pointer-or-what. Nel tempo, forse è cambiato? Il 68000 aveva anche più registri, risparmiando su alcuni spostando dentro e fuori la memoria. Ad ogni modo, non è necessario imparare cose SIMD per ottenere i principi di base dell'assemblatore.
Steve314,

@ David - Non posso credere di aver dimenticato (represso) l'indirizzamento segmentato. Questo era abbastanza male in un linguaggio di alto livello. Adesso ci sono di nuovo indirizzi segmentati, ma è una cosa diversa, relativa alla memoria virtuale ecc., Che i programmatori a livello di app non dovrebbero preoccuparsi.
Steve314,

7

Il montaggio è stata la prima lingua che abbiamo imparato nella scuola di elettronica (nel 1900) e sembrava una scelta naturale. Abbiamo fatto progressi attraverso i nostri corsi da componenti discreti, a logica resistore-transistor, porte logiche, circuiti integrati, processori e fino alla programmazione in assembly. Molti studenti di queste classi non avevano mai programmato in nessuna lingua prima e l'hanno preso subito.

Quindi l'assemblaggio può essere una buona scelta per una prima lingua se si pongono le giuste basi per lo studente. Per chiunque abbia l'obiettivo di essere uno sviluppatore di applicazioni o Web, tuttavia, penso che il montaggio sia probabilmente un punto di partenza di livello troppo basso.


7

Una cosa è certa, se le persone, imparando prima l'Assemblea, ce la faranno, saranno programmatori fantastici.

Questo mi ricorda quando ho imparato a guidare. Mia madre ha insistito

Impara su un'auto automatica fino a quando non ottieni sicurezza, e quindi puoi guidare le nostre auto manuali.

Il ragionamento è che non voleva che io fossi distratto da più di quanto ho bisogno di essere, tutto in una volta.

Applicalo per imparare a programmare, è necessario gettare tutto su uno studente tutto in una volta? Imparano cos'è una variabile e allo stesso tempo imparano quanti dati possono archiviare in quale tipo di registro?

Oltre la metà della mia classe ha fallito la nostra assemblea, e questo era un gruppo di persone che, a quel tempo, si erano considerate esperte di programmazione per oltre 2 anni.

La mia preferenza personale, se dovessi imparare di nuovo tutto, sarebbe iniziare con una lingua che fa il più possibile per me. Quindi, mentre imparo, mi sposto indietro verso le lingue di livello inferiore.


1
Penso che questo sia un buon consiglio. Ad un certo punto è importante essere consapevoli dei bit e dei byte e di ciò che il processore fa con loro, ma iniziare con loro è uno sforzo enormemente dispendioso perché abbiamo linguaggi come ruby ​​e python che sono perfetti per i principianti e incoraggiano eccellenti principi di ingegneria del software.
davidk01,

1
Hai considerato la possibilità che l'istruttore abbia svolto un lavoro tutt'altro che stellare nell'insegnamento del corso di lingua assembleare?
John R. Strohm,

Penso che abbia fatto un ottimo lavoro.
CrazyPenguin,

3

È un'idea realistica, almeno per coloro che sono pronti a fare lo sforzo extra?

No

ma si avrebbe una buona comprensione della macchina

Perché è vantaggioso? Potete fornire un esempio o un suggerimento su come questo possa avere valore?

Vantaggi e svantaggi?

Vantaggi: nessuno.

svantaggi:

  • Un disordine di curiosità casuali su bandiere e stati e registri e schemi complessi di indirizzamento della memoria e dispositivi I / O e DMA e interruzioni e cicli di clock e roba del genere. Nessuno dei quali aiuta a comprendere i linguaggi e l'informatica moderni basati su VM.

  • Una disconnessione dall'effettiva risoluzione dei problemi a cui i computer sono effettivamente applicati.

  • Un divorzio dagli utenti finali, i dati pratici e i problemi di elaborazione che devono risolvere.

  • Una serie inutile di spiegazioni di macchina e macchina virtuale, compilatore ed interprete e l'intera pila di tartarughe che sostengono il mondo.

  • Un sacco di dettagli "questa è l'implementazione fisica di un" oggetto "nel linguaggio di livello superiore a cui alla fine arrivano.

  • Molti "questo è il modo in cui vengono inviate le funzioni del metodo" nel linguaggio di livello superiore a cui alla fine arrivano.

  • Molte spiegazioni "questo non si applica a 80386 ma si applica al chipset 80586".

  • Molte chiamate dell'API del sistema operativo di basso livello per fare in modo che un programma ASM facciano qualcosa che sembra essere utile per qualcuno.

Il punto di un primo linguaggio di programmazione non è padroneggiare il chipset.

Il punto di un primo linguaggio di programmazione è

  1. Scopri come pensare all'informatica.

  2. Comprendi come eseguire un'elaborazione dei dati utile.

  3. Scopri come fare qualcosa. Design - codice - test.


1
@ S.Lott - Certo, non è questo il punto della mia domanda originale, ma potrebbe essere vantaggioso averli prima di passare alle lingue di livello superiore. Non fraintendermi, fai un punto valido.
Anto

3
-1 Molti dei tuoi svantaggi considero vantaggi. È meglio sapere come funziona il livello basso, prima di usarlo dall'alto. Le basi sono importanti.
Orbling

1
L'assemblatore come linguaggio di programmazione ti espone molto meglio alla struttura dei dati, alla logica e alle basi di livello più basso rispetto ai linguaggi di livello superiore. Entrambi hanno un posto, l'assemblatore potrebbe essere più semplice da comprendere rispetto alle lingue di livello superiore, a condizione che non si sia tentato di ottenere qualcosa di troppo complicato. Le persone non dovrebbero provare a fare cose complesse all'inizio.
Orbling

4
Il vantaggio dell'assemblatore è che dimostra come funziona un vero computer. Sai. La cosa su cui tutto funziona davvero .
Paul Nathan,

1
@ S.Lott - No, ma ciò significa che puoi usare molto bene la maggior parte delle vecchie conoscenze che hai raccolto e aggiungere nuove conoscenze nel tempo. Guarda, linguaggi di alto livello come Python arrivano con nuove versioni nel tempo, ma la vecchia conoscenza è ancora utilizzabile (e in realtà, Python ha rotto la retrocompatibilità con la v3)
Anto

3

Se avessi il compito di progettare un curriculum, avrei due corsi in esecuzione contemporaneamente il primo semestre: asm + organizzazione / architettura informatica di base e un corso basato su SICP fondato in Scheme. Il secondo semestre verrebbe orientato attorno a strutture di dati e algoritmi elementari in Scheme.

Il secondo anno sarebbe un progetto di un anno che utilizzava Delphi, C ++ o C #, incentrato sulla progettazione di software moderni (progettazione OO, progettazione funzionale, ingegneria del software, controllo della versione, ecc.).

L'effetto dovrebbe essere quello di dare un intenso fondamento sia in astratto che in pratico, portando a corsi di approfondimento nel terzo e quarto anno.


3

Frequentavo le lezioni introduttive di informatica, e penso che sia una cattiva idea.

  1. L'assemblaggio usa sia la logica (se questa che si dice) sia traduzioni molto difficili tra concetti e numeri. Gli studenti di Intro CS spesso lottano solo con la logica (loop, if / else, espressioni booleane), e devono davvero occuparsene prima di preoccuparsi anche di quali numeri significano quali espressioni logiche. L'uso di linguaggi di livello superiore estrae questa logica per gli studenti che non hanno avuto motivo di pensare in quel modo prima.
  2. Le lezioni introduttive CS non vengono necessariamente prese solo dalle major CS che continueranno con CS. Spesso, sono anche presi da altri specialisti in ingegneria e non-major che stanno solo "visitando" un argomento interessante per un elettivo. L'assemblaggio è ottimo per una fondazione per studenti CS impegnati, ma non offre un'ottima panoramica di ciò che la programmazione è spesso per gli studenti che considerano il maggiore o che non prenderanno mai il maggiore ma vogliono un'introduzione al campo ; né è terribilmente utile da solo nella maggior parte dei campi.
  3. Linguaggi di livello superiore rendono il nucleo del lavoro di programmazione effettivo più trasparente. L'assemblaggio colpisce alcuni argomenti fondamentali di base - concetti di memoria di base, concetti di prestazioni di base, ecc. - ma non si occupa davvero di creare un design sostenibile e leggibile, che è più importante in questi giorni, IMO. I primi studenti sembrano avere spesso le idee vecchio stile "I veri programmatori scrivono codice che nessun altro è in grado di gestire" le idee, e insegnare una lingua di livello superiore aiuta a insegnare che la codifica è un compito collaborativo e non solo essere geniale.

Detto questo, penso che l'hardware di assemblaggio / computer dovrebbe essere una classe molto precoce - idealmente, il primo trimestre del maggiore. Chiedi agli studenti di avere una lingua di alto livello sotto la cintura, quindi saltare subito a materiale hardware di basso livello prima di passare alle strutture di dati, idealmente in una lingua che richiede la gestione della memoria.


Molto ben detto - sono d'accordo. Il primo corso deve arrivare al punto, mostrare l'utilità end-to-end delle abilità apprese e lanciare l'immaginazione: "Accidenti! Posso programmare? Ora cos'altro posso fare con questa nuova abilità ..." Concordo anche sul fatto che il momento migliore per il linguaggio assembly è dopo un linguaggio di livello superiore. Ciò motiva a guardare "sotto il cofano" a come il computer sta effettivamente capendo le cose di livello superiore. Vedere il linguaggio assembly per la prima volta dopo un linguaggio di livello superiore lascia un altro impatto notevole: lo studente incontra elettronica, chip, sensori, ecc.
Assad Ebrahim

3

L'assemblea era la mia seconda lingua, subito dopo BASIC. Tuttavia, quando stavo imparando, era un momento diverso. Il mio Commodore 64 aveva altre lingue disponibili, ma se volevi che qualcosa sembrasse veloce o volessi fare più di una cosa alla volta, dovevi imparare il linguaggio assembly e come lavorare con gli interrupt. Anche il sistema operativo Graphic Environment (GEOS) che ha fornito al Commodore un sistema a finestre era tutto assemblato. È stata nel complesso la migliore API di assemblaggio che abbia mai visto. Era anche l'unica piattaforma che ho usato in cui è possibile modellare il codice. Esatto, potresti usare il corsivo e caratteri di dimensioni diverse, cosa che si è rivelata utile per leggere i commenti.

Ho imparato molto su come funzionava il Commodore, ma il chip Motorolla aveva un set di codici operativi molto semplice. Non è troppo difficile mantenere separati tra loro meno di 255 codici operativi. Io ero , non in grado di Parlay la mia esperienza sul 6510 chip di Motorolla alla programmazione per l'Intel 8086. Le patatine e architetture di sistema erano troppo diverse. Immagino che avrei avuto lo stesso problema anche nel passaggio al chip Motorolla 68000 dell'Amiga.

In breve, devo essere sinceramente in disaccordo con chiunque affermi che l'Assemblea dovrebbe essere una buona prima lingua. Ecco perché:

  • Non hai una struttura intrinseca, un modo comune di scomporre la funzionalità in un'applicazione. Questa è la cosa che rende le lingue di livello superiore così utili.
  • Devi sapere cose inutili come come chiamare correttamente un metodo in una libreria. Quando la libreria è stata creata da C, ciò significa manipolare lo stack (meglio ottenere tutto nel giusto ordine), ma in un'altra lingua potrebbe significare l'impostazione dei registri. Queste sono tutte cose che vengono prese in considerazione da un compilatore o da un interprete e non è possibile ottimizzarle.
  • Il tuo codice non può essere utilizzato su un altro chip e molto probabilmente si romperà con una piattaforma hardware diversa.

Al giorno d'oggi il linguaggio assembly viene utilizzato per accelerare determinate azioni finite in cui l'assemblaggio manuale sarebbe più rapido dell'assemblaggio generato dal compilatore. La struttura principale dell'applicazione è realizzata in un linguaggio di livello superiore come C, C ++, ecc. Naturalmente, la programmazione dell'assemblaggio diventerebbe molto importante se inizi a scrivere compilatori. Quanti di noi lo fanno?


1

Ho partecipato all'assemblea durante il mio ultimo anno di liceo. Avevo già preso lezioni in Java, Pascal, C e C ++, e non ero abile in nessuno di essi e ho davvero fatto schifo all'Assemblea - era l'unica persona che prendeva la classe in un programma di apprendimento a distanza presso il college della comunità, mi ha preso un un paio di mesi prima che qualcuno potesse anche far funzionare il compilatore per me.

Non penso sia necessario o saggio imparare prima il linguaggio assembly, ma è intelligente imparare le cose che ti insegnano nelle prime settimane di assemblaggio, su come funziona il processore e alcuni dei trucchi di debug. Quella roba che ho trovato molto interessante e illuminante come neofita.


0

Non vedo perché non sia stato possibile farlo, anche se un'idea buona è totalmente dipendente dalla folla che insegneresti anche a te. Qualcuno il cui obiettivo finale è diventare uno sviluppatore web probabilmente si annoierebbe e potrebbe smettere in quanto non darebbe loro la soddisfazione immediata di creare qualcosa che Python, Ruby, ecc. Se alla fine vogliono lavorare su hardware o altri progetti di basso livello, penso che sarebbe un buon inizio (a condizione che tu abbia abbastanza background per l'architettura del computer perché abbia senso). Penso che potrebbe aiutare le persone a scrivere codice migliore in futuro, anche se penso che sarebbe più difficile che imparare altre lingue per iniziare.


0

Penso che il linguaggio dell'assemblaggio abbia senso solo se ti concentri su cose come:

  • Tecniche di gestione della memoria
  • HW IO (in particolare sfide relative a tempi e prestazioni)
  • Funzionalità CPU - in particolare funzionalità di sicurezza

Senza un focus in quest'area, è solo un linguaggio semplicistico che tenderà a insegnare cattive abitudini organizzative. La codifica a livello di macchina è utile nel kit di strumenti per sapere come funzionano le cose, ma non è una buona lingua iniziale.

Vorrei che qualcuno fosse interessato a una lingua di livello superiore. Quindi insegnare al C ++; quindi assemblare con un focus su come i compilatori C ++ generano il codice assembly. Comprendere le v-table e altre funzionalità linguistiche di livello superiore aiuterà molto lo sviluppatore a pensare a come funzionano davvero le lingue piuttosto che archiviare le informazioni in "magia".

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.