Programming Ruby

The Pragmatic Programmer's Guide

Precedente < Indice ^
Prossimo >


Questo libro è un tutorial ed una guida per programmare con Ruby. Usate Ruby, e scriverete un codice migliore, sarete maggiormente produttivi, e vi divertirete di più.

Queste sono pretese audaci, ma siamo sicuri che alla fine del libro sarete d' accordo con noi. E abbiamo l' esperienza per salvare questa fiducia.

Come programmatori pragmatici abbiamo testato molti e molti linguaggi nelle nostre ricerche per tools che potevano rendere la nostra vita più facile, che ci aiutassero a svolgere i nostri lavori al meglio. Fin' ora, riteniamo di essere molto frustrati dai linguaggi che abbiamo usato.

Il nostro lavoro è di risolvere i problemi,non nutrire ompilatori, per questo ci piacciono i linguaggi dinamici che si adattano a noi, senza ruoli arbitrariamente rigidi. Abbiamo bisogno di chiarezza, così possiamo comunicare tramite il nostro codice. Valutiamo la brevità e l' abilità di esprimere una richiesta in codice accurato ed in modo efficiente. Più è corto il codice, meno errori produrremo ( senza considerare la gioia di polsi e dita...).

Vogliamo essere produttivi il prima possibile, così il nostro codice dovrà funzionare alla prima; il tempo speso nel debugging è tempo rubato all'orologio dello sviluppo. Ci aiuta anche se possiamo collaudare il nostro codice così com'è; se dovrete aspettare due ore per fare un ciclo, dovrete essere storditi e sottomettere il vostro lavoro alla compilazione.

Vogliamo un linguaggio che lavori ai più alti livelli di astrazione. Più alto è il livello del linguaggio, meno tempo spenderemo nella traduzione delle nostre richieste nel codice.

Quando abbiamo scoperto Ruby, abbiamo realizzato che avevamo trovato ciò che stavamo cercando. Più di ogni altro linguaggio con cui avevamo lavorato, Ruby si distingue come straordinario. Potrete concentrarvi sulla risoluzione dei problemi a mano, senza lottare con compilatori e regole di linguaggio. Questo è come ti può aiutare a divenire un migliore programmatore: dandovi la possibilità di spendere il tempo per creare soluzioni per i vostri utenti e non per i compilatori.

Le scintille di Ruby

Prendete un vero linguaggio orientato agli oggetti, come per esempio il Smalltalk. Saltate la non familiare sintassi e muovetevi verso un più convenzionale codice sorgente basato sui file. Aggiungete in buona misura la flessibilità e la convenienza di un linguaggio come il Python o il Perl.

Arriverete al Ruby.

Gli affezionati all' OO troveranno molte cose piacevoli in Ruby: le cose sono esattamente come un orientamento al puro oggetto (ogni cosa risulta essere un oggetto), metaclassi, chiusure, iteratori, e omnipresenti etereogenee collezioni. Gli utenti Smalltalk si troveranno come a casa loro ( e quelli del C++ e del Java ne saranno gelosi).

Allo stesso tempo, i maghi del Perl e del Python troveranno molte delle loro favorite caratteristiche: pieno supporto alle espressioni regolari, forti integrazioni con il sottostante sistema operativo, collegamenti utili e valutazioni dinamiche.

Ruby è facile da imparare. I compiti sono sempre semplici da codificare, e una volta fatti, è semplice mantenerli ed incrementarli. Cose apparentemente complicate diventano spesso facili. Ruby segue il Principle of Least Surprise--- le cose funzionano nella maniera in cui ti aspetti, con rare eccezioni. Ed è ciò che fà veramente la differenza nella programmazione.

Ruby è definito un linguaggio trasparente. Ciò significa che Ruby non nasconde le soluzioni che scrivete dietro molteplici segni di sintassi e non abbisogna di grandi quantitativi di codice per eseguire una semplice cosa. Con Ruby scriverete programmi correlati al problem domain. Con Ruby scoprirete che potrete esprimere le vostre idee ed i vostri progetti direttamente ed in maniera elegante, al contrario di molti altri linguaggi. E questo significherà scrivere il codice più velocemente, rendere i programmi maggiormente leggibili e di più facile manutenzione.

