Dall'assembly ai linguaggi di alto livello

  • Autore discussione Autore discussione Utente 125751
  • Data d'inizio Data d'inizio
Pubblicità
Da come lo dice sembra che la scelta sia personale. Non penso che tu abbia voluto dire cio', per cui rettifico: in campo professionale non si sceglie un linguaggio (o qualsiasi altra cosa) solo perche' piace, c'e' tutta una serie di fattori che occorre tenere conto. A volte c'e' piu' di una scelta, a volte la scelta perfetta non esiste. Anche nel campo amatoriale dovrebbe essere cosi', se uno conosce solo un linguaggio ovvio e' limitato a quello, altrimenti sceglie quello che meglio si appresta allo scopo. Faccio un esempio stupido: un amatore per hobby puo' decidere di costruire una sedia in legno, in casa ha un coltellino svizzero e usa quello, mentre un professionista usera' tutta una serie di strumenti diversi, usera' un martello per piantare chiodi (anche se basterebbe il tacco di una scarpa) e un cacciavite per mettere viti (anche se basta la lama di un coltello).
La metafora del linguaggio-attrezzo, seppur limitante, mi piace. Per rimanere nella metafora diciamo che uno strumento si sceglie in base all'uso che se ne deve fare e non per estetica. Anzi, dal punto di vista estetico direi che la "bellezza" è data dalla miglior sintesi tra forma e funzione.

Esistono poi varianti degli stessi attrezzi per attività specifiche.. il martello del carpentiere o del muratore. Così come si possono usare attrezzi in modo improprio andando incontro a difficoltà nello svolgere il lavoro e dover accettare compromessi.

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
La metafora del linguaggio-attrezzo, seppur limitante, mi piace. Per rimanere nella metafora diciamo che uno strumento si sceglie in base all'uso che se ne deve fare e non per estetica. Anzi, dal punto di vista estetico direi che la "bellezza" è data dalla miglior sintesi tra forma e funzione.
...
Esattamente. A parita' del resto, poi certo anche l'occhio vuole la sua parte, per esempio quando compriamo una auto non la scegliamo SOLO in base alla cilindrata. Per il software e linguaggi di programmazione e' lo stesso, il fattore personale influenza, non siamo formichine tutte uguali :) ci mancherebbe.
 
Tanto per rimanere nel settore linguaggi, a me piace (tra altri) il Python, che in ufficio uso per scripts e non mi sogno minimamente di usarlo per altri scopi, mentre a casa per uso personale lo uso quasi per tutto.
 
Tanto per rimanere nel settore linguaggi, a me piace (tra altri) il Python, che in ufficio uso per scripts e non mi sogno minimamente di usarlo per altri scopi, mentre a casa per uso personale lo uso quasi per tutto.
E sono d'accordo con te! È veramente duttile e potente e pratico.. da un po' di anni lo sto usando anch'io per lavoro in mille modi: mi sono fatto un menù visuale con cui distribuisco localmente piccole applicazioni di utilità ai vari uffici.

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
Scusa, con tutto il rispetto, mi pare tu sia ferrato su molti concetti ma qui hai detto troppe imprecisazioni, o non ti sei spiegato bene. Come quando precedentementi dissi che il Assembly non esistono funzioni o strutture.
Stai piu' attento quando ti esprimi per favore. Confondi le idee ai neofiti.
Però è vero che l' Assembly non possiede variabili, funzioni e strutture. Sono concetti che vengono introdotti dall' Assembler

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
Però è vero che l' Assembly non possiede variabili, funzioni e strutture. Sono concetti che vengono introdotti dall' Assembler

Inviato dal mio Nexus 5 utilizzando Tapatalk
Qui il discorso diviene complicato. Teniamo conto che nessuno usa il linguaggio macchina, bensi' un assemblatore, che il piu' delle volte ha una corrispondenza biunivoca con il assembly. Quindi e' sbagliato dire che l'Assembly non abbia variabili e funzioni, le ha eccome ma non nella maniera in cui le pensiamo banalmente noi.
 
Scusa, con tutto il rispetto, mi pare tu sia ferrato su molti concetti ma qui hai detto troppe imprecisazioni, o non ti sei spiegato bene. Come quando precedentementi dissi che il Assembly non esistono funzioni o strutture.
Stai piu' attento quando ti esprimi per favore. Confondi le idee ai neofiti.

Ho cercato di esprimere in maniera riduttiva il concetto e ovviamente si è persa parte della realtà.

