Classi

di il
21 risposte

Classi

Salve a tutti
so che può sembrare strano è inutile!
ma siccome sono un amante dell''assembler
per approfondire lo studio su questo linguaggio
volevo sapere se c'è un uno o più libri o qualche link che spiegassero come realizzare una classe, giusto per imparare, interamente in assembler e senza dover utilizzare linguaggi di alto livello.
l'assembler a cui sono interessato e quello intel 32 e 64 bit per sistemi windows
grazie a tutti specialmente a coloro che mi aiuteranno

21 Risposte

  • Re: Classi

    Non puoi creare classi con l'assemblea, che dici?
  • Re: Classi

    Grazie per la risposta
    visto che alla fine ogni programma scritto in un linguaggio ad alto livello, di solito, viene compilato e tradotto in assembler.
    Poi, fondamentalmente, il computer lavora con l'Assembler pensavo che si potesse fare!
  • Re: Classi

    smalldragon ha scritto:


    come realizzare una classe, giusto per imparare, interamente in assembler e senza dover utilizzare linguaggi di alto livello.
    Se hai a che fare con delle classi, allora stai già usando un linguaggio di alto livello.

    Un linguaggio di basso livello in cui puoi trovare simili elementi può essere il MSIL di .NET, ad esempio, ma a questo punto non vedo l'utilità.
  • Re: Classi

    Ok dovrò rinunciare a fare le classi!
    almeno qualcosa che spieghi come funziona il meccanismo a livello di assembler per le funzioni pubbliche e private c'è?
  • Re: Classi

    Stai facendo ""casino"" TRA concetti ad alto livello che sono SPECIFICI di un linguaggio di programmazione ""ad alto livello"" e l'assembler CHE CONOSCE SOLO BLOCCHI DI MEMORIA e INDIRIZZI DI MEMORIA usati come puntatori per i dati o indirizzi per le FUNZIONI.

    In assembler NON ESISTE il concetto di privato /protetto/pubblico/packaged/... che trovi in C++, Java, C#, ...

    Per fare un esempio alternativo:
    da una parte hai il motore di Formila Uno di una Ferrari (la classe in un linguaggio come il C++) e dall'altra hai la fonderia che, dato del ferro sfuso (la memoria), lo deve fondere in una specifica forma (allocazione del bloccodi memoria). Ma perche' debba avere quella forma, alla fonderia non interessa.
  • Re: Classi

    migliorabile ha scritto:


    da una parte hai il motore di Formila Uno di una Ferrari (la classe in un linguaggio come il C++) e dall'altra hai la fonderia che, dato del ferro sfuso (la memoria), lo deve fondere in una specifica forma (allocazione del bloccodi memoria). Ma perche' debba avere quella forma, alla fonderia non interessa.
    Mi piace questo esempio.
  • Re: Classi

    Ottimo esempio
    è quello che vorrei capire io!
    con l'aiuto di qualche buon libro o con qualche buon sito
    e proprio come questi concetti di alto livello, espressi nei linguaggi, vengono tradotti in assembler.
    perchè alla fine quando vengono eseguiti, compilazione, comunque questi concetti vengono tradotti in assembler.
  • Re: Classi

    smalldragon ha scritto:


    e proprio come questi concetti di alto livello, espressi nei linguaggi, vengono tradotti in assembler.
    La trasposizione di cui parli è diversa da linguaggio a linguaggio e dipende dal compilatore, quindi non esiste un unico modo per trasformare elementi di una sintassi di alto livello (non concetti, quelli sono totalmente astratti) in una sintassi di basso livello.

    Banalmente si potrebbe ipotizzare che un metodo di un oggetto venga implementato scrivendo a basso livello una funzione e "spingendo" nei registri i valori necessari (es. parametri) compreso l'indirizzo di memoria a cui si trova la struttura che rappresenta l'oggetto stesso, e che l'accesso ai campi contenenti i valori dell'oggetto si traduca in uno spostamento nei registri degli indirizzi nei quali sono presenti queste informazioni, ma che senso ha saperlo con precisione?

    Dubito che vi siano libri o siti che si concentrino su questo aspetto. Se anche esistessero, in termini di curiosità generale basterebbe quanto detto sopra, mentre nello specifico probabilmente bisognerebbe avere una conoscenza tecnica più approfondita, ma in quel caso sarebbe sufficiente prendere un qualsivoglia compilatore opensource e analizzarne il codice sorgente.

    Qual è la finalità di tutto questo?
  • Re: Classi

    Oltre che l'approfondimento e quindi l'espansione delle conoscenze
    scrivere un compilatore per un linguaggio che voglio creare
    senza usare librerie che non quelle,giustamente, del sistema operativo di riferimento.
  • Re: Classi

    smalldragon ha scritto:


    scrivere un compilatore per un linguaggio che voglio creare
    senza usare librerie che non quelle,giustamente, del sistema operativo di riferimento.
    Secondo me, dato l'obiettivo, le conoscenze tecniche che devi acquisire vanno ben oltre quelle che (almeno a giudicare dalle domande) possiedi in questo momento, e il loro possesso renderebbe automaticamente superflua la domanda che hai posto, o comunque l'aspetto molto specifico e particolare su cui ti stai concentrando. Detto questo, come si dice, "alzo le mani"...
  • Re: Classi

    Concordo con gli altri:
    • Assembler, come tutti i linguaggi di basso livello, non conosce assolutamente classi, interfacce o qualsivoglia struttura ad alto livello
    • La conversione di strutture di alto livello in linguaggio di basso livello dipende molto dal compilatore, per cui ogni linguaggio di alto livello ha le proprie logiche
    • Per scrivere un compilatore bisogna avere un sacco di competenze su molti argomenti (programmazione, hardware, stack/heap, ...). Se però lo si fa a solo scopo didattico, allora si possono fare anche cose più semplici, senza bisogno di andare a chiamare in causa classi e interfacce
    • Se vuoi avere uno spunto su come facciano gli altri, puoi cercare online il funzionamento di compilatori OpenSource
    Aggiungo però una riflessione.
    La maggior parte dei compilatori moderni, anzichè compilare in linguaggio macchina, compila in un pseudo-linguaggio che poi viene interpretato dal loro framework.
    In questo modo consentono di scrivere un codice "ad alto livello" che può essere eseguito su tutte le macchine, senza bisogno di compilare il tutto per ogni tipologia di architettura.

    Su questa strada, tanto per citare i più famosi, ci sono Java e .NET

    Se davvero vuoi crearti un compilatore, parti dallo scopiazzare quelli:
    • Da una classe Java, generi il bytecode Java seguendo le loro regole
    • Provi ad eseguire il tuo compilato su una qualsiasi macchina in cui sia installato il runtime Java e vedi come si comporta. Quando funziona come un compilato originale, hai fatto bingo!
    Ho fatto l'esempio con Java, ma va bene anche per .NET

    E' un'idea malsana? Forse si, però guarda i lati positivi:
    • Ti fai esperienza partendo da un linguaggio già maturo e vedi quali sono le problematiche da affrontare e, nel caso, come le hanno risolte gli altri
    • Apprese le competenze di cui sopra, inventi il tuo linguaggio e converti tutto nello stesso formato usato da Java. In questo modo puoi scrivere col tuo linguaggio ma usarlo ovunque ci sia una JVM
    • Fatto tutto questo, puoi scriverti il tuo runtime per i dispositivi che vorrai supportare
    Anni fa qualcuno fece qualcosa di simile con COBOL (il cui principio è simile a quello di cui sopra). Alla fine creò un runtime più efficente di quello originale, per cui in molti hanno iniziato ad utilizzare il suo... Inutile dire che ha fatto fortuna, però sono pochissimi ad essere in grado di fare queste cose.
  • Re: Classi

    Si puo' spiegare un po' meglio.

    1) c'e' un aspetto "sintattico" del linguaggio di programmazione che, ovviamente, non ha nessun impatto in fase di esecuzione.

    che il metodo sia privato/protetto/pubblico/packaged/friend (C++), a livello implementativo non cambia assolutamente nulla. La sua "implementazione" (il codice binario) sara' SEMPRE lo stesso.

    Sono regole SINTATTICHE che aiutano il programmatorea fare meno pasticci.

    2) c'e' un aspetto "implementativo": ad esempio come vengono implementati i metodi "virtuale" in C++. Di questo si trova sui libri. Tra l'altro, una volta capito come si fa, si puo' fare programmazione OOP ANCHE in "C" (ho messo le virgolette apposta!)
    E non in modo "meno efficiente", ma esattamente con la "stessa efficienza" del "C++"

    3) tutti i compilatori compilano per una "virtual machine" di riferimento. Anche GNU C++.
    Poi, a seconda dei casi, il "pseudo assembler" puo' essere "interpretato" (java, c#), oppure ulteriormente convertito in codice macchina (GNU C/C++/Java/Ada/Go/Fortran/...).
    Vedasi l'esistenza dei "just in time compilers" che non fanno altro che convertire il "bytecode" in codice macchina, la dove trovano utile farlo.

    4) la virtual machine, a seconda dei casi, puo' essere una macchina a stack oppure a registri.
    le macchine a stack funzionano come le calcolatrici RPN, mentre quelle a registri, circa come le moderne CPU (ad esempio, i registri sono tutti uguali).

    Esempio: la suite di compilatori GNU e' fatta esattamente in questo modo.
    Se si va a vedere il numero di CPU supportate, c'e' ne sono a decine. Questo perche' c'e' solo un moduletto "relativamente" semplice da implementare per ogni nuova CPU. La rimanente parte del compilatore, quella relativa alla sintassi, non viene intaccata.
    Risulta anche "facile" aggiungere un nuovo linguaggio. Ed una volta aggiunto, sara' disponibile per TUTTE le CPU automaticamente.

    Lo stesso e' stato fatto con Java e C#: ci sono una miriade di linguaggi aggiuntivi che compilano per le rispettive vm. Una volta compilati, sono indistinguibili dal compilato prodotto dall'equivalente in Java o C#

    Ci sono corsi specifici all'univ su come si progettano i linguaggi di programmazione ed i compilatori. E ci sono anche ottimi libri di testo.

    https://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811/ref=sr_1_1?dchild=1&keywords=compilers&qid=1632702265&sr=8-1

    E' un super classico (scritto da un "Grande").

    NON PENSARE che sia un libro vecchio perche' del 2006.

    Certi principi sono "permanenti". Una volta identificati, rimarranno "per sempre".

    Il "teorema di Pitagora" e' stato scoperto nel 570 AVANTI CRISTO.
    Ha quasi 2600 anni, e NON E' obsoleto
  • Re: Classi

    @Alka, nota generale:
    SENZA SAPERE quello che si sta' guardando, anche avendo il sorgente del compilatore, non ci caveresti un ragno dal buco nemmeno in 100 anni.
    Per capirci qualcosa DEVI riscoprire tutti i concetti che sono alla base dell'implementazione di quel particolare pezzo di codice che stai analizzando.
  • Re: Classi

    Grazie
    per i consigli che mi avete dato vedrò di farne buon uso.
    anche se la mia idea era quella di svincolarmi dalle virtualmachine e dai runtime per poter tornare alla gestione diretta del sistema operativo!
    per migliorabile
    visto che già conosci il libro che mi hai consigliato
    volevo sapere
    il libro parla essenzialmente di come costruire una sintassi per un linguaggio o è più avanzato?
    cioè dalla sintassi creata come tradurla in codice eseguibile?
    ti faccio questa domanda perchè sul come creare una sintassi ho diversi libri
    ma tutti i libri che ho mi portano a questa domanda:
    ho creato la sintassi ed il programma di controllo sintassi e adesso cosa devo fare per farlo eseguire?
    cioè come mi creo il codice da eseguire?
    nei libri che ho la risposta a questa domanda non sono riuscito a capirla perchè poco documentata.
Devi accedere o registrarti per scrivere nel forum
21 risposte