Usando Ruby vi meraviglierete di quanto codice potrete scrivere in una sessione, codice che funzionerà da subito. Ci saranno rari errori di sintassi, nessun tipo di violazione, meno bachi rispetto ad altri linguaggi. Ciò è logico: scrivendo di meno farete meno errori. Nessun fastidioso punto e virgola da computare alla fine di ogni linea. Nessun molesto dichiarazione da rendere sincrona (specialmente in file separati). Nessuna inutile parola solo per la felicità del programmatore. No error-prone framework code.

Perchè imparare Ruby? Perchè pensiamo che vi aiuterà a programmare meglio. Vi aiuterà a focalizzare il problema senza distrazioni. Vi renderà la vita più facile.

Quale tipo di linguaggio è Ruby?

Ai vecchi tempi la distinzione tra i linguaggi era semplice: erano comunque compilati, tipo il C o il Fortrain, o interpretati, tipo il Basic. I linguaggi compilati ti davano velocità e un accesso di basso livello; gli interpretati disponevano di un alto livello ma erano più lenti.

I tempi cambiano e le cose non sono più di così facile distinzione. Alcuni disegnatori di linguaggi hanno preso a chiamare le loro creazioni ``linguaggi di scripting". Dopo ciò, supponiamo che avevano intenzione di dire che i loro linguaggi sono interpretati e possono essere utilizzati per sostituire files batch e file di script, orchestrando il comportamento degli altri programmi e del sottostante sistema operativo. Perl, TCL, e Python sono tutti chiamati linguaggi di scripting.

Ma che cos'è esattamente un linguaggio di scripting? Francamente non sappiamo se esiste una distinzione da fare. In Ruby, potrete accedere a tutte le funzioni del sistema operativo sottostante. Potrete fare la stessa cosa sia in Ruby che in Perl o Python, e nello stesso tempo più chiaramente. Ma nonostante ciò Ruby è fondamentalmente differente. E' anche un vero linguaggio di programmazione, con radici teoriche ed una sintassi elegante e leggera. Potrai usare insieme un miscuglio di ``script"" con Ruby, ma probabilmente non lo farai. Invece, sarete maggiormente inclini a studiare una soluzione, per produrre un programma che sia facile da capire, semplice da mantenere, e che sia come una leccornia da espandere e da riutilizzare in futuro.

Nonostante ciò abbiamo usato Ruby per compiti di scripting e il più delle volte lo utilizziamo come linguaggio di programmazione per scopi generali. Lo abbiamo utilizzato per scrivere applicazioni GUI e processi server di media categoria, e per formattare grandi parti di questo libro. Altri per manipolare macchine server e database. Ruby si presta per le pagine Web, per interfacciarsi ai database al fine di generare contesti dinamici. Esistono persone che utilizzano Ruby per scrivere programmi sull' intelligenza artificiale e macchine senzienti, ed almeno una persona lo usa per analizzare l' evoluzione naturale. Ruby ha trovato casa come veicolo per l' esplorazione matematica. E le persone in tutto il mondo lo usano come modo per unire insieme tutte le loro applicazioni. E' veramente un grande linguaggio per produrre soluzioni in un ampia varietà di problemi.

E' per me Ruby?

Ruby non è la panacea per tutti i problemi dei programmatori. Esisteranno sempre situazioni in cui si renderà necessario un certo tipo di linguaggio: Le funzioni lo impongono, la necessità di particolari librerie, necessità di performance, o semplicemente litigarsi con le prove. Non abbiamo creato un linguaggio completo come il Java e il C++ (sebbene ci sono volte in cui desideriamo averlo fatto).

