Crea il tuo linguaggio di programmazione (I)

L'evoluzione dei linguaggi di programmazione

Dopo aver scritto il primo articolo su come creare il proprio sistema operativoQualcuno mi ha detto se potevo fare un articolo su come creare un linguaggio di programmazione. All'inizio non ho prestato molta attenzione, ma ora e in altri modi ho imparato molto di più sulla creazione di linguaggi di programmazione. Quindi facciamolo un linguaggio di programmazione di base, facilmente incorporabile in altri programmi e che funziona con una macchina virtuale che progetteremo anche noi. Oggi dobbiamo creare la macchina virtuale più semplice.

Probabilmente ti starai chiedendo: Una macchina virtuale? Ma non è molto difficile e rallenta anche i programmi? " Al contrario, una semplice macchina virtuale è molto semplice e relativamente veloce. ho scelto Ruggine come linguaggio per la macchina virtuale. Ma cos'è Ruggine?

Ruggine È un linguaggio di programmazione incentrato sulla sicurezza dell'esecuzione, quindi utilizzarlo sarà praticamente impossibile per qualcuno chiudere la macchina virtuale. È un linguaggio compilato in fase di sviluppo creato da Mozilla. Servo, il sostituto di Geco, si sta sviluppando in lui. Puoi ancora cambiare la sintassi ma il codice che userò sarà mantenuto fino alla prima versione stabile.

Ruggine si installa in Linux In modo semplice. Tuttavia, non esiste un pacco ufficiale. Utenti di Ubuntu puoi aggiungere questi due PPA: ppa: hansjorg / ruggine  y ppa: cmrx64 / cargo, utenti di Arco poter usare AUR (carico-git è il pacchetto che installa tutto). Il resto può usare:

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

Come funziona una macchina virtuale?

Se sai come funziona il mondo dell'assemblatore, è esattamente lo stesso, con lo stack o lo stack. In caso contrario, te lo spiego. Immaginiamo il seguente codice:

stampa 2 + 3

Il computer non capisce cosa significhi 2 + 3, né sa quale ordine seguire. I computer funzionano con batterie o pile in cui i dati vengono accumulati ed estratti continuamente. Quel codice nella nostra macchina virtuale dovrebbe essere simile a questo:

PUSH 2 PUSH 3 AGGIUNGI STAMPA

Fondamentalmente avremmo messo il 2 in pila in cima, anche il 3. ADD estrarrebbe (cioè rimuoverlo dalla pila e ottenere il suo valore) gli ultimi 2 elementi sulla pila e aggiungerebbe il risultato in cima alla pila. PRINT prenderebbe l'ultimo elemento in pila e lo userebbe per mostrarcelo. Ora facciamolo Ruggine.

Dobbiamo prima definire una lingua per il codice a byte, potremmo usarne uno esistente come quello in Java o CLR di .NET / Mono, ma ne creeremo uno più semplice.

https://gist.github.com/a01de8904fd39a442c20

Usiamo la notazione esadecimale per ogni istruzione. In alto abbiamo messo # [derivante (FromPrimitive)], è una particolarità di Ruggine e ci aiuterà in seguito a confrontare direttamente l'enumerazione con i byte.

Ora dobbiamo creare una funzione che esegua ciascuna di queste istruzioni. Per questo dobbiamo leggere un byte e confrontarlo con le istruzioni che abbiamo nell'enumerazione. Se trovi qualcuno che esiste, devi eseguire la tua azione.

https://gist.github.com/8950ce212a2de2f397f9

Lo facciamo per leggere singolarmente ogni byte e per eseguirli:

https://gist.github.com/12e24a1f0dd65e4cd65d

Come puoi vedere, differenziamo se ci è stato dato il comando PUSH (il nostro comando INTEGER) prima, il byte successivo verrà completamente portato nello stack. Stiamo usando due funzioni che non ti ho insegnato, self.pop () y self.push (), che ovviamente si occupano della gestione della pila.

https://gist.github.com/54147f853a8a2b8c01d9

Non sono molto complessi, ma la funzione pop ha meccanismi di rilevamento degli errori. In effetti, in Ruggine, se rimuoviamo questi meccanismi ci darebbe un errore di compilazione. Ora dobbiamo semplicemente chiamare un programma Molto (la nostra macchina virtuale) ed eseguire un bytecode.

https://gist.github.com/99b1ab461318b3a644d0

Quel bytecode può essere letto da un file, ma qui per semplicità l'ho memorizzato in una variabile. Se lo eseguiamo, ci darà il risultato atteso:

Perin v0.1 Perin VM esegue il bytecode FlopFlip Avvio dell'istanza PerinVM PerinVM v0.1.0 Valore intero 5

Tutto il codice è disponibile su GitHub sotto il Licenza Apache 2.0: https://github.com/AdrianArroyoCalle/perin. Per compilare devono avere ufficio installato e messo:

carica build && ./target/main

