Paradigma | berbilang paradigma (kefungsian, imperatif, logik, berorientasi objek (berasaskan kelas)) |
---|---|
Muncul pada | 1995 |
Direka oleh | Yukihiro Matsumoto |
Pembangun | Yukihiro Matsumoto (antara lain) |
Lepasan stabil | 1.9.0 (25 Disember 2007) |
Disiplin penjenisan | dinamik ("itik") |
Pelaksanaan utama | Ruby, JRuby |
Dipengaruhi | Smalltalk, Perl, LISP, Scheme, Python, CLU, Eiffel, Dylan |
Mempengaruhi | Groovy |
OS | Silang pelantar |
Lesen | Lesen Ruby dan GPL |
Laman web | www.ruby-lang.org |
Ruby ialah dicipta sebuah bahasa pengaturcaraan berorientasi objek. Ia menggabungkan sintaks yang diilhamkan dari Perl dengan ciri-ciri orientasi objek yang menyerupai Smalltalk, dan juga berkongsi beberapa ciri dengan Python, Lisp, Dylan dan CLU. Ruby merupakan sebuah bahasa tertafsir laluan tunggal. Pelaksanaan utamanya ialah perisian bebas yang diagihkan di bawah sebuah pelesenan sumber terbuka.
Sejarah
Bahasa ini dicipta oleh Yukihiro Matsumoto (digelar sebagai "Matz"), yang mula membina Ruby pada 24 Februari 1993, dan kemudiannya menerbitkannya kepada orang awam pada tahun 1995. Beliau memberi nama "Ruby" sempena hari jadi seorang rakan. Setakat September 2006, versi stabil yang terakhir ialah 1.8.5. Ruby 1.9 (dengan beberapa perubahan besar) pula sedang dalam pembinaan.
Falsafah
Tanggapan utama Matz menganai reka bentuk Ruby ialah untuk menjadikan para pengaturcara gembira dengan mengurangkan bebanan kerja yang perlu mereka hadapi, iaitu dengan menuruti prinsip-prinsip reka bentuk antara muka pengguna yang baik. Beliau menegaskan bahawa reka bentuk sistem perlu menekankan kepentingan manusia, bukannya komputer:
Bisanya orang, terutamanya jurutera komputer, memfokuskan mesin. Mereka fikir, "Dengan melakukan ini, mesin ini akan berjalan lebih pantas. Dengan melakukan ini, mesin ini akan berjalan dengan lebih berkesan. Dengan melakukan ini, mesin ini akan menjadi itu dan ini." Mereka memfokuskan mesin. Tetapi sebenarnya kita perlu memfokuskan manusia itu sendiri, tentang bagaimana manusia mengambil berat dengan melakukan pengaturcaraan atau mengendalikan aplikasi mesin. Kitalah ketua. Mereka [mesin] adalah hamba.
Ruby dikatakan mengikut prinsip sedikit kejutan (prinsiple of least surprise), iaitu bahasa tersebut menuruti tanggapan si pengaturcara. Pepatah tersebut tidak berasal dari Matz dan, umumnya, Ruby lebih mengikut paradigma yang diistilahkan sebagai "Matz's Least Surprise", walaupun ramai pengaturcara menganggap bahawa ia juga mendekati model mental mereka.
Semantik
Ruby ialah berorientasi objek: setiap satu data merupakan objek, sampaikan kelas dan jenis yang ditakrifkan bahasa lain sebagai primitif (seperti integer, boole, dan "nil"). Setiap fungsi ialah kaedah. Pemboleh ubah sentiasa merujuk kepada objek, tetapi pemboleh ubah itu sendiri bukannya objek. Ruby menyokong pewarisan dengan hantaran dinamik (dynamic dispatch), campuran (mixin) dan kaedah unsur tunggal (singleton method). Walaupun Ruby tidak menyokong pewarisan berbilang (multiple inheritance), kelas (class) boleh mengimport modul sebagai campuran.
Ruby telah disifatkan sebagai sebuah bahasa pengaturcaraan berbilang paradigma: ia membenarkan pengaturcaraan bertatacara (mentakrifkan fungsi atau pembolehubah di luar kelas membuatkan mereka sebahagian daripada akar, objek 'self'), dengan perorientasian objek (semua benda ialah objek) atau pengaturcaraan kefungsian (ia mempunyai fungsi awanama, penutupan, dan pelanjaran (continuation); semua kenyataan ada nilainya, dan fungsi memulangkan penilaian yang terakhir). Ia menyokong kaji diri, pantulan dan metapengaturcaraan, di samping bebenang berasaskan pentafsir[1]. Ruby menampilkan penjenisan dinamik serta menyokong polimorfisme parameter.
Menurut FAQ Ruby,[2] "Jika anda sukakan Perl, anda akan sukakan Ruby dan rasa tidak asing dengan sintaksnya. Jika anda sukakan Smalltalk, anda akan tidak akan rasa janggal dengan semantiknya. Jika anda sukakan Python, anda mungkin atau mungkin tidak akan tidak selesa dengan perbezaan yang amat besar dari segi rekaan antara Python dan Ruby/Perl."
Ciri-ciri
- berorientasi objek
- empat peringkat lingkungan pemboleh ubah: global, kelas, ciptaan (instance), dan tempatan.
- tanganan pengecualian (exception handling)
- pelelar (iterator) dan tutupan (closure) (dengan memindahkan blok kod)
- ungkapan nalar (regular expression) yang menyerupai Perl pada peringkat teras
- pembeban pengoperasi (operator overloading)
- kutipan sampah (garbage collection) automatik
- mudah alih
- pemuatan dinamik terhadap perpustakaan DLL pada hampir semua platform
- introspeksi, pantulan (reflection), dan pengaturcaraan meta (meta-programming)
- pustaka piawai (standard library) yang agak luas
- menyokong suntikan tanggungan (dependency injection)
- penyelanjaran (continuation) dan penjana (generator)
Interaksi
Agihan rasmi Ruby juga memasukkan "irb", sebuah pentafsir baris perintah (command-line) saling tindak yang boleh digunakan untuk menguji kod secara serta-merta. Demikian adalah salah satu contoh bagi sebuah sesi bersama atur cara saling tindak ini:
$ irb irb(main):001:0> puts "Hello, Dunia" Hello, Dunia => nil irb(main):002:0> 1+2 => 3
Kritikan
Antara kritikan paling utama dalam Ruby ialah tiada sokongan untuk Unicode, walau bagaimanapun ia memiliki sedikit sokongan untuk UTF-8.
Sintaks
Sintaks bagi Ruby adalah hampir sama dengan Perl dan Python. Takrifan kelas dan kaedah adalah menggunakan isyarat kata kunci. Berbeza dengan Perl, pemboleh ubah tidak semestinya didahulukan dengan sigil. (sigil boleh digunakan untuk mengubah semantik lingkupan pemboleh ubah tersebut) Perbezaan yang paling ketara dengan C dan Perl ialah kata kunci biasanya digunakan untuk mentakrifkan bok kod logikal, tanpa menggunakan braket. Pemisah baris adalah signifikan dan dianggap sebagai pengakhir penyataan (noktah bertindih boleh juga digunakan sebagai alternatif). Berbeza dengan Python, engsot tidak signifikan.
Sila lihat contoh-contoh kod yang membayangkan sintaks Ruby di bahagian Contoh rencana ini.
Contoh
Beberapa kod asas bagi Ruby:
# Semua dalam Ruby, termasuk harafiah, adalah objek
-199.abs # 199
"ruby sangat menarik".length # 19
"Ali".index("i") # 2
"Selamat pagi".split(//).uniq.sort.join # "Saegilmpt"
Kelas
Kod dibawah ini mentakrifkan sebuah kelas dinamakan Person. Sebagai tambahan untuk pengawalan, konstruktor lazim untuk mencipta objek baru, ia mempunyai dua kaedah: satu untuk menggantikan operator pembeza <=> (supaya Array#sort
boleh menyusun mengikut umur) dan satu lagi untuk menggantikan kaedah to_s
(supaya Kernel#puts
boleh memformat outputnya). Di sini, "attr_reader
" adalah satu contoh bagi pengaturcaraan meta dalam Ruby: "attr" mentakrifkan kaedah geter (getter) dan penentu (setter) untuk pemboleh ubah ciptaan (instance variable); "attr_reader": hanya kaedah geter. Juga, penyataan terakhir yang dinilai dalam sebuah kaedah ialah nilai yang dikembalikan, oleh itu penggunaan 'return' yang eksplisit boleh diabaikan.
class Orang
def initialize(nama, umur)
@nama, @umur = nama, umur
end
def <=>(orang)
@umur <=> orang.umur
end
def to_s
"#{@nama} (#{@umur})"
end
attr_reader :nama, :umur
end
group = [ Orang.new("Ali", 20),
Orang.new("Abu", 63),
Orang.new("Ahmad", 16) ]
puts group.sort.reverse
Paparan yang muncul daripada yang di atas adalah tiga nama dalam susunan umur menurun:
Abu (63) Ali (20) Ahmad (16)
Rujukan
Pautan luar
- (Inggeris) Tapak web rasmi Ruby
- (Indonesia) Tapak web rasmi Ruby
- (Inggeris) Why's (Poignant) Guide to Ruby
- (Inggeris) Malaysia.rb, kumpulan peminat Ruby Malaysia.