|
| 1 | +--- |
| 2 | +layout: page |
| 3 | +title: "A proposito di Ruby" |
| 4 | +lang: it |
| 5 | +--- |
| 6 | + |
| 7 | +Ti stai chiedendo perché Ruby sia così popolare? I suoi fan lo chiamano |
| 8 | +“un linguaggio pulito ed elegante”, e ciononostante è pratico e |
| 9 | +funzionale. Come mai? |
| 10 | + |
| 11 | +### Gli ideali del creatore di Ruby |
| 12 | + |
| 13 | +{: |
| 14 | +style="padding-left:8px;"} |
| 15 | +{: style="float:right"} |
| 16 | + |
| 17 | +Ruby è un linguaggio di equilibrio e armonia. Il suo creatore, [Yukihiro |
| 18 | +“matz” Matsumoto][1], ha fuso insieme parti dei suoi linguaggi di |
| 19 | +programmazione preferiti (Perl, Smalltalk, Eiffel, Ada e Lisp) per |
| 20 | +creare un nuovo linguaggio in grado di bilanciare programmazione |
| 21 | +funzionale con programmazione imperativa. |
| 22 | + |
| 23 | +Lui stesso ha detto più volte che sta continuamente “provando a rendere |
| 24 | +Ruby naturale, non semplice”, in un modo che è simile alla stessa vita. |
| 25 | + |
| 26 | +Chiarificando questo concetto, Matz aggiunge: |
| 27 | + |
| 28 | +> Ruby è apparentemente semplice, ma al suo interno è molto complesso, |
| 29 | +> proprio come il corpo umano<sup>[1](#fn1)</sup>. |
| 30 | +
|
| 31 | +### Riguardo alla crescita di Ruby |
| 32 | + |
| 33 | +Fin dalla prima release pubblica, nel 1995, Since its public release in |
| 34 | +1995, Ruby ha attirato sviluppatori appassionati da tutto il mondo. Nel |
| 35 | +2006, Ruby è stato universalmente accettato, con attivi gruppi di |
| 36 | +discussione formatisi nelle maggiori città del mondo e conferenze a tema |
| 37 | +capaci di fare il tutto esaurito. |
| 38 | + |
| 39 | +{: style="padding-left:8px;"} |
| 42 | +{: style="float:right"} |
| 43 | + |
| 44 | +Ruby-Talk, la prima [lista di discussione](/it/community/mailing-lists/) |
| 45 | +per il linguaggio Ruby, ha raggiunto il traguardo di 200 nuovo messaggi |
| 46 | +al giorno. |
| 47 | + |
| 48 | +L’indice TIOBE, che misura la crescita dei linguaggi di programmazione, |
| 49 | +mette Ruby al decimo posto tra tutti i linguaggi di programmazione |
| 50 | +esistenti al mondo. Gran parte di questa crescita è da attribuire alla |
| 51 | +popolarità dei programmi scritti in Ruby, in particolare il framework |
| 52 | +Ruby on Rails<sup>[2](#fn2)</sup>. |
| 53 | + |
| 54 | +Ruby è anche un linguaggio [libero e gratuito](./license.txt). Non solo |
| 55 | +non costa nulla, ma può anche essere usato, copiato, modificato e |
| 56 | +distribuito liberamente. |
| 57 | + |
| 58 | +### Interpretare ogni cosa come un Oggetto |
| 59 | + |
| 60 | +Inizialmente, Matz guardò ad altri linguaggi per trovare una sintassi |
| 61 | +ideale. Pensando a questa sua ricerca, ha detto lui stesso: “Volevo un |
| 62 | +linguaggio di scripting che fosse più potente di Perl, e allo stesso |
| 63 | +tempo più orientato agli oggetti di Python<sup>[3](#fn3)</sup>.” |
| 64 | + |
| 65 | +In Ruby, ogni cosa è un oggetto: ogni parte di informazione e codice ha |
| 66 | +delle sue proprietà e azioni. La programmazione ad oggetti chiama le |
| 67 | +proprietà con il nome *variabili di istanza* e le azioni sono conosciute |
| 68 | +come *metodi*. L’approccio puramente orientato agli oggetti di Ruby è |
| 69 | +facilmente dimostrabile dalla seguente porzione di codice che applica |
| 70 | +un’azione ad un numero: |
| 71 | + |
| 72 | + 5.times { print "Ruby è un linguaggio fantastico" } |
| 73 | +{: .code .ruby-code} |
| 74 | + |
| 75 | +In molti linguaggi, i numeri e gli altri tipi primitivi non sono |
| 76 | +oggetti, ma Ruby, seguendo l’esempio di Smalltalk, dà metodi e variabili |
| 77 | +di istanza a tutti i suoi tipi. Questo rende più facile l’utilizzo di |
| 78 | +Ruby, dal momento che tutte le regole applicabili agli oggetti si |
| 79 | +applicano, di fatto, all’intero linguaggio. |
| 80 | + |
| 81 | +### La flessibilità di Ruby |
| 82 | + |
| 83 | +Ruby è visto come un linguaggio flessibile, dal momento che permette |
| 84 | +agli utenti di alterare liberamente le sue parti, che possono essere |
| 85 | +rimosse o ridefinite a discrezione dell’utente stesso: Ruby cerca di non |
| 86 | +dare troppi limiti agli sviluppatori. Per esempio, la somma è eseguita |
| 87 | +mediante l’operatore `+`, ma se preferisci usare la parola `aggiungere`, |
| 88 | +puoi creare tale metodo aggiungendolo alla stessa classe `Numeric`, che |
| 89 | +è predefinita, così: |
| 90 | + |
| 91 | + class Numeric |
| 92 | + def aggiungi(x) |
| 93 | + self.+(x) |
| 94 | + end |
| 95 | + end |
| 96 | + |
| 97 | + y = 5.aggiungi 6 |
| 98 | + # y è ora uguale a 11 |
| 99 | +{: .code .ruby-code} |
| 100 | + |
| 101 | +Gli operatori di Ruby non sono altro che un modo semplice per eseguire |
| 102 | +operazioni normalmente effettuate dai metodi, e possono essere |
| 103 | +ridefiniti. |
| 104 | + |
| 105 | +### I blocchi, una peculiarità veramente interessante |
| 106 | + |
| 107 | +I *blocchi* sono una delle molteplici ragioni della flessibilità di |
| 108 | +questo linguaggio. A programmer can attach a closure to any method, |
| 109 | +describing how that method should act. The closure is called a *block* |
| 110 | +and has become one of the most popular features for newcomers to Ruby |
| 111 | +from other imperative languages like PHP or Visual Basic. |
| 112 | + |
| 113 | +I blocchi sono stati ispirati dai linguaggi funzionali. Matz ha detto, |
| 114 | +“nelle *closures* in Ruby closures, ho voluto rispettare la cultura di |
| 115 | +Lisp<sup>[4](#fn4)</sup>.” |
| 116 | + |
| 117 | + motori_di_ricerca = |
| 118 | + %w[Google Yahoo MSN].map do |sito| |
| 119 | + "http://www." + sito.downcase + ".com" |
| 120 | + end |
| 121 | +{: .code .ruby-code} |
| 122 | + |
| 123 | +In questo pezzo di codice, il blocco è deimitato dal costrutto `do ... |
| 124 | +end`, e il metodo `map` applica il codice del blocco alla lista di |
| 125 | +parole specificata. Molti altri metodo in Ruby danno spazio allo |
| 126 | +sviluppatore per creare i propri blocchi in modo da definire le |
| 127 | +operazioni che quel metodo deve eseguire. |
| 128 | + |
| 129 | +### Ruby e “miscugli” |
| 130 | + |
| 131 | +A differenza di molti altri linguaggi ad oggetti, in Ruby si può usare |
| 132 | +solamente l’ereditarietà singola. Tuttavia, Ruby dispone del concetto di |
| 133 | +“modulo” (Categoria nell’Objective-C), ovvero un raggruppamento di |
| 134 | +metodi. |
| 135 | + |
| 136 | +In Ruby, è possibile utilizzare i moduli per creare dei “miscugli” |
| 137 | +(mixins): le classi possono infatti includere al loro interno un modulo |
| 138 | +ed ereditare tutti i suoi metodi, automaticamente. Per esempio, |
| 139 | +qualsiasi classe che implementa il metodo `each` può includere il modulo |
| 140 | +`Enumerable` per ottenere una serie di metodi utili che usano il metodo |
| 141 | +`each` per le iterazioni. |
| 142 | + |
| 143 | + class IlMioArray |
| 144 | + include Enumerable |
| 145 | + end |
| 146 | +{: .code .ruby-code} |
| 147 | + |
| 148 | +Generalmente, gli appassionati di Ruby considerano questa pratica molto |
| 149 | +più pulita e gestibile dell’eredità multipla, che è complessa e può |
| 150 | +essere troppo restrittiva. |
| 151 | + |
| 152 | +### L’aspetto di Ruby |
| 153 | + |
| 154 | +Sebbene Ruby limiti il più possibile la punteggiatura a favore di parole |
| 155 | +chiave in lingua inglese, certi segni di interpunzione sono usati per |
| 156 | +“decorare” il linguaggio. Ruby non ha bisogno di dichiarazioni di |
| 157 | +variabili, perché usa convenzioni particolari per denotare la visibilità |
| 158 | +delle variabili: |
| 159 | + |
| 160 | +* `var` potrebbe essere una variabile locale |
| 161 | +* `@var` è una variabile di istanza |
| 162 | +* `$var` è una variabile globale |
| 163 | + |
| 164 | +Questi marcatori rendono il linguaggio più leggibile dando la |
| 165 | +possibilità al programmatore di identificare a colpo d’occhio il ruolo |
| 166 | +di ogni variabile. In questo modo, anche l’uso della parola chiave |
| 167 | +`self` da prependere a ogni membro di istanza diventa superfluo. |
| 168 | + |
| 169 | +### Funzionalità avanzate |
| 170 | + |
| 171 | +Ruby è in grado di offrire una marea di altre funzionalità, tra cui: |
| 172 | + |
| 173 | +* la gestione delle eccezioni, proprio come Java o Python, per rendere |
| 174 | + la gestione degli errori più semplice. |
| 175 | +^ |
| 176 | + |
| 177 | +* Garbage collection automatica per tutti gli oggetti, come dice Matz: |
| 178 | + “Molto meglio per la tua salute!” |
| 179 | +^ |
| 180 | + |
| 181 | +* Scrivere estensioni in linguaggio C per Ruby è più facile che |
| 182 | + scriverle per Perl o Python, grazie a un’API molto elegante per |
| 183 | + accedere a Ruby da C. Tale API include chiamate per includere ruby in |
| 184 | + programmi, in modo da usarlo come linguaggio di scripting. È |
| 185 | + disponibile anche un’interfaccia SWIG. |
| 186 | +^ |
| 187 | + |
| 188 | +* Ruby è in grado di caricare dinamicamente delle extension library, se |
| 189 | + il sistema operativo lo permette. |
| 190 | +^ |
| 191 | + |
| 192 | +* Ruby offre funzionalità di threading indipendenti dal sistema |
| 193 | + operativo. In questo modo si può avere multithreading su tutte le |
| 194 | + piattaforme in grado di eseguire Ruby, indipendentemente dal fatto che |
| 195 | + il sistema operativo lo supporti o meno, anche in DOS! |
| 196 | +^ |
| 197 | + |
| 198 | +* Ruby è altamente portatile: è sviluppato principalmente su GNU/Linux, |
| 199 | + ma funzione su molte varianti di UNIX, Mac OS X, Windows |
| 200 | + 95/98/Me/NT/2000/XP, DOS, BeOS, OS/2, ecc. |
| 201 | + |
| 202 | +#### References |
| 203 | + |
| 204 | +<sup>1</sup> Matz, parlando nella lista di discussione “Ruby-Talk”, [May |
| 205 | +12th, 2000][2]. |
| 206 | +{: #fn1} |
| 207 | + |
| 208 | +<sup>2</sup> Per ulteriori informazioni, visita la home page di [Ruby on |
| 209 | +Rails][3]. |
| 210 | +{: #fn2} |
| 211 | + |
| 212 | +<sup>3</sup> Matz, in [Un’intervista con il creatore di Ruby][4], Nov. |
| 213 | +29th, 2001. |
| 214 | +{: #fn3} |
| 215 | + |
| 216 | +<sup>4</sup> Matz, in [Blocchi e *closure* in Ruby][5], December 22nd, |
| 217 | +2003. |
| 218 | +{: #fn4} |
| 219 | + |
| 220 | + |
| 221 | + |
| 222 | +[1]: http://www.rubyist.net/~matz/ |
| 223 | +[2]: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/2773 |
| 224 | +[3]: http://rubyonrails.org/ |
| 225 | +[4]: http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html |
| 226 | +[5]: http://www.artima.com/intv/closures2.html |
0 commit comments