Nel prossimo capitolo vedremo di più sul nostro linguaggio di programmazione.


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   vagabondo suddetto

    Interessante curiosità, anche se in realtà non è molto utile, non fa male sapere.

    È fantastico che tu pubblicizzi Rust, è un linguaggio che promette molto, non solo è più sicuro del c ++, ma (per ora) più chiaro nella sua sintassi.

    Per quanto riguarda la foto, non considererei java evolution XD.

    1.    vagabondo suddetto

      E da fortran, non l'ho mai usato, ma non ne ho sentito parlare molto bene ...

      1.    foroso suddetto

        Sì, ed è particolarmente utile in ingegneria anche se Python sta guadagnando terreno.

      2.    Giovanni suddetto

        Il Fortran è forse l'altro grande linguaggio insieme a C. Ancora oggi nelle questioni veramente critiche sarà l'uno o l'altro.

        E sarebbe discutibile che Fortran sia come un '"evoluzione" di C, quando forse dovrebbe essere il contrario, poiché C è più nuovo, più moderno e con più possibilità; sebbene l'uno non sia minimamente distaccato dall'altro.

        Anche se le posizioni finali sono tutte discutibili da un certo punto di vista.

    2.    Francisco suddetto

      +1 a Java

  2.   facchino suddetto

    Vediamo se questo mi piace, do qualcosa alla programmazione ma basilare per vedere se capisco di più.

  3.   usergnuliux suddetto

    Qual è il vero scopo della creazione di un nuovo linguaggio di programmazione? Personalmente mi sembra che sia uno stratagemma per nascondere il codice sorgente.

  4.   suddetto

    Amico, che fine ha fatto la continuazione del "proprio sistema operativo"? Non lasciarlo lì, per favore continua.

    In realtà sei un maestro e queste due canzoni hanno completamente catturato la mia attenzione, ma non vorrei che si fermassero a metà strada.

    So che molti di noi la pensano allo stesso modo e stiamo aspettando il seguito e le conclusioni di questi argomenti molto interessanti.

  5.   Cristiano Davide suddetto

    Molto interessante, grazie mille. 🙂

  6.   Franco suddetto

    Non considero java un linguaggio di programmazione, piuttosto un interprete di comandi, poiché non è compilabile

    1.    Mario suddetto

      [Un linguaggio di programmazione è un linguaggio formale progettato per esprimere processi che possono essere eseguiti da macchine come i computer.]

      Per questo motivo Java è un linguaggio di programmazione. Anche il linguaggio Bash (linguaggio shell di Linux) è un linguaggio di programmazione in sé.

      Esistono due tipi di lingue:
      - Compilato
      - Interpretato
      - Misto (macchine virtuali, le librerie native vengono compilate e il codice funzionale viene interpretato)

      Gli interpreti sono molto utili quando si tratta di multipiattaforma e non hanno prestazioni disastrose per questo. Java, VB.NET, C ++ .NET, F #, C # sono tutti linguaggi misti. Il linguaggio bash, bat, PHP, Javascript e molti altri sono linguaggi interpretati.

      Se non consideri Java come un linguaggio perché è interpretato (cosa che non è) non dovresti considerare molti altri linguaggi che vengono utilizzati per creare programmi. Inoltre, in base alla regola del tre, non dovresti considerare che esiste alcun linguaggio di programmazione tranne il linguaggio macchina stesso.

      E perché no? Nemmeno il linguaggio macchina può essere considerato un linguaggio poiché in realtà è solo un insieme di comandi "interpretati" dal processore.

      Perché effettivamente, TUTTE le lingue non sono altro che un insieme di comandi che vengono interpretati da un processore.

      Potrebbe piacerti un linguaggio più o meno (Java, in questo caso), sembra più o meno utile e potente ma dire che non è un linguaggio di programmazione perché non è compilato… va contro tutte le definizioni del linguaggio di programmazione.

    2.    Mario suddetto

      😐 Spero di non essere sembrato troppo scortese

      1.    Maria Antonietta di Manuela Cardenas suddetto

        no tranquillo hai solo distrutto le nostre vite

      2.    Mario suddetto

        hahahahaha, perdoooon. non era mia intenzione xD

    3.    carlos suddetto

      java è un linguaggio di programmazione. Perché puoi sviluppare un'applicazione e quando compili crei un .jar che viene interpretato dalla JVM. Quindi secondo la tua logica python non viene nemmeno interpretato, ma si compila in diversi eseguibili ...

  7.   Elia Mongelos suddetto

    Informazioni molto buone

  8.   Carlos Arturo suddetto

    buone informazioni ma ho un dubbio, sarà possibile creare da zero un nuovo linguaggio di programmazione senza dover fare affidamento su altre analogie o software. Parlo nello stesso modo in cui sono stati creati altri linguaggi come Java o HTML.
    Apprezzerei molto il tuo aiuto su questa domanda.