Comunque, Ruby è probabilmente più applicabile di quanto potreste pensare. E' facilmente estendibile, sia dall'interno del linguaggio che tramite link a librerie esterne. Si può utilizzare attraverso una serie di sistemi operativi, è relativamente leggero e utilizza una minima parte delle risorse del sistema. Ed è semplice da imparare; conosciamo persone che hanno generato codice Ruby all'interno di sistemi di produzione con un giorno di conoscenza delle bozze di questo libro. Abbiamo implementato parti di un Window Manager X11, un compito normalmente riservato al codice C. Ruby primeggia, e ci ha aiutato a scrivere codice in ore che altrimenti ci avrebbe impegnato per giorni.

Una volta appresa domestichezza, crediamo che lo utilizzerete come linguaggio preferito.

Perchè abbiamo scritto questo libro?

Non appena abbiamo terminato la stesura di The Pragmatic Programmer, i nostri familiari hanno ricominciato a parlarci, così abbiamo sentito il bisogno di scriverne un altro: perchè? Supponiamo di essere stati innondati di una specie di fervore missionario.

Ruby è stato creato in Giappone da Yukihiro Matsumoto (Matz). Dal 1995, la sua popolarità in Giappone è aumentata ad un ritmo sbalorditivo; ci sono voci che in Giappone sia più diffuso del Python. Ad oggi la maggior parte della documentazione è in giapponese, di conseguenza non è il linguaggio di programmazione in cui uno ci si imbatte.

Abbiamo voluto tradurre il testo, affinchè più persone al di fuori del Giappone possano utilizzare Ruby e trarne benefici: per questo motivo abbiamo deciso di documentare Ruby in inglese. Abbiamo messo in moto un piccolo progetto già in fase di crescita.

Le versioni di Ruby

Questo libro documenta la versione 1.6 di Ruby, che è stata realizzata nel Settembre 2000.

Le versioni con i numeri di sottoversione pari sono versioni pubbliche e stabili (1.0, 1.2, 1.4 etc.). Queste sono le versioni precompattate e rese disponibili nei vari siti Web di Ruby.

Le versioni di sviluppo hanno un numero di sottoversione dispari, come per esempio 1.1, 1.3, etc. Queste le dovrai scaricare e compilare, come descritto a pagina XXVII.

Installare Ruby

Puoi ottenere Ruby da ftp://ftp.netlab.co.jp/pub/lang/ruby, oppure dai mirror elencati a pagina 532 nell'appendice C. Lì troverete l' ultima versione stabile, come svariate in via di sviluppo.

