-
4.00 pre-alpha hello worldScritto daaltgutente che non utieneil 2014-09-18 04:56:55.0 alle 2014-09-18 04:56:55.0Trollate totali: 11540L.in.oleum 4: ci sto lavorando.
Si lascia alle spalle molte scelte sbagliate di ben 13 anni fa.
A partire dal numero di registri, che con la loro emulazione dove non ce ne sono abbastanza passa dai miseri 5 delle altre versioni ai 26 attuali (uno per ogni lettera dell'alfabeto).
Il compilatore comprende poi un assembler interno, invece del pacchetto d'istruzioni preassemblate con gli operandi da riempire, e la sintassi, meno permissiva ma appunto per questo piu` canonizzabile (si dira` poi cosi?), ha subito cambiamenti notevoli. Adesso e` piu` pulita e discorsiva. E` inoltre un linguaggio almeno parzialmente strutturato, con cicli e blocchi condizionali complessi (c'e` perfino un equivalente di switch-case, per giunta molto piu` flessibile: un costrutto che ho chiamato when...then).
Ma la cosa buffa e` che il kickstart compiler, cioe` il compilatore che viene prima di quello scritto nel suo stesso linguaggio, e` scritto in... Javascript! E gira in un browser come front-end di un server NodeJS. Il server provvede a rispondere alle richieste del compilatore quando deve caricare una libreria, nonche` al link dell'eseguibile che poi fornisce in risposta al browser, come file da scaricare. Qui, con un po' di scena, c'e` come appare in Firefox a schermo intero e zoom al 200%:
E questo e` il primissimo hello world (scritto "a crudo", in assenza di qualsiasi libreria) che e` riuscito a compilare, linkare ed eseguire:
Di seguito il listato. Nella finestra del compilatore si possono vedere scorci della sua traduzione, da destra a sinistra, da L.in.oleum 4 alle corrispondenti istruzioni native, al corrispondente linguaggio macchina assemblato.message = 8 : { Hello_world! \} messageBytes eq 12 messageUnits eq 4 to Enter Text Mode r = ik r . displayStatus | engage r . exec leave to Swap n Units At p --> m (save register m) n times m = P (11223344) (put copy #1 of sample value into m) r = m (11223344) (put copy #2 of sample value into q) m [ 8 (22334411) (copy #1 rotates 8 bits left) r ] 8 (44112233) (copy #2 rotates 8 bits right) m & 00FF00FFh (00330011) (bytes #1 and #3 are zeroed in copy #1) r & FF00FF00h (44002200) (bytes #2 and #4 are zeroed in copy #2) m | r (44332211) (merge copies with a bit-wise OR) P = m (44332211) (write back sample value) p + 1 (access next unit to reverse bytes of) <-- m (restore register m) leave to Print Message m Of n Bytes r = ik r . fileCommand = writeFile r . fileName = stdOut r . fileBlockPointer = m r . fileBlockSize = n r . exec leave to Wait n Milliseconds r = n n = ik n . suspend leave to Begin Enter Text Mode Swap messageUnits Units At message Print Message message Of messageBytes Bytes Wait 10000 Milliseconds
Non vi sto a spiegare tutto nei dettagli senno` finisco di scrivere l'anno prossimo. Comunque e` per dire: pian pianino, sta procedendo. Ma poi neanche tanto pianino, visto che ho ripreso a lavorarci da un paio di settimane... pero` e` ancora lunghetta. Piu` o meno a livello di parser c'e` tutto, il "canovaccio" e` pronto: manca solo una fraccata di funzioni per l'assemblaggio di istruzioni, e qualche modifica alla gestione dei threads nel modulo di runtime.-
Re: 4.00 pre-alpha hello worldScritto daNon Autenticatoil 2014-09-18 09:21:13.0 alle 2014-09-18 09:21:13.0Scritto da: altg
>
> Non vi sto a spiegare tutto nei dettagli senno` finisco di scrivere l'anno prossimo. Comunque e` per dire: pian pianino, sta procedendo. Ma poi neanche tanto pianino, visto che ho ripreso a lavorarci da un paio di settimane... pero` e` ancora lunghetta. Piu` o meno a livello di parser c'e` tutto, il "canovaccio" e` pronto: manca solo una fraccata di funzioni per l'assemblaggio di istruzioni, e qualche modifica alla gestione dei threads nel modulo di runtime.
A quanto pare la stanzetta iphone style con illiminazione chirurgica da i suoi frutti.
-
Re: 4.00 pre-alpha hello worldScritto daaltgutente che non utieneil 2014-09-18 16:07:57.0 alle 2014-09-18 16:07:57.0Trollate totali: 11540> > Non vi sto a spiegare tutto nei dettagli senno` finisco di scrivere l'anno prossimo. Comunque e` per dire: pian pianino, sta procedendo. Ma poi neanche tanto pianino, visto che ho ripreso a lavorarci da un paio di settimane... pero` e` ancora lunghetta. Piu` o meno a livello di parser c'e` tutto, il "canovaccio" e` pronto: manca solo una fraccata di funzioni per l'assemblaggio di istruzioni, e qualche modifica alla gestione dei threads nel modulo di runtime.
>
> A quanto pare la stanzetta iphone style con illiminazione chirurgica da i suoi frutti.
Ah, dici che e` quella?
-
Re: 4.00 pre-alpha hello worldScritto daNon Autenticatoil 2014-09-18 16:29:49.0 alle 2014-09-18 16:29:49.0Scritto da: altg
> > > Non vi sto a spiegare tutto nei dettagli senno` finisco di scrivere l'anno prossimo. Comunque e` per dire: pian pianino, sta procedendo. Ma poi neanche tanto pianino, visto che ho ripreso a lavorarci da un paio di settimane... pero` e` ancora lunghetta. Piu` o meno a livello di parser c'e` tutto, il "canovaccio" e` pronto: manca solo una fraccata di funzioni per l'assemblaggio di istruzioni, e qualche modifica alla gestione dei threads nel modulo di runtime.
> >
> > A quanto pare la stanzetta iphone style con illiminazione chirurgica da i suoi frutti.
>
> Ah, dici che e` quella?
Oh chi si vede, il michael knight di pisa
-
Re: 4.00 pre-alpha hello worldScritto daaltgutente che non utieneil 2014-09-18 18:37:33.0 alle 2014-09-18 18:37:33.0Trollate totali: 11540> > > > Non vi sto a spiegare tutto nei dettagli senno` finisco di scrivere l'anno prossimo. Comunque e` per dire: pian pianino, sta procedendo. Ma poi neanche tanto pianino, visto che ho ripreso a lavorarci da un paio di settimane... pero` e` ancora lunghetta. Piu` o meno a livello di parser c'e` tutto, il "canovaccio" e` pronto: manca solo una fraccata di funzioni per l'assemblaggio di istruzioni, e qualche modifica alla gestione dei threads nel modulo di runtime.
> > >
> > > A quanto pare la stanzetta iphone style con illiminazione chirurgica da i suoi frutti.
> >
> > Ah, dici che e` quella?
>
>
> Oh chi si vede, il michael knight di pisa
Wow, come fai a sapere che ho ripiegato su una MX-5 perche` sarebbe stato un casino importare una Pontiac Trans-Am dell'82?
-
-
-
-
Re: 4.00 pre-alpha hello worldScritto daNon Autenticatoil 2014-09-18 19:04:00.0 alle 2014-09-18 19:04:00.0Scritto da: altg
> L.in.oleum 4: ci sto lavorando.
> Si lascia alle spalle molte scelte sbagliate di ben 13 anni fa.
>
> A partire dal numero di registri, che con la loro emulazione dove non ce ne sono abbastanza passa dai miseri 5 delle altre versioni ai 26 attuali (uno per ogni lettera dell'alfabeto).
>
> Il compilatore comprende poi un assembler interno, invece del pacchetto d'istruzioni preassemblate con gli operandi da riempire, e la sintassi, meno permissiva ma appunto per questo piu` canonizzabile (si dira` poi cosi?), ha subito cambiamenti notevoli. Adesso e` piu` pulita e discorsiva. E` inoltre un linguaggio almeno parzialmente strutturato, con cicli e blocchi condizionali complessi (c'e` perfino un equivalente di switch-case, per giunta molto piu` flessibile: un costrutto che ho chiamato when...then).
>
> Ma la cosa buffa e` che il kickstart compiler, cioe` il compilatore che viene prima di quello scritto nel suo stesso linguaggio, e` scritto in... Javascript! E gira in un browser come front-end di un server NodeJS. Il server provvede a rispondere alle richieste del compilatore quando deve caricare una libreria, nonche` al link dell'eseguibile che poi fornisce in risposta al browser, come file da scaricare. Qui, con un po' di scena, c'e` come appare in Firefox a schermo intero e zoom al 200%:
>
>
>
> E questo e` il primissimo hello world (scritto "a crudo", in assenza di qualsiasi libreria) che e` riuscito a compilare, linkare ed eseguire:
>
>
>
> Di seguito il listato. Nella finestra del compilatore si possono vedere scorci della sua traduzione, da destra a sinistra, da L.in.oleum 4 alle corrispondenti istruzioni native, al corrispondente linguaggio macchina assemblato.
>
>> message = 8 : { Hello_world! \} > messageBytes eq 12 > messageUnits eq 4 > > > to Enter Text Mode > > r = ik > r . displayStatus | engage > r . exec > > leave > > > to Swap n Units At p > > --> m (save register m) > > n times > > m = P (11223344) (put copy #1 of sample value into m) > r = m (11223344) (put copy #2 of sample value into q) > m [ 8 (22334411) (copy #1 rotates 8 bits left) > r ] 8 (44112233) (copy #2 rotates 8 bits right) > m & 00FF00FFh (00330011) (bytes #1 and #3 are zeroed in copy #1) > r & FF00FF00h (44002200) (bytes #2 and #4 are zeroed in copy #2) > m | r (44332211) (merge copies with a bit-wise OR) > P = m (44332211) (write back sample value) > p + 1 (access next unit to reverse bytes of) > > <-- m (restore register m) > > leave > > > to Print Message m Of n Bytes > > r = ik > r . fileCommand = writeFile > r . fileName = stdOut > r . fileBlockPointer = m > r . fileBlockSize = n > r . exec > > leave > > > to Wait n Milliseconds > > r = n > n = ik > n . suspend > > leave > > > to Begin > > Enter Text Mode > Swap messageUnits Units At message > Print Message message Of messageBytes Bytes > Wait 10000 Milliseconds >
>
> Non vi sto a spiegare tutto nei dettagli senno` finisco di scrivere l'anno prossimo. Comunque e` per dire: pian pianino, sta procedendo. Ma poi neanche tanto pianino, visto che ho ripreso a lavorarci da un paio di settimane... pero` e` ancora lunghetta. Piu` o meno a livello di parser c'e` tutto, il "canovaccio" e` pronto: manca solo una fraccata di funzioni per l'assemblaggio di istruzioni, e qualche modifica alla gestione dei threads nel modulo di runtime.
Questo post è una pietra miliare, lo salvo subito.-
Re: 4.00 pre-alpha hello worldScritto daaltgutente che non utieneil 2014-09-18 19:32:56.0 alle 2014-09-18 19:32:56.0Trollate totali: 11540> Questo post è una pietra miliare, lo salvo subito.
Potrebbe essere vero quello che dici.
Ah, nella "pietra miliare" c'era pero` un piccolo errore in un commento:
dove dice "put copy #2 of sample value into q"
in realta` lo mette nel registro r quindi dovrebbe finire con "into r". E` solo un commento (la roba tra parentesi e` un commento), sicche` non influisce sul funzionamento del programma, ma sbaglia a spiegare cosa fa l'istruzione a cui si riferisce. In origine usava il registro q, ma mentre ripensavo a scorciare un po' l'esempio m'e` venuto in mente che q doveva essere salvato (in quel caso e` un registro callee-saved perche` non e` tra gli argomenti, cioe` i registri che ricevono i parametri della chiamata, che in quel caso sono n e p ) mentre r e` il registro "spare", cioe` una specie di registro temporaneo che non c'e` mai bisogno di salvare, quindi usando r al posto di q potevo risparmiare di usare la push (--> q) all'inizio e la pop (<-- q) alla fine. Poi pero` ho corretto il codice ma mi son scordato di correggere il commento.
I registri... be', a proposito, quelli che si trovano su tutte le architetture come registri VERI, non memory-mapped (cioe` emulati), sono m, n, p, q, r, s, v, w. I nomi sono vagamente legati alla loro funzione, ma essenzialmente per i primi 4 questo legame e` solo indicativo e i primi 4 sono in pratica general-purpose. Su x86/IA-32 le equivalenze sono:
m = EAX (maschera o accumulatore)
n = ECX (contatore di rotazione binaria, contatore generico)
p = EDX (puntatore primario)
q = EBX (puntatore secondario)
r = ESI (riserva, ausiliario nelle indirezioni con registri emulati)
s = ESP (stack pointer, appunto: puntatore alla cima dello stack)
v = EBP (vicinity pointer: puntatore alla base del local frame)
w = EDI (workbench pointer: puntatore alla base dei dati thread-local)
Insomma v indirizza le variabili locali di una inlet (una "inlet" e` il nome generico di qualcosa che puo` essere una subroutine, funzione, o metodo d'interfaccia, a seconda di come si comporta in pratica), mentre w indirizza le variabili globali (che diventano thread-local in modo che ogni thread abbia la sua copia della variabile). Ci sono un'infinita` di alchimie e acrobazie che si possono fare come vantaggi del register naming manuale, per esempio se una inlet non ha bisogno di variabili locali (perche` gli bastano i registri) potrebbe liberare v salvandolo sullo stack e poi usarlo come registro generico; se non ha bisogno di accedere alle globali puo` liberare w e ottenere ancora un altro registro libero. Lo stack pointer ovviamente e` intoccabile, ma quello e` normale che lo sia: e` accessibile a livello di sintassi e si chiama davvero s, pero` bisogna sapere esattamente quel che si fa con quello, altrimenti il crash e` garantito. Ma in totale i registri usabili quando ne servono parecchi sono fino a 7 garantiti. Usare quelli memory-mapped (che non funzionano se si altera il registro w) e` un ripiego d'emergenza, ma su architetture piu` popolose di registri esisterebbero comunque davvero. I memory-mapped sono indicati da tutti gli altri simboli di una lettera: a, b, c, d, e, f, g, h, i, j, k, l, o, t, u, x, y, z.
Ah, per concludere, ad r sono attribuiti un paio di altri ruoli: e` il registro in cui viene depositato il valore di ritorno di una funzione, ed e` anche il registro in cui viene caricato il puntatore al contesto di una inlet context-bound; le inlet context-bound sono chiamate in closure: assieme alla inlet viene legato un blocco di memoria, il contesto, che contiene gli upvalues.
**Modificato dall'autore il 18.09.2014 19:47**-
Re: 4.00 pre-alpha hello worldScritto daNon Autenticatoil 2014-09-18 19:37:50.0 alle 2014-09-18 19:37:50.0Scritto da: altg
> > Questo post è una pietra miliare, lo salvo subito.
>
> Potrebbe essere vero quello che dici.
> Ah, nella "pietra miliare" c'era pero` un piccolo errore in un commento:
Ah beh, tanto non me n'ero accorto.
> dove dice "put copy #2 of sample value into q"
>
> in realta` lo mette nel registro r quindi dovrebbe finire con "into r". E` solo un commento (la roba tra parentesi e` un commento), sicche` non influisce sul funzionamento del programma, ma sbaglia a spiegare cosa fa l'istruzione a cui si riferisce. In origine usava il registro q, ma mentre ripensavo a scorciare un po' l'esempio m'e` venuto in mente che q doveva essere salvato (in quel caso e` un registro callee-saved perche` non e` tra gli argomenti, cioe` i registri che ricevono i parametri della chiamata, che in quel caso sono n e
mentre r e` il registro "spare", cioe` una specie di registro temporaneo che non c'e` mai bisogno di salvare, quindi usando r al posto di q potevo risparmiare di usare la push (--> q) all'inizio e la pop (<-- q) alla fine. Poi pero` ho corretto il codice ma mi son scordato di correggere il commento.
>
> I registri... be', a proposito, quelli che si trovano su tutte le architetture come registri VERI, non memory-mapped (cioe` emulati), sono m, n, p, q, r, s, v, w. I nomi sono vagamente legati alla loro funzione, ma essenzialmente per i primi 4 questo legame e` solo indicativo e i primi 4 sono in pratica general-purpose. Su x86/IA-32 le equivalenze sono:
>
> m = EAX (maschera o accumulatore)
> n = ECX (contatore di rotazione binaria, contatore generico)
> p = EDX (puntatore primario)
> q = EBX (puntatore secondario)
> r = ESI (riserva, ausiliario nelle indirezioni con registri emulati)
> s = ESP (stack pointer, appunto: puntatore alla cima dello stack)
> v = EBP (vicinity pointer: puntatore alla base del local frame)
> w = EDI (workbench pointer: puntatore alla base dei dati thread-local)
>
> Insomma v indirizza le variabili locali di una inlet (una "inlet" e` il nome generico di qualcosa che puo` essere una subroutine, funzione, o metodo d'interfaccia, a seconda di come si comporta in pratica), mentre w indirizza le variabili globali (che diventano thread-local in modo che ogni thread abbia la sua copia della variabile). Ci sono un'infinita` di alchimie e acrobazie che si possono fare come vantaggi del register naming manuale, per esempio se una inlet non ha bisogno di variabili locali (perche` gli bastano i registri) potrebbe liberare v salvandolo sullo stack e poi usarlo come registro generico; se non ha bisogno di accedere alle globali puo` liberare w e ottenere ancora un altro registro libero. Lo stack pointer ovviamente e` intoccabile, ma quello e` normale che lo sia.
Una volta finitolo, come pensi di diffonderlo e invadere il mondo?-
Re: 4.00 pre-alpha hello worldScritto daaltgutente che non utieneil 2014-09-18 19:50:12.0 alle 2014-09-18 19:50:12.0Trollate totali: 11540> Una volta finitolo, come pensi di diffonderlo e invadere il mondo?
Il povero L.in.oleum 1 e` sempre stato attraente, ma a forza di disfarlo e rifarlo nelle versioni successive ho scoraggiato tutti dall'usarlo, cosa che non mi stupisce ma che non considero un peccato, visto che cosi` ho potuto migliorarlo senza espanderlo a forza di rattoppi incoerenti in stile PHP. Quindi la strategia per diffonderlo una volta finito si riassume in: pubblicalo su anynowhere, aggiorna o lascia che qualcuno aggiorni l'articolo su wikipedia, attendi che si diffonda e LASCIALO STARE.
-
Re: 4.00 pre-alpha hello worldScritto daNon Autenticatoil 2014-09-18 20:52:33.0 alle 2014-09-18 20:52:33.0Scritto da: altg
> > Una volta finitolo, come pensi di diffonderlo e invadere il mondo?
>
> Il povero L.in.oleum 1 e` sempre stato attraente, ma a forza di disfarlo e rifarlo nelle versioni successive ho scoraggiato tutti dall'usarlo, cosa che non mi stupisce ma che non considero un peccato, visto che cosi` ho potuto migliorarlo senza espanderlo a forza di rattoppi incoerenti in stile PHP. Quindi la strategia per diffonderlo una volta finito si riassume in: pubblicalo su anynowhere, aggiorna o lascia che qualcuno aggiorni l'articolo su wikipedia, attendi che si diffonda e LASCIALO STARE.
Accompagnalo almeno con due righe in cui giuri che si tratta di una versione definitiva e le successive saranno mere migliorie retrocompatibili.-
Re: 4.00 pre-alpha hello worldScritto daaltgutente che non utieneil 2014-09-18 22:14:07.0 alle 2014-09-18 22:14:07.0Trollate totali: 11540> > > Una volta finitolo, come pensi di diffonderlo e invadere il mondo?
> >
> > Il povero L.in.oleum 1 e` sempre stato attraente, ma a forza di disfarlo e rifarlo nelle versioni successive ho scoraggiato tutti dall'usarlo, cosa che non mi stupisce ma che non considero un peccato, visto che cosi` ho potuto migliorarlo senza espanderlo a forza di rattoppi incoerenti in stile PHP. Quindi la strategia per diffonderlo una volta finito si riassume in: pubblicalo su anynowhere, aggiorna o lascia che qualcuno aggiorni l'articolo su wikipedia, attendi che si diffonda e LASCIALO STARE.
>
> Accompagnalo almeno con due righe in cui giuri che si tratta di una versione definitiva e le successive saranno mere migliorie retrocompatibili.
L'avevo gia` giurato per la versione 1, non sarei credibile.
-
Re: 4.00 pre-alpha hello worldScritto daNon Autenticatoil 2014-09-18 22:22:45.0 alle 2014-09-18 22:22:45.0Scritto da: altg
> > > > Una volta finitolo, come pensi di diffonderlo e invadere il mondo?
> > >
> > > Il povero L.in.oleum 1 e` sempre stato attraente, ma a forza di disfarlo e rifarlo nelle versioni successive ho scoraggiato tutti dall'usarlo, cosa che non mi stupisce ma che non considero un peccato, visto che cosi` ho potuto migliorarlo senza espanderlo a forza di rattoppi incoerenti in stile PHP. Quindi la strategia per diffonderlo una volta finito si riassume in: pubblicalo su anynowhere, aggiorna o lascia che qualcuno aggiorni l'articolo su wikipedia, attendi che si diffonda e LASCIALO STARE.
> >
> > Accompagnalo almeno con due righe in cui giuri che si tratta di una versione definitiva e le successive saranno mere migliorie retrocompatibili.
>
> L'avevo gia` giurato per la versione 1, non sarei credibile.
La versione 1 non poteva essere retrocompatibile, a meno che non ci sia stata una versione 0.-
Re: 4.00 pre-alpha hello worldScritto daNon Autenticatoil 2014-09-18 22:23:36.0 alle 2014-09-18 22:23:36.0Scritto da:
> Scritto da: altg
> > > > > Una volta finitolo, come pensi di diffonderlo e invadere il mondo?
> > > >
> > > > Il povero L.in.oleum 1 e` sempre stato attraente, ma a forza di disfarlo e rifarlo nelle versioni successive ho scoraggiato tutti dall'usarlo, cosa che non mi stupisce ma che non considero un peccato, visto che cosi` ho potuto migliorarlo senza espanderlo a forza di rattoppi incoerenti in stile PHP. Quindi la strategia per diffonderlo una volta finito si riassume in: pubblicalo su anynowhere, aggiorna o lascia che qualcuno aggiorni l'articolo su wikipedia, attendi che si diffonda e LASCIALO STARE.
> > >
> > > Accompagnalo almeno con due righe in cui giuri che si tratta di una versione definitiva e le successive saranno mere migliorie retrocompatibili.
> >
> > L'avevo gia` giurato per la versione 1, non sarei credibile.
>
> La versione 1 non poteva essere retrocompatibile, a meno che non ci sia stata una versione 0.
Uff ho scritto un'insensaggine, è meglio che vada a dormire.-
Re: 4.00 pre-alpha hello worldScritto daaltgutente che non utieneil 2014-09-18 23:00:22.0 alle 2014-09-18 23:00:22.0Trollate totali: 11540> > > > > > Una volta finitolo, come pensi di diffonderlo e invadere il mondo?
> > > > >
> > > > > Il povero L.in.oleum 1 e` sempre stato attraente, ma a forza di disfarlo e rifarlo nelle versioni successive ho scoraggiato tutti dall'usarlo, cosa che non mi stupisce ma che non considero un peccato, visto che cosi` ho potuto migliorarlo senza espanderlo a forza di rattoppi incoerenti in stile PHP. Quindi la strategia per diffonderlo una volta finito si riassume in: pubblicalo su anynowhere, aggiorna o lascia che qualcuno aggiorni l'articolo su wikipedia, attendi che si diffonda e LASCIALO STARE.
> > > >
> > > > Accompagnalo almeno con due righe in cui giuri che si tratta di una versione definitiva e le successive saranno mere migliorie retrocompatibili.
> > >
> > > L'avevo gia` giurato per la versione 1, non sarei credibile.
> >
> > La versione 1 non poteva essere retrocompatibile, a meno che non ci sia stata una versione 0.
>
> Uff ho scritto un'insensaggine, è meglio che vada a dormire.
Non e` grave. Um... magari poi potrei anche provare a ri-giurarlo, puo` darsi che se la ribevan... che riesca anche a mantenere, stavolta.
-
-
-
-
-
-
-
-
-