Tuttavia tecnicamente l'assembly è l'insieme delle istruzioni macchina in formato mnemonico. Tutto il resto è dato dall'assembler e lì c'è molta varianza. Citavo il HLA di Hyde, ma ho pensato che non è il caso di includerlo nell'insieme dei linguaggi assemblativi.

Inoltre non ho considerato le call come funzioni vere e proprie, in quanto molto diverse semanticamente dalle funzioni implementate nei linguaggi astratti.
 
Qui il discorso diviene complicato. Teniamo conto che nessuno usa il linguaggio macchina, bensi' un assemblatore, che il piu' delle volte ha una corrispondenza biunivoca con il assembly. Quindi e' sbagliato dire che l'Assembly non abbia variabili e funzioni, le ha eccome ma non nella maniera in cui le pensiamo banalmente noi.
Mah, io direi piuttosto che, com'è ovvio che sia, l'assembly offre la possibilità di gestire la memoria nella forma più libera. Per praticità operativa l'assembler (cioè quel software che permette di rendere intellegibile il linguaggio macchina permettendo di usare dei codici al posto di numeri) che in origine si limitava a trasformare il codice, ha sempre in forma maggiore, consentito di aggiungere pian piano forme di astrazione di livello superiore.

Personalmente mi è successo di vivere in prima persona questa evoluzione passando dalla programmazione utilizzando i "monitor" (non so chi di voi sa di cosa si tratta, spero almeno per ragioni anagrafiche @Andretti60 ) con cui scrivevi praticamente direttamente l'assembly, ai vari macro-assembler più meno evoluti per Amiga o per PC. Ovviamente, la cosa è diversa per chi poteva utilizzare Unix per cui esistevano già strumenti molto più evoluti.

Se tu programmi direttamente in assembly utilizzando per esempio, appunto un monitor, le variabili così come le costanti te le devi definire per convenzione utilizzando lo spazio di memoria e gestendola totalmente definendo regole e modalità... Una variabile può essere un byte, un insieme di byte o anche uno o più bit all'interno di una singola locazione.

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
... non so chi di voi sa di cosa si tratta, spero almeno per ragioni anagrafiche @Andretti60 ) con cui scrivevi praticamente direttamente l'assembly, ...
Anche peggio, non avevamo neanche una tastiera, solo una riga di interruttori per digitare l'istruzione in binario, piu' un pulsante di invio e uno di run, erano i primi anni 80. Ci scrissi un controllore di temperatura, usando una resistenza e una convertitore DAC. Non c'era nemmeno monitor o stampante, si sperava che quello che si era scritto fosse corretto. e ovviamente nessuna memoria statica, tutte le volte che lo si assendeva partiva da zero. Per lo meno era un processore a 8 bit e non 32 o 64, altrimenti sarei ancora la' a pigiare pulsanti. Non ricordo che computer fosse, forse auto costruito nel laboratorio della universita'.
 
Caspita, non vedevo una discussione con post così lunghi da qualche anno penso. Avrei voluto rispondere questa mattina, ma purtroppo non mi era possibile.
Partecipo, giusto per dire la mia, e chiedo venia se mi ripeto quando magari ci sono già state risposte a qualche parte, ma leggere tutto il thread è difficoltoso... :D

I pc, i server e le workstation non fanno parte del settore embedded ed ovviamente nenemmeno di quello Iot.

Non è vero che nell' ambito elettronico l' archettura x86 praticamente non esiste.
Poi non è vero che è tutto dominato da Arm e Avr.

Purtroppo, o per fortuna, è così. Lo smartphone che hai in mano (il processore, intendo) è più probabilmente un ARM che un Intel.

Dove si trovano queste pile ci codice già scritto da altri?

Le pile di codice di terzi sono tutte le API che andrai ad utilizzare quando programmerai. Che senso ha reimplementare, ad esempio, la printf del C (a parte scopi didattici)? Posto che in qualche modo dovrai stampare su console, o leggere/scrivere un file... e che quindi dovrai interfacciarti con un'API da qualche parte (magari con il sistema operativo stesso).

Inoltre non ho considerato le call come funzioni vere e proprie, in quanto molto diverse semanticamente dalle funzioni implementate nei linguaggi astratti.

