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 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.
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.
E da fortran, non l'ho mai usato, ma non ne ho sentito parlare molto bene ...
Sì, ed è particolarmente utile in ingegneria anche se Python sta guadagnando terreno.
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.
+1 a Java
Vediamo se questo mi piace, do qualcosa alla programmazione ma basilare per vedere se capisco di più.
Qual è il vero scopo della creazione di un nuovo linguaggio di programmazione? Personalmente mi sembra che sia uno stratagemma per nascondere il codice sorgente.
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.
Molto interessante, grazie mille. 🙂
Non considero java un linguaggio di programmazione, piuttosto un interprete di comandi, poiché non è compilabile
[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.
😐 Spero di non essere sembrato troppo scortese
no tranquillo hai solo distrutto le nostre vite
hahahahaha, perdoooon. non era mia intenzione xD
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 ...
Informazioni molto buone
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.