View Full Version : Ruby ?
Albitexm
29-10-2008, 20:27
Ruby , cosa ne pensate ?
Su le riviste dedicate si trova un po' tutto .
Ma questo Ruby da dove esce ? :what:
Ruby , cosa ne pensate ?
Su le riviste dedicate si trova un po' tutto .
Ma questo Ruby da dove esce ? :what:
http://www.ruby-lang.org/en/
Ideato da Yakuiro Matsumoto, in arte Matz, è un linguaggio di scripting fondamentalmente orientato agli oggetti ma che è possibile usare anche in maniera imperativa e funzionale. Inizialmente poco diffuso deve un forte salto di popolarità al framework Rails che permette di utilizzare Ruby per la costruzione di applicazioni web. E' di facile apprendimento (a mio avviso qualche spigoletto nascosto c'è ma niente di insuperabile), potente e in forte crescita. Punto critico sono sostanzialmente le prestazioni e una certa lentezza nello sviluppo (questo può anche essere un bene) dipendente in massima parte dal suo ideatore e come tutti i linguaggi dipendenti da una sola figura centrale ci sono delle limitazioni. Interessanti le sue varianti JRuby (che gira sulla Java VM) e IronRuby legata al framework .Net.
Ruby , cosa ne pensate ?
Su le riviste dedicate si trova un po' tutto .
Ma questo Ruby da dove esce ? :what:
Il miglior linguaggio di programmazione dinamico assieme a python.
E' un ottimo linguaggio per il web sopratutto grazie al framework rails.
Albitexm
30-10-2008, 22:02
-
Albitexm
30-10-2008, 22:08
[QUOTE=atragon;24785549]http://www.ruby-lang.org/en/
Ideato da Yakuiro Matsumoto, in arte Matz, è un linguaggio ... QUOTE]
Grazie per le informazioni. Avevo questa curiosità perchè in una rivista dedicata alla programmazione è abbastanza "spinto" .
Tra l'altro c'è un'interessante codice per il Sodokan , che con le opportune modifiche mi servirebbe per gli scacchi. Alt! Lo so che in Python e C e altro, ci sono decine di codici open source per gli scacchi , ma io voglio scrivere un programma didattico che mi aiuti a capire la struttura findamentale di questi tipi di gioco . Il C e C++ non mi entrano in testa , (sarà l'età ?) cerco qualcosa di più intuitivo .
Mmmm.... gli scacchi sono un po' particolari, secondo me. Ci sono degli algoritmi standard che i programmi più famosi usano più o meno tutti (la parte tattica che alla fin fine è solo calcolo) poi c'è l'engine di valutazione della posizione e un po' devi esserci dentro, nel senso devi sapere un po' giocare, altrimenti, piano piano, caschi dentro o vicino al classico brute-force. Ovviamente se ti basta un programma che giochi alla va là che vai bene la seconda parte puoi tralasciarla. Se studi un po' i sorgenti di Crafty secondo me hai tutto da guadagnare.
Qui (http://www.cs.unibo.it/~cianca/wwwpages/chesssite/mychesspage.html) trovi un po' di materiale utile al caso.
Vincenzo1968
31-10-2008, 02:39
http://www.ruby-lang.org/en/
Ideato da Yakuiro Matsumoto, in arte Matz, è un linguaggio di scripting fondamentalmente orientato agli oggetti ma che è possibile usare anche in maniera imperativa e funzionale. Inizialmente poco diffuso deve un forte salto di popolarità al framework Rails che permette di utilizzare Ruby per la costruzione di applicazioni web. E' di facile apprendimento (a mio avviso qualche spigoletto nascosto c'è ma niente di insuperabile), potente e in forte crescita. Punto critico sono sostanzialmente le prestazioni e una certa lentezza nello sviluppo (questo può anche essere un bene) dipendente in massima parte dal suo ideatore e come tutti i linguaggi dipendenti da una sola figura centrale ci sono delle limitazioni. Interessanti le sue varianti JRuby (che gira sulla Java VM) e IronRuby legata al framework .Net.
Occhio che a partire dalla versione 1.9 Ruby ha una virtual machine diversa da quella originale sviluppata da Matzumoto.
Si tratta di YARV (Yet Another Ruby Virtual Machine) ed è molto più efficiente rispetto alla precedente.
Questo è un benchmark fatto da Antonio Cangiano nel 2007:
Ruby 1.8.6: 158.869 secondi
Python 2.5.1: 31.507s secondi
Ruby 1.9.0: 11.934s secondi
È basato su un piccolo programma ricorsivo per il calcolo dei primi n valori della serie di Fibonacci. ;)
cdimauro
31-10-2008, 08:29
Non è che prendendo UN solo test si possa decidere sulla bontà o meno dell'implementazione di un linguaggio rispetto ad un altro.
Ecco qui: http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=yarv&lang2=python
Se poi mettiamo anche Psyco sul piatto, non c'è storia: http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=yarv&lang2=psyco
P.S. La virtual machine di Python ha ancora parecchio da essere ottimizzata. :cool:
Vincenzo1968
31-10-2008, 16:08
Per carità di Dio,
non voglio scatenare una polemica su quale dei due linguaggi sia il migliore. Non so nemmeno chi sia Antonio Cangiano. I dati li ho presi da qui:
http://ruby.html.it/articoli/leggi/2844/ruby-quale-virtual-machine/2/
Mi pare che Ruby, già dalla prossima release la 1.9(o dalla successiva, la 2.0), implementerà un compilatore Just in Time. E questo mi sembra un vantaggio: con un solo programma hai virtual machine e JIT; con Python devi scaricare e installare a parte Psyco.
E poi, di Python, non mi piace la gestione dei blocchi di codice. Per qualcuno potrà anche essere un vantaggio(so che tu lo consideri tale) ma personalmente non mi piace dover strutturare i blocchi a colpi di tabulazioni o spazi(e con questo non intendo certo dire che chi programma non debba usare l'indentazione del codice nel modo più appropriato).
Se sei d'accordo potremmo farlo noi, qui, un piccolo confronto: implementiamo(anzi, implementate. Io debbo chiedere l'intervento di qualcuno che di Ruby se ne intenda: Vicius?) una funzione per il calcolo dei numeri di Fibonacci e prendiamo i tempi.
marko.fatto
31-10-2008, 16:25
fibonacci.rb
def fibo(n)
return n if (0..1).include? n
fibo(n-1) + fibo(n-2)
end
basta così :asd:
ma non credo che un test del genere abbia qualche risultato determinante :fagiano:
Vincenzo1968
31-10-2008, 16:29
fibonacci.rb
def fibo(n)
return n if (0..1).include? n
fibo(n-1) + fibo(n-2)
end
basta così :asd:
ma non credo che un test del genere abbia qualche risultato determinante :fagiano:
E allora non saprei...
Si potrebbero fare dei test su una serie di funzioni diverse.
:confused:
:)
edit: Marko scusa, puoi postare il programma completo? (con la funzione main che richiama fibo, in modo da poterne verificare i tempi). Grazie ;)
marko.fatto
31-10-2008, 17:10
def fibo(n)
return n if (0..1).include? n
fibo(n-1) + fibo(n-2)
end
asd=gets.chomp.to_i
start=Time.now
resu=fibo asd
stop=Time.now
puts resu
puts stop-start
Vincenzo1968
31-10-2008, 18:03
Ciao Marko,
grazie :)
Volevo chiederti una cosa: col codice che hai postato è possibile calcolare, per esempio, il millesimo numero di Fibonacci? O bisogna utilizzare un tipo di dati particolare? (mi sembra che in Ruby esista il tipo BigInteger o qualcosa del genere).
Ciao Marko,
grazie :)
Volevo chiederti una cosa: col codice che hai postato è possibile calcolare, per esempio, il millesimo numero di Fibonacci? O bisogna utilizzare un tipo di dati particolare? (mi sembra che in Ruby esista il tipo BigInteger o qualcosa del genere).
Non c'è problema. Ci pensa Ruby a passare da Fixnum a Bignum e viceversa a seconda dei bit richiesti per rappresentare il numero.
Vincenzo1968
31-10-2008, 21:02
Non c'è problema. Ci pensa Ruby a passare da Fixnum a Bignum e viceversa a seconda dei bit richiesti per rappresentare il numero.
Perfetto! Grazie ;)
Occhio che a partire dalla versione 1.9 Ruby ha una virtual machine diversa da quella originale sviluppata da Matzumoto.
Si tratta di YARV (Yet Another Ruby Virtual Machine) ed è molto più efficiente rispetto alla precedente.
Questo è un benchmark fatto da Antonio Cangiano nel 2007:
Ho letto. Molto interessante. Vedremo i risultati su applicazioni di vario tipo i test di Cangiano volevano cmq mettere in risalto solo i progressi rispetto al VM di Matz.
cdimauro
31-10-2008, 21:46
Per carità di Dio,
non voglio scatenare una polemica su quale dei due linguaggi sia il migliore. Non so nemmeno chi sia Antonio Cangiano. I dati li ho presi da qui:
http://ruby.html.it/articoli/leggi/2844/ruby-quale-virtual-machine/2/
I dati però riportano UN solo test, dove guarda caso la nuova VM mostra risultati prestazionali superiori.
Da notare ciò che il link riporta verso la fine:
Rails è infatti compatibile con Ruby 1.9 sin dalla versione 2.0.2 e può quindi essere utilizzato all'interno di questo nuovo interprete beneficiando di un'incremento prestazionale vicino al 15%
RoR è un'applicazione decisamente complessa e non banale quale la generazione della successione di Fibonacci, e difatti i miglioramenti prestazionali sono di gran lunga inferiori, ma soprattutto più attendibili.
Mi pare che Ruby, già dalla prossima release la 1.9(o dalla successiva, la 2.0), implementerà un compilatore Just in Time.
Non mi risulta. Vedremo.
E questo mi sembra un vantaggio: con un solo programma hai virtual machine e JIT; con Python devi scaricare e installare a parte Psyco.
Psyco ti permette di controllare in maniera molto fine la generazione del codice JIT (in buona sostanza: cosa compilare e quanto "aggressivo" dev'essere il compilatore).
Un compilatore JIT che funziona sempre, invece, è un interruttore perennemente acceso.
E poi, di Python, non mi piace la gestione dei blocchi di codice. Per qualcuno potrà anche essere un vantaggio(so che tu lo consideri tale) ma personalmente non mi piace dover strutturare i blocchi a colpi di tabulazioni o spazi(e con questo non intendo certo dire che chi programma non debba usare l'indentazione del codice nel modo più appropriato).
Sui gusti non si discute.
Ti faccio notare però che gli editor moderni indentano automaticamente il codice per dargli una struttura più omogenea e facilmente leggibile. Con Python un buon editor fa la stessa cosa, con la differenza che a Python serve anche per la sintassi.
Poi se ti piacciono gli alberi di natale o usi il blocco note, allora è un altro paio di maniche. :p
Se sei d'accordo potremmo farlo noi, qui, un piccolo confronto: implementiamo(anzi, implementate. Io debbo chiedere l'intervento di qualcuno che di Ruby se ne intenda: Vicius?) una funzione per il calcolo dei numeri di Fibonacci e prendiamo i tempi.
E' un benchmark del tutto inutile perché misura soltanto una situazione, e casualmente quella per cui la VM Ruby 1.9 è stata maggiormente ottimizzata.
Non è un caso, invece, che io abbia riportato questo (http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=yarv&lang2=python) link.
Si tratta di una serie di benchmark su applicazioni non banali dove il confronto avviene per una moltitudine di linguaggi, e sono disponibili anche per diverse macchine.
Ovviamente sono inclusi i sorgenti (basta clickare sull'apposito) link per vedere l'implementazione, e anche le eventuali opzioni di compilazione.
Sia chiaro: stiamo parlando sempre di benchmark sintetici, per cui lasciano il tempo che trovano, ma almeno è qualcosa di meglio del solo calcolo di Fibonacci (che, comunque, è incluso in uno dei test: recursive, e si nota, appunto, che è quello in cui Ruby 1.9 supera Python 2.5).
Ci sono già dei test significativi su Python 3.0?
cdimauro
31-10-2008, 22:15
Per Python 3.0 sono previste delle prestazioni inferiori. Qualche tempo fa con una beta era stato rilevato un decadimento del 30% circa, ma gli sviluppatori erano fiduciosi di migliorare la situazione per la versione finale.
Albitexm
01-11-2008, 02:19
Mmmm.... gli scacchi sono un po' particolari, secondo me. Ci sono degli algoritmi standard che i programmi più famosi usano più o meno tutti (la parte tattica che alla fin fine è solo calcolo) poi c'è l'engine di valutazione della posizione e un po' devi esserci dentro, nel senso devi sapere un po' giocare, altrimenti, piano piano, caschi dentro o vicino al classico brute-force. Ovviamente se ti basta un programma che giochi alla va là che vai bene la seconda parte puoi tralasciarla. Se studi un po' i sorgenti di Crafty secondo me hai tutto da guadagnare.
Qui (http://www.cs.unibo.it/~cianca/wwwpages/chesssite/mychesspage.html) trovi un po' di materiale utile al caso.
Programmi per giocare o analizzare ne ho a iosa. Io volevo creare qualcosa di più modesto: un generatore di mosse possibili , dei finali di Torre e pedone (superiore ai 5 pezzi, perchè fino a 5 pezzi ci sono già le tablebase dei finali).
Questo oltre a essere un esercizio didattico, avrebbe anche una sua utilità pratica . Spesso giocando per decine di minuti o ore , si focalizza l'attenzione su alcune mosse, trascurandone completamente altre ( che potrebbero essere interessanti).
Anche gli engines a volte non considerano mosse interessanti . Anche i più forti come Rybka o Fritz ,certe volte se gli imposti manualmente una mossa , vedono che è buona, ma da soli non la trovano. Quindi un programma che visualizza tutte le mosse possibili (senza valutazione), sarebbe utile per l'analisi.
Tutti i programmi di scacchi (crafty,Toga , Strelka ecc..) hanno una classe "GENMOVE" , che appunto genera le mosse possibili.
MA io volevo fare una cosa più semplice è originale. Io ho già scritto un programmino in Scilab che genera le mosse possibili dei finali di torre e pedoni . Ho rappresentato la scacchiera come una matrice di 64 numeri.
Ho dato un valore per le case vuote , uno alla torre,uno al Re e uno ai pedoni. Eseguendo moltiplicazioni vettoriali della matrice ottengo le posizioni possibili. Il problema è che questo programma sono in grado di usarlo solo io. Nel senso che per impostare la posizione d'analizzare, scrivo una matrice numerica e ottengo dei valori numerici. Ma un qualsiasi scacchista , dovrebbe potere inserire la posizione con un codice FEN (codice per rappresentare i pezzi) e leggere il risultato in PGN (codice di rappresentazione testuale delle games). In pratica manca l'interfaccia utente (input/output grafico).
Ho pensato a Ruby perchè nell'articolo sulla rivista ho letto :
1- "per far questo (sudoku player) adopereremo Ruby, implementando metodi euristici e avvantaggiandoci delle strutture propie del linguaggio".
2- "Rappresentazione dello schema: per prima cosa realizzeremo una classe le cui istanze rappresenterrano uno schema di gioco.Ovviamente, ogni istanza dovrà memorizzare lo stato delle caselle: se contengono un valore oppure no e se si di quale valore.Per il nostro scopo andrà benissimo un array che contenga, in corrispondenza di ogni casella, il valore della medesima, oppure 0 per indicare che la casella è vuota".
Il punto 2 si avvicina molto a quello che ho ideato in Scilab , e quindi ho pensato che forse Ruby mi poteva servire.
Questo è un link interessante sulla struttura di un chess engine : http://www.valocchi.it/lamosca/ :read:
cdimauro
01-11-2008, 07:24
In pratica manca l'interfaccia utente (input/output grafico).
Ho pensato a Ruby perchè nell'articolo sulla rivista ho letto :
1- "per far questo (sudoku player) adopereremo Ruby, implementando metodi euristici e avvantaggiandoci delle strutture propie del linguaggio".
2- "Rappresentazione dello schema: per prima cosa realizzeremo una classe le cui istanze rappresenterrano uno schema di gioco.Ovviamente, ogni istanza dovrà memorizzare lo stato delle caselle: se contengono un valore oppure no e se si di quale valore.Per il nostro scopo andrà benissimo un array che contenga, in corrispondenza di ogni casella, il valore della medesima, oppure 0 per indicare che la casella è vuota".
Il punto 2 si avvicina molto a quello che ho ideato in Scilab , e quindi ho pensato che forse Ruby mi poteva servire.
Questo è un link interessante sulla struttura di un chess engine : http://www.valocchi.it/lamosca/ :read:
Da quel che scrivi potresti usare un qualunque linguaggio di programmazione a oggetti. ;)
Programmi per giocare o analizzare ne ho a iosa. Io volevo creare qualcosa di più modesto: un generatore di mosse possibili , dei finali di Torre e pedone (superiore ai 5 pezzi, perchè fino a 5 pezzi ci sono già le tablebase dei finali).
Questo oltre a essere un esercizio didattico, avrebbe anche una sua utilità pratica . Spesso giocando per decine di minuti o ore , si focalizza l'attenzione su alcune mosse, trascurandone completamente altre ( che potrebbero essere interessanti).
Anche gli engines a volte non considerano mosse interessanti . Anche i più forti come Rybka o Fritz ,certe volte se gli imposti manualmente una mossa , vedono che è buona, ma da soli non la trovano. Quindi un programma che visualizza tutte le mosse possibili (senza valutazione), sarebbe utile per l'analisi.
Tutti i programmi di scacchi (crafty,Toga , Strelka ecc..) hanno una classe "GENMOVE" , che appunto genera le mosse possibili.
MA io volevo fare una cosa più semplice è originale. Io ho già scritto un programmino in Scilab che genera le mosse possibili dei finali di torre e pedoni . Ho rappresentato la scacchiera come una matrice di 64 numeri.
Ho dato un valore per le case vuote , uno alla torre,uno al Re e uno ai pedoni. Eseguendo moltiplicazioni vettoriali della matrice ottengo le posizioni possibili. Il problema è che questo programma sono in grado di usarlo solo io. Nel senso che per impostare la posizione d'analizzare, scrivo una matrice numerica e ottengo dei valori numerici. Ma un qualsiasi scacchista , dovrebbe potere inserire la posizione con un codice FEN (codice per rappresentare i pezzi) e leggere il risultato in PGN (codice di rappresentazione testuale delle games). In pratica manca l'interfaccia utente (input/output grafico).
Ho pensato a Ruby perchè nell'articolo sulla rivista ho letto :
1- "per far questo (sudoku player) adopereremo Ruby, implementando metodi euristici e avvantaggiandoci delle strutture propie del linguaggio".
2- "Rappresentazione dello schema: per prima cosa realizzeremo una classe le cui istanze rappresenterrano uno schema di gioco.Ovviamente, ogni istanza dovrà memorizzare lo stato delle caselle: se contengono un valore oppure no e se si di quale valore.Per il nostro scopo andrà benissimo un array che contenga, in corrispondenza di ogni casella, il valore della medesima, oppure 0 per indicare che la casella è vuota".
Il punto 2 si avvicina molto a quello che ho ideato in Scilab , e quindi ho pensato che forse Ruby mi poteva servire.
Questo è un link interessante sulla struttura di un chess engine : http://www.valocchi.it/lamosca/ :read:
Ho capito, una cosa un po' diversa dal solito, quindi. Sarebbe molto interessante vedere a quali strutture in particolare di Ruby si riferisce per capire in cosa e come il linguaggio ti avvantaggerebbe, in termini evidentemente di minor sforzo di creazione di quel particolare algoritmo visto che non è che con Ruby ci fai cose diverse da quanto fai col C piuttosto che con Python. In ogni caso il linguaggio è interessante e vale la pena apprenderlo anche "di per se stesso"
Albitexm
02-11-2008, 16:27
Ho capito, una cosa un po' diversa dal solito, quindi. Sarebbe molto interessante vedere a quali strutture in particolare di Ruby si riferisce per capire in cosa e come il linguaggio ti avvantaggerebbe, in termini evidentemente di minor sforzo di creazione di quel particolare algoritmo visto che non è che con Ruby ci fai cose diverse da quanto fai col C piuttosto che con Python. In ogni caso il linguaggio è interessante e vale la pena apprenderlo anche "di per se stesso"
Vero. Grazie dei consigli e link.
Nota spiacevole : ho scoperto che in una libreria del CD allegato alla rivista
di programmazione, dove ho letto l'articolo , c'è un Toian ! Lo ha rilevato
Avast. Queste cose screditano l'ambiente..
Vero. Grazie dei consigli e link.
Nota spiacevole : ho scoperto che in una libreria del CD allegato alla rivista
di programmazione, dove ho letto l'articolo , c'è un Toian ! Lo ha rilevato
Avast. Queste cose screditano l'ambiente..
A meno che non sia un falso positivo.....a volte (raramente) capita.
variabilepippo
02-11-2008, 16:59
Nota spiacevole : ho scoperto che in una libreria del CD allegato alla rivista
di programmazione, dove ho letto l'articolo , c'è un Toian ! Lo ha rilevato
Avast. Queste cose screditano l'ambiente..
Il motore euristico di Avast rivela molti falsi positivi... Prova a controllare l'eseguibile con Virus Total (http://www.virustotal.com/it/).
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.