Semanticamente saranno anche diverse, ma in pratica la chiamata ad una funzione è una CALL che faresti in assembly. Le funzioni quindi esistono anche in asm, solo con meno livelli di astrazione; poi che non ci sia una corrispondenza tra CALL/RET... questo è vero.
Intendo dire che la CALL alla funzione A è 'solo' il cambio di indirizzo in IP/EIP/RIP ed un salto (visto il cambio di indirizzo) a quell'indirizzo. Quando avviene il RET, in teoria, ci potrebbe essere qualsiasi altro indirizzo in ESP e saltare quindi altrove.
Oltretutto una funzione ha comunque un prologo ed un epilogo. Quindi non condivido in toto questa parte.

Questo qui per me è strutturato e modulare visto che non tutte le righe hanno la stessa tabulazione ed più mov ax etc.. ed Int 21H si trovano all' interno di START:; etc... di ends

Se fosse stato un programma non-strutturato ogni riga di istruzione avrebbe avuto la stessa tabulazione e non ci sarebbe nessun sottoprogramma (o come si chiama).

@Cibachrome fatico un pò a comprendere questo attaccamento alla sintassi... sull'essere o meno strutturato, ho visto che ti hanno già risposto.

START è solo il punto di ingresso, è l'etichetta del blocco in questione. Normalmente il programma inizia l'esecuzione, ma come si fa con linguaggi ad alto livello, lo svolgimento è all'interno di altre funzioni (e file). Oltretutto gli esempi che riporti sono dell'8086 (16bit) e girano sotto al DOS; INT 21h, che è il vettore dei servizi del DOS.
Per fortuna le chiamate avvengono in maniera differente ora (non che interagire con la WinAPI sia comodissimo...).

CMP in Asm non corrisponde a == in C. In C è If.

Eh no. CMP sta per Compare cioè confronta. Il confronto in C/C++ è dato da ==

Ni. Per amor di precisione: CMP, compare, effettua una sottrazione - ed il risultato viene scartato - e l'esito provoca un cambiamento di alcuni bit in EFLAGS. TEST è analogo, ma effettua una AND.
Poi si utilizza solitamente una delle tante istruzioni di salto condizionato, che leggono bit specifici e decidono se "jump is taken" oppure no.


Comunque @Cibachrome visto che mi è parso di capire che non hai mai affrontato la programmazione... scegli un linguaggio che ti interessa, ed inizia a studiare (oltre che a far tanta pratica). Quando ne conoscerai bene uno, apprenderne altri - anche se meno bene - non sarà così complesso. La parte più importante rimane in ogni caso la mentalità, il modo di pensare (come ho già detto in altri interventi più e più volte), la capacità di risolvere problemi.

Più sopra, non ricordo bene in quale post, ho visto che sei un tipo che passa alla pratica e che non ama molto la teoria. Permettimi di dirti invece che non è sufficiente leggere qua e là interventi su blog, forum o seguire qualche video da 10 minuti su youtube. La teoria è parte integrante, considerando che la disciplina in questione attinge da un sacco di altri grandi settori (ad esempio, matematica) e che l'informatica stessa... è enorme. ;)

Anche peggio, non avevamo neanche una tastiera, solo una riga di interruttori per digitare l'istruzione in binario, piu' un pulsante di invio e uno di run, erano i primi anni 80. Ci scrissi un controllore di temperatura, usando una resistenza e una convertitore DAC. Non c'era nemmeno monitor o stampante, si sperava che quello che si era scritto fosse corretto. e ovviamente nessuna memoria statica, tutte le volte che lo si assendeva partiva da zero. Per lo meno era un processore a 8 bit e non 32 o 64, altrimenti sarei ancora la' a pigiare pulsanti. Non ricordo che computer fosse, forse auto costruito nel laboratorio della universita'.

Ho sentito qualche storia tipo questa... ho conosciuto qualche programmatore attorno - attualmente - ai 65/70 anni, e e ne ha raccontate di ogni. :D
Forse era un bel periodo in fondo (io non ero ancora nato)... ora come ora, sarà l'astrazione, la mentalità o atro, ma si sta perdendo un pò quel livello di competenze un pò più approfondito, e tanti programmatori finiscono per utilizzare cose senza avere la più pallida idea di come funzionino, o fregandosene completamente (anche di aspetti che meriterebbero di essere approfonditi, almeno per sapere la loro esistenza, prima di scrivere del codice).
 
