Creazione di un compilatore

di il
17 risposte

Creazione di un compilatore

Salve a tutti
qualcuno di buona volontà mi potrebbe spiegare o fornire qualche sito utile
per l'implementazione del PE di un programma eseguibile windows.
ho visto qualcosa su internet ma sinceramente non ho capito dove avviene il passaggio tra l'header del dos e quello di windows.
siccome gli altri passi su come fare il compilatore li ho compresi mi manca questo passaggio prima di iniziare l'opera.
grazie a tutti.

17 Risposte

  • Re: Creazione di un compilatore

    Non ho capito il problema ...

    Di che tipo di compilatore stiamo parlando?

    Esattamente cosa intendi con passaggio tra header DOS e Windows ?
  • Re: Creazione di un compilatore

    Allora nel header di un file exe (modello windows"
    c'è una prima parte che riguarda l'header dos poi c'è il dos stub e poi inizia il PE.
    adesso il dos stub l'ho capito che mi scrive un messaggio di errore e termina il programma.
    quello che non ho capito e come fa il sistema a passare dal dos header al PE
    visto che nel dos header ci sono le informazioni preliminari del programma.
    e siccome vorrei far produrre al mio compilatore direttamente l'eseguibile dovrei creare anche il PE
    ergo se non capisco il passaggio, mi sarà impossibile crearlo.
  • Re: Creazione di un compilatore

    Hai gia' letto questo?
    https://msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx


    (ecc. Con Google si trova un sacco di informazioni al riguardo)

    Quindi hai implementato un compilatore che da un linguaggio custom genera direttamente il binario per processori Intel?
    Se lo hai fatto, sei piu' avanti del 99.99999...% dei programmatori piu' bravi. Difficilmente troverai qualcuno in grado di aiutarti.

    In generale quello che si fa e' convertire un linguaggio custom in uno standard (generalmente C o C++) e usare i compilatori gia' disponibili per questi linguaggi per generare l'eseguibile.
  • Re: Creazione di un compilatore

    Sto sulla buona strada
    per il momento ho scritto l'analizzatore lessicale e quello sintattico.
    mi resta da fare la codifica in assembler compreso di ottimizzazioni e appunto creare il file eseguibile.
  • Re: Creazione di un compilatore

    È un like cobol con comandi tutti italiani.
    credo che alla fine non sia meglio di quelli che stanno in commercio ma la soddisfazione sarà grande.
  • Re: Creazione di un compilatore

    Qualcuno sa come funzione o dove posso trovare informazioni sul loader di windows?
    grazie anticipatamente
  • Re: Creazione di un compilatore

    La prima cosa da sapere è che nemmeno il c/c++ generano direttamente codice macchina, ma bensì traducono in assembly che a sua volta viene tradotto in codice macchina e che a sua volta viene generato l eseguibile.

    Già riuscire in tutti questi passaggi è difficilissimo, parlare dunque di generare direttamente codice macchina per di più ottimizzato è da pazzi!
    conosci il comando MOV dell assembly? sai quanti codici macchina corrispondono a quel comando sullo stesso processore?
    scrivere anche solo l assemblatore per tale comando è un impresa, e sempre rimanendo in un solo tipo di processore(architettura).

    Traduci il tuo linguaggio in assembly dallo in pasto ad un assemblatore e puoi realmente dire di aver creato un linguaggio, se lo riesci anche ad ottimizzare e renderlo "usabile" avrai ben presto un lavoro nelle più prestigiose software house
  • Re: Creazione di un compilatore

    Grazie per il consiglio.

    lo conosco bene il processo di una compilazione cosi come conosco bene i processi di un compilatore
    altrimenti non mi sarei mai accinto a scriverne uno.
    per quanto riguarda l'ottimizzazione del codice macchina la mia idea era quella di procedere per gradi visto che ogni istruzione assembler ha moltemplici codifiche.
    comunque visto che non trovo informazioni abbastanza dettagliate per procedere come avrei voluto.
    per il momento procederò cosi come mi hai consigliato.
  • Re: Creazione di un compilatore

    Più che convertirlo in assembly io ti consiglio il c, una volta ottenuto la traduzione compili e via.
    In questo modo sei subito portabile, ovvero puoi mettere il tuo linguaggio on line e io che ho arm ad esempio posso provarlo.
    Sarebbe già anche automaticamente ottimizzato per i vari x86.
    Una volta fatto ciò io esaminerei il codice assembly uscito dal compilatore e inizierei le varie ottimizzazioni.
    Ad esempio potresti decidere di usare la traduzione in assembly solo per certe architetture e solo per certi s.o. e lasciare la traduzione al c per gli altri.Fai un passo alla volta, ti darà più soddisfazioni.
  • Re: Creazione di un compilatore

    Grazie per il consiglio è per l'aiuto
    ma il c/c++ già lo uso per gli elementi che creano il compilatore e non gradisco molto questo linguaggio perchè e troppo legato alle librerie esterne.
    lo sò che ciò è la sua potenza ma non di rado con le librerie esterne mi insamo!
    vorrei utilizzare il meno possibile le librerie esterne infatti stò già riscrivendo le funzioni di cin e cout per adattarle al compilatore.
    per caso conosci un programma, possibbilmente free, che permetta di esportare le funzioni da una libreria?
    potrebbe tornarmi utile per la messa a punto del compiltore.
    alla fine produrrò il codice assembler così sarà un soddisfazione immensa.
    poi lo metterò su internet e vedrò un pò cosa ne pensa la gente.
  • Re: Creazione di un compilatore

    Penso tu stia facendo un po di confusione.
    Se pensi che il c sia legato a librerie esterne sappi che l assembly è ancora peggio!
    Prendiamo il semplice caso di un comando chiamato Print tale comando vuoi che stampi su terminale/console un carattere.
    Col c otterresti la traduzione semplicemente con
    "putchar(autovar);"
    Con l assembly invece non puoi perché dipendi direttamente dalle librerie del s.o. (sempre che tu non ti appoggi alla libc o altro) quindi il compilatore oltre a capire che architettura bisogna usare deve anche considerare in che s.o. sta operando perché sei ultravincolato!
    Come vedi anche l assembly è vincolato da delle librerie come tutti i linguaggi.
    Per di più il c è veramente poco sopra all assembly.
    Infatti nessuno ti obbliga ad usare la putchar, ma bensì potresti usare direttamente le funzioni del s.o. che permettono tale operazione.

    Cerca di usate un altro linguaggio, anche il python o il java.Il tuo linguaggio sarà operativo a breve con grosse soddisfazioni.

    Sei per caso su git?
  • Re: Creazione di un compilatore

    smalldragon ha scritto:


    grazie per il consiglio è per l'aiuto
    ma il c/c++ già lo uso per gli elementi che creano il compilatore e non gradisco molto questo linguaggio perchè e troppo legato alle librerie esterne.
    lo sò che ciò è la sua potenza ma non di rado con le librerie esterne mi insamo!
    vorrei utilizzare il meno possibile le librerie esterne infatti stò già riscrivendo le funzioni di cin e cout per adattarle al compilatore.
    per caso conosci un programma, possibbilmente free, che permetta di esportare le funzioni da una libreria?
    potrebbe tornarmi utile per la messa a punto del compiltore.
    alla fine produrrò il codice assembler così sarà un soddisfazione immensa.
    poi lo metterò su internet e vedrò un pò cosa ne pensa la gente.
    Come ti ha detto vbextreme, le librerie non sono un'opzione, ma una necessita. Senza di quelle non accedi al filesystem alla tastiera, al monitor, alle funzioni matematiche, alla gestione delle stringhe, alle collezioni, e a N-mila altre cose.

    A parte il fatto che bisogna vedere che cosa tu intendi per librerie esterne.

    Ma passiamo alla domanda fondamentare:

    sai che cosa e' lex e yacc, o flex e byson, o antlr?

    Perche' anche i compilatori piu' moderni non sono scritti a mano ma si parte da prodotti del genere che, guarda caso, possono generare direttamente c/c++/java
  • Re: Creazione di un compilatore

    Non conosco questi software ma immagino che siano dei generatori.
    anche se riconosco la loro utilità nello sviluppo del codice e l'enorme tempo risparmiato non li userò perché, secondo me, levano molto il divertimento al programmatore.
    è poi essendo dei generatori credo che sviluppino,ma ripeto non conosco i prodotti e quindi non posso esserne certo, in maniera standard è qualunque cosa che vada fuori dagli standard, cioè originale, comunque dovrebbe essere riscritta da zero con la difficoltà però che non conoscendo le librerie che usa mi sarebbe più difficile.
    e se un linguaggio offre ciò che offrono anche gli altri linguaggi ,a parte il divertimento nel crearlo, non sarebbe molto utile non trovate?
    per quanto riguarda le librerie vorrei usare solo quelle del sistema operativo per esempio la windows.h e poche altre.
    le funzioni matematiche ahimè le dovrò riscrivere tutte perché nel mio linguaggio sarà previsto solo un tipo di dato numerico chiamato numero che gestirà al massimo 50 cifre e ingloberà tutti i tipi di variabili numeriche quali ad esempio short,int,double,float etc etc
    in poche parole sarà un campo adattativo.
    questa ad esempio sarebbe una delle differenza tra il mio linguaggio e gli altri.
    se qualcuno conosce il sito di un programma, preferibilmente free, che estrae le funzioni da una dll mi darebbe una grossa mano con le funzioni matematiche.
  • Re: Creazione di un compilatore

    Prova a postare la grammatica del tuo linguaggio.

    Quindi, se non hai usato i software indicati, vuol dire che l'automa a stati finiti usato per implementare l'analizzatore lessicale lo hai implementato a mano. Stessa cosa per l'analizzatore sintattico, usando un'implementazione ricorsiva discendente.

    Non capisco cosa intendi per se qualcuno conosce il sito di un programma, preferibilmente free, che estrae le funzioni da una dll mi darebbe una grossa mano con le funzioni matematiche.

    Da quale DLL?
    Estrarre in che senso? Ottenere il sorgente? Dipende dalla DLL, se e' nativa, non si puo' fare, o meglio, puoi ottenere l'assembler. Se e' una DLL .NET, si potrebbe fare, ma non ha molto senso. Te ne fai ben poco di un sorgente in C#.

    Inoltre,, implementare le funzioni matetmatiche non e' banale. Gia' la sottrazione e' complicata. La moltiplicazione ancora di piu'. Per non parlar della divisione. Se poi parliamo delle funzioni logaritmiche, trigonometriche, o exponenziali, ...

    Nota: non una grande idea quella del campo adattativo. Meglio un unico tipo di oggetto numerico. Cosi' eviti di dover fare del casting, e sopprattutto dover implementare del codice che controlla quale e' il tipo numerico piu' esteso e fare il casting verso quello (se sommi uno short con un double, il risultato deve essere double, non short)
Devi accedere o registrarti per scrivere nel forum
17 risposte