-
mah, be', certo, sembra un tantino macchinoso...Scritto daaltgutente che non utieneil 2014-11-03 21:14:29.0 alle 2014-11-03 21:14:29.0Trollate totali: 11540...ma porca miseria, come si semplifica 'sto cazzo di hello world?
startup displayStatus engage include string ToText include textIo on console include util Pause to Begin "framed here messenger ~ textIo::Create -> Bind To console here message ~ { Hello_world! } as string -> To Text messenger -> Say message util::Pause return
Ah, ho cambiato le freccine "comes from", quelle che prima erano <- ora sono rappresentate dall'asciitilde (~). A parte quello, che l'ho fatto perche` vedere freccine di qui e di la` sulla stessa riga lo trovavo distraente, difficile da leggere. Pero` a parte quello, minchia!
Tutto per scrivere "hello world", prima era piu` semplice ma non aveva static typing (che controlla tutti i bindings delle istanze e che fra l'altro gli dice che { Hello_world! } e` una stringa (null-terminated) alla quale viene applicato il metodo "To Text" che la trasforma in un oggetto "text" allocato sull'heap, che lo wrappa in informazioni aggiuntive (per esempio diventa non piu` null-terminated ma di una lunghezza nota, che e` una proprieta` dell'oggetto).
E poi prima non passava da un'opportuna interfaccia: e se poi voglio scriverlo su un file? O su uno schermo grafico? O mandarlo attraverso una socket? Mi toccava sempre cambiare la chiamata a "Say" che prima si riferiva direttamente a un metodo dell'oggetto "text" che assumeva che i testi si scrivessero tutti tramite stdout. Cosi` invece uso un metodo virtuale di "textIo" che POI, a scelta e in questo specifico caso, s'interfaccia con la console (cioe` scrive su stdout, per via di "Bind To console").
Cioe`, non so, dal punto di vista logico mi sembra tutto molto bello, ma come mai mi e` rimasta addosso la sensazione di aver costruito una centrale nucleare per far funzionare un aspirapolvere?
-
Re: mah, be', certo, sembra un tantino macchinoso...Scritto daаvvelentaniUtente privilegiatoil 2014-11-03 21:49:50.0 alle 2014-11-03 21:49:50.0Trollate totali: 58Scritto da: altg
> ...ma porca miseria, come si semplifica 'sto cazzo di hello world?
>
>> startup displayStatus engage > include string ToText > include textIo on console > include util Pause > > > to Begin "framed > > here messenger ~ textIo::Create -> Bind To console > here message ~ { Hello_world! } as string -> To Text > messenger -> Say message > util::Pause > return >
>
> Ah, ho cambiato le freccine "comes from", quelle che prima erano <- ora sono rappresentate dall'asciitilde (~). A parte quello, che l'ho fatto perche` vedere freccine di qui e di la` sulla stessa riga lo trovavo distraente, difficile da leggere. Pero` a parte quello, minchia!
>
> Tutto per scrivere "hello world", prima era piu` semplice ma non aveva static typing (che controlla tutti i bindings delle istanze e che fra l'altro gli dice che { Hello_world! } e` una stringa (null-terminated) alla quale viene applicato il metodo "To Text" che la trasforma in un oggetto "text" allocato sull'heap, che lo wrappa in informazioni aggiuntive (per esempio diventa non piu` null-terminated ma di una lunghezza nota, che e` una proprieta` dell'oggetto).
>
> E poi prima non passava da un'opportuna interfaccia: e se poi voglio scriverlo su un file? O su uno schermo grafico? O mandarlo attraverso una socket? Mi toccava sempre cambiare la chiamata a "Say" che prima si riferiva direttamente a un metodo dell'oggetto "text" che assumeva che i testi si scrivessero tutti tramite stdout. Cosi` invece uso un metodo virtuale di "textIo" che POI, a scelta e in questo specifico caso, s'interfaccia con la console (cioe` scrive su stdout, per via di "Bind To console").
>
> Cioe`, non so, dal punto di vista logico mi sembra tutto molto bello, ma come mai mi e` rimasta addosso la sensazione di aver costruito una centrale nucleare per far funzionare un aspirapolvere?
I think happiness is love
- Vladimir Putin-
Re: mah, be', certo, sembra un tantino macchinoso...Scritto daaltgutente che non utieneil 2014-11-03 22:06:22.0 alle 2014-11-03 22:06:22.0Trollate totali: 11540>

Ma aspe', provo a spiegare che fa riga per riga.startup displayStatus engage
Dice al modulo di run-time di aprire la console all'avvio del programma. Si puo` fare anche dopo, facendo partire il display in "standby" che e` il default, ma nell'helloworld probabilmente sembra piu` facile cosi` perche` non deve includere un altra librerietta che conterrebbe "display::Enter Text Mode".include string ToText
Include il metodo "To Text" (e implicitamente la definizione della classe "string").include textIo on console
Include (implicitamente) l'interfaccia textIo e (esplicitamente) l'implementazione per la console.include util Pause
La funzioncina che aspetta un tasto o un qualche altro input dall'utente, cosi` non chiude subito la finestra prima di aver letto hello world. Questo perche` l'applicazione non parte da console, ma in ambiente finestrato.to Begin "framed
Vabbe', l'equivalente di "main". La hint dice "framed": in questo modo permette la dichiarazione di variabili locali, e crea lo stack frame.here messenger ~ textIo::Create -> Bind To console
Dichiara la locale "messenger" che e` assegnata al valore di ritorno di textIo:Create, che crea un'istanza dell'interfaccia textIo. Prima di ritornare, spedisce il puntatore all'istanza a "Bind To" con l'argomento "console", per fare il binding dinamico. L'argomento "console" e` una tabella di metodi virtuali definita nell'implementazione. Viene risolta senza fully qualified name (che sarebbe consoleIo__console) perche` il namespace consoleIo e` un nodo "figlio" di textIo, e il namespace textIo entra a far parte dello scope, nella chiamata, perche` il valore di ritorno da textIo::Create e` "textIo".here message ~ { Hello_world! } as string -> To Text
Dichiara la locale "message" e la assegna al valore di ritorno di "To Text", che e` un metodo di "string", dopo aver castato esplicitamente la stringa come "string". Meglio non farlo fare da solo al compilatore perche` ci possono essere piu` tipi di stringhe e sequenze di dati statici inizializzati: quella e` una string (32 bit per carattere, null-terminated), ma ci potrebbero essere stringhe di testo di tutte le wordsize a partire, ragionevolmente, da 7 bit, e come chiamarle lo lascio al programmatore.messenger -> Say message
Chiama il metodo Say dell'interfaccia rappresentata da messenger (che e` istanza di textIo), passandogli come argomento il text di cui sopra.util::Pause return
Se lo schermo e` in text mode, aspetta "enter" e chiude il programma (fa una lettura dummy di stdin per aspettare "enter").-
Re: mah, be', certo, sembra un tantino macchinoso...Scritto daaltgutente che non utieneil 2014-11-03 22:21:35.0 alle 2014-11-03 22:21:35.0Trollate totali: 11540ah, casomai, questo e` il disassemblato di "Begin"...

Begin @LINKER: runStart 559 00000559 55 PUSH.r EBP(v) enter (implied) 0000055A 81EC00000000 SUB.rm,i ESP(s), 00000000 00000560 89E5 MOV.rm,r EBP(v), ESP(s) 00000562 56 PUSH.r ESI(r) here messenger ~ textIo::Create -> Bind To console 00000563 E87BFEFFFF CALL.rel FFFFFE7B ; 000003E3 00000568 52 PUSH.r EDX(p) 00000569 BA20000000 MOV.r,i EDX(p), 00000020 0000056E E87BFEFFFF CALL.rel FFFFFE7B ; 000003EE 00000573 5A POP.r EDX(p) 00000574 897500 MOV.rm,r [EBP(v)+00], ESI(r) 00000577 5E POP.r ESI(r) 00000578 56 PUSH.r ESI(r) here message ~ {...} as string -> To Text 00000579 BE23000000 MOV.r,i ESI(r), 00000023 0000057E E8EFFCFFFF CALL.rel FFFFFCEF ; 00000272 00000583 897504 MOV.rm,r [EBP(v)+04], ESI(r) 00000586 5E POP.r ESI(r) 00000587 56 PUSH.r ESI(r) messenger -> Say message 00000588 8B7500 MOV.r,rm ESI(r), [EBP(v)+00] 0000058B 52 PUSH.r EDX(p) 0000058C 8B5504 MOV.r,rm EDX(p), [EBP(v)+04] 0000058F E860FEFFFF CALL.rel FFFFFE60 ; 000003F4 00000594 5A POP.r EDX(p) 00000595 5E POP.r ESI(r) 00000596 E840FFFFFF CALL.rel FFFFFF40 ; 000004DB util::Pause 0000059B 81C408000000 ADD.rm,i ESP(s), 00000008 return 000005A1 5D POP.r EBP(v) 000005A2 C3 RET.near End (helloWorld)
magari si capiscono meglio le dinamiche fra i valori generati e dove vanno a finire. Il registro ESI fa da "ponte" attraverso cui passano gli indirizzi delle istanze (da una freccina all'altra).-
Re: mah, be', certo, sembra un tantino macchinoso...Scritto daΤhe LichÜbermenschil 2014-11-03 22:25:59.0 alle 2014-11-03 22:25:59.0Trollate totali: 58Scritto da: altg
> ah, casomai, questo e` il disassemblato di "Begin"...
>
>> Begin > > @LINKER: runStart 559 > > 00000559 55 PUSH.r EBP(v) enter (implied) > 0000055A 81EC00000000 SUB.rm,i ESP(s), 00000000 > 00000560 89E5 MOV.rm,r EBP(v), ESP(s) > 00000562 56 PUSH.r ESI(r) here messenger ~ textIo::Create -> Bind To console > 00000563 E87BFEFFFF CALL.rel FFFFFE7B ; 000003E3 > 00000568 52 PUSH.r EDX(p) > 00000569 BA20000000 MOV.r,i EDX(p), 00000020 > 0000056E E87BFEFFFF CALL.rel FFFFFE7B ; 000003EE > 00000573 5A POP.r EDX(p) > 00000574 897500 MOV.rm,r [EBP(v)+00], ESI(r) > 00000577 5E POP.r ESI(r) > 00000578 56 PUSH.r ESI(r) here message ~ {...} as string -> To Text > 00000579 BE23000000 MOV.r,i ESI(r), 00000023 > 0000057E E8EFFCFFFF CALL.rel FFFFFCEF ; 00000272 > 00000583 897504 MOV.rm,r [EBP(v)+04], ESI(r) > 00000586 5E POP.r ESI(r) > 00000587 56 PUSH.r ESI(r) messenger -> Say message > 00000588 8B7500 MOV.r,rm ESI(r), [EBP(v)+00] > 0000058B 52 PUSH.r EDX(p) > 0000058C 8B5504 MOV.r,rm EDX(p), [EBP(v)+04] > 0000058F E860FEFFFF CALL.rel FFFFFE60 ; 000003F4 > 00000594 5A POP.r EDX(p) > 00000595 5E POP.r ESI(r) > 00000596 E840FFFFFF CALL.rel FFFFFF40 ; 000004DB util::Pause > 0000059B 81C408000000 ADD.rm,i ESP(s), 00000008 return > 000005A1 5D POP.r EBP(v) > 000005A2 C3 RET.near > > End (helloWorld) >
>
> magari si capiscono meglio le dinamiche fra i valori generati e dove vanno a finire. Il registro ESI fa da "ponte" attraverso cui passano gli indirizzi delle istanze (da una freccina all'altra).
è il clone, bamba di un pisano
The Lich™
« Non è morto ciò che in eterno può attendere,
e col passare di strani eoni, anche la morte può morire. »

-
Re: mah, be', certo, sembra un tantino macchinoso...Scritto daaltgutente che non utieneil 2014-11-03 22:32:32.0 alle 2014-11-03 22:32:32.0Trollate totali: 11540> > ah, casomai, questo e` il disassemblato di "Begin"...

> >
> >> > Begin > > > > @LINKER: runStart 559 > > > > 00000559 55 PUSH.r EBP(v) enter (implied) > > 0000055A 81EC00000000 SUB.rm,i ESP(s), 00000000 > > 00000560 89E5 MOV.rm,r EBP(v), ESP(s) > > 00000562 56 PUSH.r ESI(r) here messenger ~ textIo::Create -> Bind To console > > 00000563 E87BFEFFFF CALL.rel FFFFFE7B ; 000003E3 > > 00000568 52 PUSH.r EDX(p) > > 00000569 BA20000000 MOV.r,i EDX(p), 00000020 > > 0000056E E87BFEFFFF CALL.rel FFFFFE7B ; 000003EE > > 00000573 5A POP.r EDX(p) > > 00000574 897500 MOV.rm,r [EBP(v)+00], ESI(r) > > 00000577 5E POP.r ESI(r) > > 00000578 56 PUSH.r ESI(r) here message ~ {...} as string -> To Text > > 00000579 BE23000000 MOV.r,i ESI(r), 00000023 > > 0000057E E8EFFCFFFF CALL.rel FFFFFCEF ; 00000272 > > 00000583 897504 MOV.rm,r [EBP(v)+04], ESI(r) > > 00000586 5E POP.r ESI(r) > > 00000587 56 PUSH.r ESI(r) messenger -> Say message > > 00000588 8B7500 MOV.r,rm ESI(r), [EBP(v)+00] > > 0000058B 52 PUSH.r EDX(p) > > 0000058C 8B5504 MOV.r,rm EDX(p), [EBP(v)+04] > > 0000058F E860FEFFFF CALL.rel FFFFFE60 ; 000003F4 > > 00000594 5A POP.r EDX(p) > > 00000595 5E POP.r ESI(r) > > 00000596 E840FFFFFF CALL.rel FFFFFF40 ; 000004DB util::Pause > > 0000059B 81C408000000 ADD.rm,i ESP(s), 00000008 return > > 000005A1 5D POP.r EBP(v) > > 000005A2 C3 RET.near > > > > End (helloWorld) > >
> >
> > magari si capiscono meglio le dinamiche fra i valori generati e dove vanno a finire. Il registro ESI fa da "ponte" attraverso cui passano gli indirizzi delle istanze (da una freccina all'altra).
>
> è il clone, bamba di un pisano
Clone in che senso? Non duplica oggetti, ne trasporta solo l'indirizzo dell'istanza in memoria. E` un registro di transito che L.in.oleum chiama sempre "r" e che su x86 e` impersonato da ESI. Quando un metodo viene chiamato, l'indirizzo dell'istanza su cui opera lo trova in "r" (ESI). Quando una funzione ritorna un valore, il valore di ritorno e` depositato in "r" (cioe` ESI). Quando i metodi sono concatenati in una fluent interface, i metodi che non sono funzioni ritornano lo stesso valore che aveva "r" in ingresso, cioe` ritornano "this" o "self", per fare paralleli.-
Re: mah, be', certo, sembra un tantino macchinoso...Scritto daΤhe LichÜbermenschil 2014-11-03 22:38:42.0 alle 2014-11-03 22:38:42.0Trollate totali: 58Scritto da: altg
> > > ah, casomai, questo e` il disassemblato di "Begin"...
> > >
> > >> > > Begin > > > > > > @LINKER: runStart 559 > > > > > > 00000559 55 PUSH.r EBP(v) enter (implied) > > > 0000055A 81EC00000000 SUB.rm,i ESP(s), 00000000 > > > 00000560 89E5 MOV.rm,r EBP(v), ESP(s) > > > 00000562 56 PUSH.r ESI(r) here messenger ~ textIo::Create -> Bind To console > > > 00000563 E87BFEFFFF CALL.rel FFFFFE7B ; 000003E3 > > > 00000568 52 PUSH.r EDX(p) > > > 00000569 BA20000000 MOV.r,i EDX(p), 00000020 > > > 0000056E E87BFEFFFF CALL.rel FFFFFE7B ; 000003EE > > > 00000573 5A POP.r EDX(p) > > > 00000574 897500 MOV.rm,r [EBP(v)+00], ESI(r) > > > 00000577 5E POP.r ESI(r) > > > 00000578 56 PUSH.r ESI(r) here message ~ {...} as string -> To Text > > > 00000579 BE23000000 MOV.r,i ESI(r), 00000023 > > > 0000057E E8EFFCFFFF CALL.rel FFFFFCEF ; 00000272 > > > 00000583 897504 MOV.rm,r [EBP(v)+04], ESI(r) > > > 00000586 5E POP.r ESI(r) > > > 00000587 56 PUSH.r ESI(r) messenger -> Say message > > > 00000588 8B7500 MOV.r,rm ESI(r), [EBP(v)+00] > > > 0000058B 52 PUSH.r EDX(p) > > > 0000058C 8B5504 MOV.r,rm EDX(p), [EBP(v)+04] > > > 0000058F E860FEFFFF CALL.rel FFFFFE60 ; 000003F4 > > > 00000594 5A POP.r EDX(p) > > > 00000595 5E POP.r ESI(r) > > > 00000596 E840FFFFFF CALL.rel FFFFFF40 ; 000004DB util::Pause > > > 0000059B 81C408000000 ADD.rm,i ESP(s), 00000008 return > > > 000005A1 5D POP.r EBP(v) > > > 000005A2 C3 RET.near > > > > > > End (helloWorld) > > >
> > >
> > > magari si capiscono meglio le dinamiche fra i valori generati e dove vanno a finire. Il registro ESI fa da "ponte" attraverso cui passano gli indirizzi delle istanze (da una freccina all'altra).
> >
> > è il clone, bamba di un pisano
>
> Clone in che senso? Non duplica oggetti, ne trasporta solo l'indirizzo dell'istanza in memoria. E` un registro di transito che L.in.oleum chiama sempre "r" e che su x86 e` impersonato da ESI. Quando un metodo viene chiamato, l'indirizzo dell'istanza su cui opera lo trova in "r" (ESI). Quando una funzione ritorna un valore, il valore di ritorno e` depositato in "r" (cioe` ESI). Quando i metodi sono concatenati in una fluent interface, i metodi che non sono funzioni ritornano lo stesso valore che aveva "r" in ingresso, cioe` ritornano "this" o "self", per fare paralleli.
è il clone dell'oloturio, stasera hai mangiato un yoda?
The Lich™
« Non è morto ciò che in eterno può attendere,
e col passare di strani eoni, anche la morte può morire. »

-
Re: mah, be', certo, sembra un tantino macchinoso...Scritto daaltgutente che non utieneil 2014-11-03 22:50:52.0 alle 2014-11-03 22:50:52.0Trollate totali: 11540> è il clone dell'oloturio, stasera hai mangiato un yoda?
ARGH! E` vero!
No sono consufo da tutto il casino mentale di cervello.-
Re: mah, be', certo, sembra un tantino macchinoso...Scritto daaltgutente che non utieneil 2014-11-03 22:51:54.0 alle 2014-11-03 22:51:54.0Trollate totali: 11540> > è il clone dell'oloturio, stasera hai mangiato un yoda?
>
> ARGH! E` vero!
> No sono consufo da tutto il casino mentale di cervello.
Comunque lascio tutto qui per il vero olutorio che cosi` avra` modo di ridere un po' o passare il tempo, che so...-
Re: mah, be', certo, sembra un tantino macchinoso...Scritto daMitzkyLa castratrice di trollil 2014-11-04 08:09:08.0 alle 2014-11-04 08:09:08.0Trollate totali: 1072Ma sono tutti cloni?anche the lich ha solo 18 trollacci
Una donna senza un uomo e' come un pesce senza bici.-
Re: mah, be', certo, sembra un tantino macchinoso...> Ma sono tutti cloni?anche the lich ha solo 18 trollacci
>
>
Cloni?
Dove sarebbero i cloni?
Non ci abbasseremmo mai a usare quei mezzucci.
«Non e` morto, vedrai che attende in eterno,
secondo me, ma se anche fosse morto
non vorrei pensassero che e` colpa mia:
m'e` sbucato d'improvviso con quella cazzo
di bicicletta senza un cazzo di fanale,
insomma nel dubbio lo lascio li`
magari per qualche strano eone,
sara` anche omissione di soccorso
ma vado, chi s'e` visto s'e` visto...»

-
-
-
-
-
-
-
Re: mah, be', certo, sembra un tantino macchinoso...Scritto daaltgutente che non utieneil 2014-11-03 22:50:08.0 alle 2014-11-03 22:50:08.0Trollate totali: 11540provo a spiegare il disassemblato?
vabbe', proviamo...
00000559 55 PUSH.r EBP(v) enter (implied) 0000055A 81EC00000000 SUB.rm,i ESP(s), 00000000 00000560 89E5 MOV.rm,r EBP(v), ESP(s)
Crea lo stack frame. La SUB sottrae ingannevolmente zero perche` il compilatore, in quel punto, non sa quanto sara` lungo lo stack frame e zero e` un placeholder. Viene corretto in seguito col valore giusto (8, due parole di 4 bytes corrispondenti a due locali).00000562 56 PUSH.r ESI(r) here messenger ~ textIo::Create -> Bind To console 00000563 E87BFEFFFF CALL.rel FFFFFE7B ; 000003E3
Salva ESI del chiamante (per agire in modo trasparente), poi chiama textIo::Create che e` all'indirizzo 3E3 (offset negativo FFFFFE7B da quel punto). Quella ritorna in ESI l'indirizzo della nuova istanza (che e` nell'heap).00000568 52 PUSH.r EDX(p) 00000569 BA20000000 MOV.r,i EDX(p), 00000020
Salva p (EDX) del ramo del chiamante, poi lo carica con l'indirizzo di "console", la tabella metodi virtuali che e` all'indirizzo 20h (4-flat, il che significa un indirizzo espresso in unita` di 4 bytes, che significa 80h in bytes).0000056E E87BFEFFFF CALL.rel FFFFFE7B ; 000003EE
Chiama Bind To di textIo (3EE).00000573 5A POP.r EDX(p)
recupera p del chiamante.00000574 897500 MOV.rm,r [EBP(v)+00], ESI(r)
salva in "messenger" (offset 0 sullo stack frame basato a EBP) il valore di ritorno di "Bind To", che poi e` lo stesso ritornato da textIo::Create perche` "Bind To" ritorna l'equivalente di "this".00000577 5E POP.r ESI(r)
recupera r del chiamante.00000578 56 PUSH.r ESI(r) here message ~ {...} as string -> To Text 00000579 BE23000000 MOV.r,i ESI(r), 00000023
Ri-salva r del chiamante, poi lo carica con l'indirizzo, tra i dati statici, della stringa hello world allocata a 23h (4-flat, in bytes e` l'offset 8Ch).0000057E E8EFFCFFFF CALL.rel FFFFFCEF ; 00000272 00000583 897504 MOV.rm,r [EBP(v)+04], ESI(r) 00000586 5E POP.r ESI(r)
Chiama "string::ToText", che converte la stringa a 23h in un oggetto text il cui indirizzo e` ritornato in "r". Deposita "r" (ESI) a EBP+4 (cioe` in "messenger"), e recupera r del chiamante.00000587 56 PUSH.r ESI(r) messenger -> Say message 00000588 8B7500 MOV.r,rm ESI(r), [EBP(v)+00] 0000058B 52 PUSH.r EDX(p) 0000058C 8B5504 MOV.r,rm EDX(p), [EBP(v)+04] 0000058F E860FEFFFF CALL.rel FFFFFE60 ; 000003F4 00000594 5A POP.r EDX(p) 00000595 5E POP.r ESI(r)
ri-salva r del chiamante, carica r con "messenger", salva p (EDX) del chiamante, carica p con "message", chiama textIo::Say (3F4), recupera p ed r.00000596 E840FFFFFF CALL.rel FFFFFF40 ; 000004DB util::Pause
chiama util::Pause0000059B 81C408000000 ADD.rm,i ESP(s), 00000008 return 000005A1 5D POP.r EBP(v) 000005A2 C3 RET.near
distrugge lo stack frame e torna al suo chiamante, che e` il modulo di run-time, che a sua volta poi chiude il thread principale e termina l'applicazione.
-
-
-
-