... Inoltre non ho considerato le call come funzioni vere e proprie, in quanto molto diverse semanticamente dalle funzioni implementate nei linguaggi astratti.
Beh, Assembler e' semanticamente diverso da tutti i linguaggi :) ma il concetto di funzione e' lo stesso: si salva lo stack, ci si mettono i parametri usati dalla funzione, si salvi il puntatore di esecuzione sostituendolo con l'indirizzo della funzione (la implementazione e' diversa a seconda del assembler). Ovviamente e' tutto piu' laborioso, ma il concetto e' lo stesso, infatti quasi tutti i linguaggi di programmazione avanzati (Pascal, Fortran, C e affini, perfino Basic) permettono di chiamare funzioni scritte in linguaggio macchina purche' rispettino la stessa "calling convention".
 
Anche peggio, non avevamo neanche una tastiera, solo una riga di interruttori per digitare l'istruzione in binario, piu' un pulsante di invio e uno di run, erano i primi anni 80. Ci scrissi un controllore di temperatura, usando una resistenza e una convertitore DAC. Non c'era nemmeno monitor o stampante, si sperava che quello che si era scritto fosse corretto. e ovviamente nessuna memoria statica, tutte le volte che lo si assendeva partiva da zero. Per lo meno era un processore a 8 bit e non 32 o 64, altrimenti sarei ancora la' a pigiare pulsanti. Non ricordo che computer fosse, forse auto costruito nel laboratorio della universita'.
Beh, forse era un po' prima, all'inizio degli anni 80 c'era roba ben più evoluta! Comunque un "programma monitor" non è uno schermo video ;)

In ogni caso, mi sorprende che proprio tu consideri una banale e indispensabile istruzione di salto (non dico magari un interupt) alla stregua di una "funzione" di un linguaggio di alto livello.. personalmente la considero una grande forzatura! Anche il basic possiede il tanto martoriato stantment di salto incondizionale GOTO (in realtà, paradossalmente esiste anche nel tanto intellettuale Pascal) con cui potresti costruire delle sottospecie di funzioni!

Anche istruzioni CALL-RET già piuttosto complesse e presenti nel microcodice di architetture CISC un po' più evolute, tipo x86 appunto, sono dei salti a procedure, ma non proprio funzioni !!!

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
Beh, forse era un po' prima, all'inizio degli anni 80 c'era roba ben più evoluta! Comunque un "programma monitor" non è uno schermo video ;)

In ogni caso, mi sorprende che proprio tu consideri una banale e indispensabile istruzione di salto (non dico magari un interupt) alla stregua di una "funzione" di un linguaggio di alto livello.. personalmente la considero una grande forzatura! Anche il basic possiede il tanto martoriato stantment di salto incondizionale GOTO (in realtà, paradossalmente esiste anche nel tanto intellettuale Pascal) con cui potresti costruire delle sottospecie di funzioni!

Anche istruzioni CALL-RET già piuttosto complesse e presenti nel microcodice di architetture CISC un po' più evolute, tipo x86 appunto, sono dei salti a procedure, ma non proprio funzioni !!!

Inviato dal mio Nexus 5 utilizzando Tapatalk
Scusa, quale sarebbe in questo contesto la differenza tra "procedure" e "funzioni".
C'e' una enorme differenza tra CALL/RET (presenti anche nei primi assembler, per esempio nel motorola 680x0 c'erano i BSR/JSR/RTS) e un GOTO, il primo costrutto e' tipico di una procedura/funzione (ossia un long jump seguito da un ritorno al punto di partenza).
 
Scusa, quale sarebbe in questo contesto la differenza tra "procedure" e "funzioni".
C'e' una enorme differenza tra CALL/RET (presenti anche nei primi assembler, per esempio nel motorola 680x0 c'erano i BSR/JSR/RTS) e un GOTO, il primo costrutto e' tipico di una procedura/funzione (ossia un long jump seguito da un ritorno al punto di partenza).
Lasciamo stare la mia digressione, forse inoppprtuna, sul basic.

Tornando all'assembly: la differenza tra una una "procedura" (termine già eccessivo, in questo caso infatti si tratta di ancora più elementari "subroutine" cioè la variante più complessa dei "salti" ) e una "funzione" comunemente presente nei linguaggi di alto livello è sostanziale..

sarebbe come se tu volessi sostenere che l'assembly è object-oriented.. solo perché, ovviamente, questo paradigma si può implementare con l'assembly.

In assembly non esistono variabili, funzioni e strutture.


Inviato dal mio Nexus 5 utilizzando Tapatalk
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top