Troverete sempre le versioni del codice sorgente di Ruby; troverete anche i binari precompilati per Windows o altri sistemi operativi (per esempio se cercate i binari di Ruby per Windows andate a http://www.pragmaticprogrammer.com/ruby/downloads/ruby-install.html).

Sidebar: The Very Latest Ruby
Per coloro che volgiono essere sempre aggiornati anche con versioni non testate (come abbiamo fatto noi durante la redazione di questo libro), potrete ottenere versioni in sviluppo direttamente dal deposito degli sviluppatori.

Gli sviluppatori Ruby utilizzano CVS (Concurrent Version System, liberamente disponibile a http://www.cvshome.com) come proprio sistema di controllo di versione. Potrete estrarre i file come utente anonimo dal loro archivio semplicemente eseguendo il seguente comando:

% cvs -d :pserver:anonymous@cvs.netlab.co.jp:/home/cvs
   login
(Logging in to anonymous@cvs.netlab.co.jp)
CVS password: guest
% cvs -d :pserver:anonymous@cvs.netlab.co.jp:/home/cvs
   checkout ruby

L'albero completo del codice sorgente, esattamente come lo hanno lasciato gli sviluppatori, verrà copiato in una subdirectory della tua macchina, facendo l' upload del tuo codice sorgente locale dal 'magazzino' all'altro capo del mondo. Non è un grande periodo per vivere?

Compilare Ruby

Nella distribuzione di Ruby troverai un file chiamato README, che spiega dettagliatamente la procedura d' installazione. Ricapitolando, compilerete Ruby all'interno di un sistema di tipo POSIX usando i medesimi quattro comandi che usate per le più comuni applicazioni Open Source: ./configure, make, make test, e make install. Potrete compilare Ruby in altri ambienti (incluso Windows) utilizzando un emulatore di ambiente POSIX tipo cygwin[Osservate http://sourceware.cygnus.com/cygwin per dettagli.] oppure utilizzando i compilatori nativi---osserva ``ntsetup.bat'' nelle distribuzioni di win32 al punto di partenza delle subdirectory.

Avviare Ruby

Ora che Ruby è installato, vi piacerà avviare qualche programma. A seconda dei differenti ambienti, esistono due modi per avviare Ruby---in modo interattivo e come un normale programma.

Interactive Ruby

Il modo più semplice per avviare Ruby in modalità interattiva è digitare semplicemente ``ruby'' al prompt.

% ruby
puts "Hello, world!"
^D
Hello, world!

Quì abbiamo digitato in una singola espressione puts e un carattere di stop file (che corrisponde al control-D nel sistema). Questo processo lavora, ma è una specie di doccia fredda se desiderate scrivere a macchina ed non essere in grado di poter vedere ciò che si stà digitando.

All'interno della directory sample della distribuzione Ruby troverete uno script denominato ``eval.rb''. E' già un passo avanti per mostrare il valore di tutte le espressioni così come sono state digitate:

% cd sample
% ruby eval.rb
ruby> a = "Hello, world!"
"Hello, world!"
ruby> puts a
Hello, world!
nil
ruby> ^D
%

Ora potrete osservare l' output di puts, e dopo il valore di ritorno di puts (che di fatto è nil).

Tutto funziona bene, ad eccezion fatta delle espressioni multiriga che non lavorano, e non potrete modificare la riga in cui andrete, o ritornare ed utilizzare precedenti righe (come normalmente fate con il comando storico della shell).

Nel prossimo passo per eval.rb, valuteremo irb---Interactive Ruby. irb è una shell di Ruby,completa di uno storico dei comandi, capacità di editare le linee e controllo dei lavori. E' abbastanza configurabile e dispone di molte opzioni, così tante che dispone di una sua propria appendice che inizia a pagina 523. Ci auguriamo che possiate godere di una certa familiarita con irb in modo da provare alcuni dei nostri esempi interattivi.

I Programmi

Per ultimo, potrete avviare un programma Ruby da un file come fareste con ogni altro shell script, come il Perl e il Python. Potrete avviare Ruby dando come argomento il nome dello script:

% ruby myprog.rb

O potrete usare la notazione ``shebang'' come prima linea del file. [Se il vostro sistema lo supporta potrete evitare di scrivere in modo esplicito il path di Ruby nella riga ``shebang'' utilizzando #!/usr/bin/env ruby, che ricerca il path per ruby e di seguito lo esegue].

#!/usr/local/bin/ruby -w

puts "Hello, World!"

Se renderete questo file eseguibile (usando per esempio chmod +x myprog.rb), Unix permetterà di eseguirlo cose se fosse un programma:

% ./myprog.rb
Hello, World!

Si può fare qualcosa di simile sotto Microsoft Windows utilizzando l' associazione dei file.

Risorse

Visitate il sito Web di Ruby, http://www.rubycentral.com e http://www.ruby-lang.org, per guardare cosa c' è di nuovo, e comunicare con altri utenti di Ruby sui newsgroup o sulle mailing lists (riferimento in appendice C)

E sarete sicuramente apprezzati. Commenti, suggerimenti, errori testuali e problemi con gli esempi saranno benvenuti. Mandateci una e-mail a:

mailto:rubybook@pragmaticprogrammer.com

Se ci vorrete comunicare degli errori nel libro, li aggiungeremo alla lista degli errori a:

http://www.pragmaticprogrammer.com/ruby/errata/errata.html

Finalmente, http://www.pragmaticprogrammer.com/ruby contiene anche il codice sorgente di tutti gli esempi del libro, organizzati per pagina.

Riconoscimenti

Un libro è in particolar modo intraprendenza, una cosa che non saremo stati in grado di completare senza l' aiuto di tutti i nostri amici, vecchi e nuovi. Siamo orgogliosi di annoverare tra i nostri vecchi amici il gruppo a Addison-Wesley: Mike Hendrickson, John Fuller, the ever-helpful Julie Steele, and the wonderful Julie DiNicola. Grazie a tutti.

I nostri revisori sono stati fantastici. Li abbiamo messi di fronte a paludose linee mortali e ne sono usciti per noi. Revisionare un libro farcito di dettagli tecnici non è facile, così siamo particolarmente grati a: George Coe, Bob Davison, Jeff Deifik, Hal Fulton, Tadayoshi Funaba, Clemens Hintze, Kazuhiro Hiwada, Kikutani Makoto, Mike Linksvayer, Aleksi Niemelä, Lew Perin, Jared Richardson, Armin Roehrl, Conrad Schneiker, Patrick Schoenbach, and Eric Vought. Ringraziamenti vanno anche ai due Julies a Addison-Wesley per aver coordinato veramente questo sviluppo internazionale.

Molte persone ci hanno aiutato in aree specifiche di questo libro. Tadayoshi Funaba ha scambiato innumerevoli e-mail con noi fino a che abbiamo capito il modulo Date. Guy Decoux e Clemens Hintze hanno risposto pazientemente alle nostre domande sulle estensioni di Ruby, e Masaki Suketa ci ha aiutati a capire il modulo WinOLE.

Nonostante tutto, la maggior parte della documentazione di Ruby è in giapponese, c' è un corpo accresciuto di traduzioni in inglese, il più intrapreso da sviluppatori giapponesi che sono scafati con l' inglese, mai paghi di stupirci. Benchè esistano svariati contributi individuali in questo sforzo da nominare ogni autore, vorremo segnalare Goto Kentaro, che ha prodotto un grosso volume di documentazione altamente qualitativa e l' ha posta online.

Alla fine vorremo ringraziare Yukihiro ``Matz'' Matsumoto, il creatore di Ruby. Abbiamo perso il numero di domande che gli abbiamo posto, e il numero di pazienti e dettagliate risposte che ci ha rispedito. Come ha creato un vero meraviglioso linguaggio, ha nutrito uno stupendo supporto ed una cultura aperta nel quale questo linguaggio può prosperare.

Grazie a tutti. Domo arigato gozaimasu.

Dave Thomas e Andy Hunt
THE PRAGMATIC PROGRAMMERS
http://www.pragmaticprogrammer.com

Convenzioni sintattiche

Attraverso il libro, utilizzeremo le seguenti notazioni sintattiche

Gli esempi di codice letterale sono mostrati usando un font tipo macchina da scrivere:

class SampleCode
  def run
    #...
  end
end

All'interno del testo Fred#doIt è un riferimento ad un metodo istanza (doIt) di classe Fred, mentre Fred#new[in altra documentazione potrete trovare i metodi di classe scritti come Fred::new. Questo è perfettamente corretto per la sintassi di Ruby; abbiamo preferito Fred.new perchè distrae meno nella lettura.] è un metodo di classe e Fred#EOF è una costante di classe.

Il libro contiene molti frammenti di codice Ruby. Ove possibile abbiamo mostrato cosa succede quando lo avvierete. Nei casi più semplici, mostreremo il valore dell' espressione sulla stessa riga. Per esempio:

a = 1
b = 2
a + b » 3

Al tempo, siamo interessati ai valori delle funzioni di assegnamento, che vi mostreremo.

a = 1 » 1
b = 2 » 2
a + b » 3

Se il programma produrrà un complesso output, lo mostreremo sotto il codice del programma:

3.times { puts "Hello!" }

produce:

Hello!
Hello!
Hello!

Nella documentazione della libreria, abbiamo voluto mostrare dove gli spazi appaiono nell'output. Vedrete questi spazi come caratteri ``[visible space]''.

Le chiamate da linea di comando sono mostrate come testo con carattere Roman, e i parametri che fornite in un font italic. Gli elementi opzionali sono mostrati tra grandi parentesi quadre.

ruby [flags] [progname] [arguments]


Precedente < Indice ^
Prossimo >

Estratto dal libro "Programming Ruby - The Pragmatic Programmer's Guide"
Copyright © 2000 Addison Wesley Longman, Inc. Released under the terms of the Open Publication License V1.0.
This reference is available for download.