روبی
از ویکیپدیا، دانشنامهٔ آزاد
- برای دیگر کاربردها روبی (ابهامزدایی) را ببینید.
روبی (انگلیسی: Ruby) یک زبان برنامه نویسی انعطافپذیر، پویا و شیگرا است. روبی سینتکس پرل و شی گرایی اسمالتاک را ترکیب میکند و در برخی امکانات با پایتون و لیسپ و Dylan و CLU مشترک است. روبی یک زبان مفسر single-pass است. پیاده سازی اصلی آن یک نرم افزار آزاد منتشر شده تحت یک مجوز متنباز(GPL) است.
فهرست مندرجات |
[ویرایش] تاریخچه
ایده روبی در سال 1993توسط" یوکیهیرو ماتسوموتو " بیان شد.او کسی بود که آرزوی زبان جدیدی که بتواندتعادل مناسبی بین برنامه نویسی تابعی وامری برقرار کند را در سر می پروراند.او در این زمینه میگوید:"من می خواستم زبان اسکریپتی تولید کنم که قدرتمند تر از "پرل " و شی گرا تر از "پیتون "باشد.ااین دلیل من برای طراحی این زبان بود". علت ودلیل یابی نامگذاری روبی در مورد نام روبی قبل از اینکه هیچ کدی توسط این برنامه نوشته شود با مشارکت "ماتسوموتو" و "کیجو ایشیتسوکا" در یک آنلاین چت در 24فبریه 1993تصمیم گیری شد.دونام پیشنهاد شده بود "کورال" و"روبی" و در نهایت یکی از نام ها توسط توسط ماتسوموتو انتخاب شد که به صورت ایمیل به ایشیتسوکا فرستاد.بعدا ماتسوموتو دلیل انتخاب روبی را معنی آن بیان کرد که یک جواهر میباشد که نماد ماه تولد یکی از همکاران اوست.بعدا انها متوجه شدند که نام پرل نیز جواهری نشان دهنده ماه "جون" میباشد در صورتی که روبی نماد "جولای "است.به طور غیر مستقیم میتوان گفت روبی مقام جانشینی پرل را داراست. اولین انتشار اولین انتشار روبی به عنوان روبی 0.95خارج شد که توسط یک گروه خبری داخلی در 1995 منتشر شد‚بعدا سه مدل دیگر روبی در طی دو روز بیرون آمد. روبی 1.0 Ruby-Talkانگلیسی به نام Mailing listاین مدل در 25 دسامر 1996به بازار آمد.در ادامه در سال 1999روبی 1.3اولین روبی با آغاز شد.که باعث افزایش علاقه مندی ها در خارج از ژاپن شد.در سپتامر 2000اولین کتاب انگلیسی به نام برنامه نویسی با روبی منتشر شد که بعدا به صورت مجانی برای گسترده کردن استفاده روبی در میان انگلیسی زبانان صورت گرفت. روبی 1.8.7 در جون 2008‚آخرین مدل ایستای مرجع اجرایی 1.8.7بود.ویژگی های کامل تر به کتابخانههای استاندارد این مدل در مدل 1.9.0اضافه شد که به صورت توسعه یافته تر نسبت به 1.8.7انتشار یافت.مدل 1.86بعضی از تغییرات نحوی را شامل نمیشود. روبی 1.9.1 مدل بعدی روبی 1.9.1می باشد وطبق جدول زمانی در 25 ژانویه 2009انتشار مییابد.این روبی تغییرات زیادی را در مقایسه با 1.8.6معرفی خواهد کرد.مانند:متغییر های داخل بلوک‚اضافه شدن به نحو لامبدا وپشتیبانی از کاراکتر انکدینگ را شامل میشود.
[ویرایش] فلسفه
سازنده زبان روبی یوکیهیرو ماتز ماتسوموتو میگوید روبی برای سازندگی بهتر برنامه نویس طراحی شده است که هدف User interface را به خوبی دنبال میکند.او نگران است که طراحی سیستم ها به جای کامپیوتر نیاز به توجه بر انسان ها داشته باشد.معمولا مردم‚مخصوصا مهندسان کامپیوتر بر روی ماشین تمرکز کند.آن ها فکر میکنند"با انجام این کار ماشین ها سریعتر میشوند‚ماشین ها در اجرا موثر تر میباشندو.... آن ها بر ماشین تمرکز میکنند‚اما در حقیقت ما نیاز داریم که به انسان ها توجه کنیم‚اینکه چگونه آنها به برنامه نویسی توجه دارندویا چگونه به اجرای برنامههای ماشین دقت میکنند. روبی برای تعقیب هدف کمترین قافلگیری بیان شدبه این معنی که زبان باید طوری رفتار کند که کمترین گیج کنندگی را برای استفاده کنندههای ا تجربه داشته باشد.ماتسوموتو همچنین اظهار میدارد که هدف اولین طراحی او درست کردن زبانی که خودش از آن لذت ببرد این کار با کم کردن کار برنامه نویس و ابهامات منطقی میباشد.اما کمترین غافلگیری هنوز خیلی به بیان زبان برنامه نویسی روبی نزدیک است. افراد ناشی شاید این را به این معنا تعبیر کنند که رفتار های روبی سعی در متصل کردن اشتراکات رفتار های دیگر زبان ها را دارد. در بحث ماه "می" 2005در روزنامه "کامپ.لنگ.روبی " ماکسوموتو تلاش کرد که روبی را از مینیمم غافلگیری دور کند.توضیح اینکه هر شانس طراحی بعضی ها را متعجب میکند. او از استاندارد خود برای ارزیابی غافلگیری استفاده کرد.ماتسوموتو این را در یک گزارش مطرح ساخت. "همه یک پیشینه شخصی دارند‚بعضی ها از جانب پیتون میآیند بعضی های دیگه از پرل و آن ها ممکن است از بعضی از جنبههای متفاوت زبان غافلگیر شوند.سپس آن ها به من میگویند ما از بعضی از جنبههای زبان غافلگیر شدیم‚بنابرین روبی قانون کمترین غافلگیری را زیر پا گذاشته است.صبر کنید..... هدف کمترین غافلگیری فقط برای شما نیست.این هدف به معنای کمترین غافلگیری ممکن برای بیان من میباشد.این به معنای کمترین غافلگیری بعد از آموزش کامل زبان است. برای مثال من قبل از اینکه روبی را طراحی کنم یک برنامه نویس++c بودم.من منحصرا دو سه سال در++Cبرنامه نوشتم.و بعد از دو سال برنامه نویسی با آن ‚هنوز مرا متعجب میکرد.
[ویرایش] معنی شناسی
روبی شی گراست:همه انواع داده شی هستند‚از جمله کلاس ها و خیلی از انواع دادهای که به طور معمول در بقیه زبان ها نیز هست مانند داده صحیح ‚دودویی ... تابع به صورت متد میباشد.روبی ارث بری را با فرستادن پویا و متد های یکتا پشتیبانی میکند(متعلق به‚تعریف شده برای‚یک نمونه تک به جای تعریف شدن در کلاس) همچنین روبی از ارث بری چندگانه پشتیبانی میکند.نحو رویهای پشتیبانی میشود‚اما همهی متد ها که خارج از حوزه یک شی خاص تعریف میشوندهمه آن در حقیقت متد های شی یک کلاس هستند.تا زمانی که این کلاس والد کلاس دیگر استتغییرات برای همه کلاس ها و شی ها ممکن است.روبی به عنوان یک زبان برنامه نویسی چند مدلی تشریح شده.در روبی اجازهی برنامه نویسی رویهای داده شده وشی گرا و تابعی. بر طبق سوالات متداول روبی" اگر تو به پرل علاقمند باشیتو روبی را هم دوست خواهی داشت ومیتوانی از نحو آن استفاده کنی‚اگر اسمالتالک را دوست داری روبی را هم دوست خواهی داشت و میتوانی از معنای آن لذت ببری و اگر طرفدار پیتون هستی تو ممکن است تفاوت عمدهای بین پیتون و روبی پیدا کنی یا که نه.
[ویرایش] امکانات
- شی گرائی
- شش سطح از حوزه دید متغیر شامل: global, class ,instance ,local,class instance,block
- exception handling
- پشتیبانی از iterators و closures (بر اساس تبادل بلوکهای کد)
- پشتیبانی محلی از regular expressions (شبیه پرل) در سطح زبان
- operator overloading
automatic garbage collecting
- قابلیت حمل بالا
- پشتیبانی شراکتی از multi-threading در تمام پلتفرمهای با استفاده از green threads
- کتابخانههای اشتراکی/DLL در اکثر پلتفرمها
- introspection, reflection و meta-programming
- کتابخانه استاندارد بزرگ
- پشتیبانی از dependency injection
- continuations و generators
در حال حاضر روبی فاقد پشتیبانی کامل از یونیکد است ولی UTF-8 بطور نسبی پشتیبانی میشود.
[ویرایش] تعامل
توزیع استاندارد روبی دارای یک مفسر تعاملی خط فرمان بنام irb است که میتواند برای آزمایش سریع کد بکار رود. یک نشست با این برنامه تعاملی بصورت زیر است:
$ irb irb(main):001:0> puts "Hello, World" Hello, World => nil irb(main):002:0> 1+2 => 3
همچنین وجود ماژول readline به کاربر امکان استفاده از shell های مختلف را با پشتیبانی از تاریخچه تغییرات میدهد.
Readline.readline(, true) # param true means ~ "enable history"
[ویرایش] سینتکس
سینتکس روبی بسیار شبیه سینتکس پرل و پایتون است. اعلان کلاسها و متدها توسط کلمات کلیدی انجام میشود. در مقایسه با پرل متغیرها الزاما با یک علامت خاص شروع نمیشوند. (وقتی از چنین علائمی استفاده شود علامت حوزه دید متغیر را تغییر میدهد.) بارزترین تفاوت روبی از سی و پرل آنست که کلمات کلیدی (بجای براکت) برای تعریف بلوکهای کد استفاده میشوند. سطر جدید بهعنوان پایان یک جمله بکار برده میشود در عین حال که برای اینکار میتوان از یک سمی کالون (;) نیز استفاده کرد. تورفتگیها معنی خاصی ندارند (برعکس پایتون). نمونههایی از سینتکس روبی را میتوانید در بخش مثالها ببینید.
[ویرایش] چیزهای غافلگیر کننده
با وجود اینکه طراحی روبی بر اصل عدم غافلگیری استوار است ، بطور طبیعی برخی امکانات آن از زبانهایی مانند سی و پرل متفاوت است:
- نامهایی که با حرف بزرگ شروع میشوند به عنوان ثابت (constant) در نظر گرفته میشوند، بنابراین متغیرهای محلی بایستی با حروف کوچک آغاز شوند.
- به منظور وضوح مقادیر اعشاری (float) ، بایستی با یک صفر بعد از نقطه مشخص شوند (99.0) یا اینکه از یک تبدیل صریح (99.to_f) استفاده شود. تنها اضافه کردن یک نقطه بعد از عدد (.99) کافی نیست زیرا در این حالت اعداد مستعد پذیرش بهعنوان یک متد هستند.
- مقادیر بولین اطلاعات غیر بولین سخت گیرانه هستند: 0 ، “” و [] برابر با true هستند. در سی عبارت 0 : 1 ? 0 برابر با صفر (همان false) است در حالیکه در روبی نتیجه آن 1 است زیرا تمام اعداد برابر true هستند و فقط nil و false برابر false هستند. یک نتیجه فرعی از این عمل آنست که در روبی متدها بر طبق قرارداد -- برای مثال یک جستجوی regular-expression – در صورت موفقیت اعداد، رشته ها، لیستها یا سایر مقادیر غیر false را بر میگردانند، و در صورت شکست nil برمیگردانند. این قرارداد در اسمالتاک هم بکار میرود که تنها اشیا مخصوص true و false میتوانند در عبارات بولین استفاده شوند.
- در نسخههای ماقبل از 1.9 عدم وجود نوع داده کاراکتر (در مقایسه با سی که نوع داده char را برای کاراکترها داراست) ممکن غافلگیر کننده باشد. در هنگام بریدن رشتهها [0]“abc” مقدار 97 را برمیگرداند (یک integer که شماره کد اسکی اولین حرف رشته است.)، برای بدست آوردن “a” باید از [0,1]“abc” (یک زیر رشته بطول 1) یا "abc"[0].chr استفاده کرد.
در ضمن برخی مسائل در مورد خود زبان برجسته است:
- در مورد سرعت، عملکرد روبی در قیاس با بسیاری از زبانهای کامپایل شده پایین تر است (همانند هر زبان تفسیر شده دیگر) و همچنین در قیاس با زبانهای اسکریپت نویسی اصلی مانند پرل و پایتون همین حالت وجود دارد. هرچند که در نسخههای آینده روبی بصورت بایت کد (bytecode) کامپایل خواهد شد و بر روی YARV (خلاصه Yet Another Ruby VM) اجرا خواهد شد. در حال حاضر حافظه بکار رفته در برنامههای نوشته شده در روبی کمتر از حافظه بکار رفته در همان برنامهها که با پرل و پایتون نوشته شده اند، است.
- حذف پارانتزهای متدها در روبی ممکن است به نتایج غیر منتظرهای در متدهایی با چند آرگومان منتج شود. توجه کنید که توسعه دهندگان روبی اشاره کرده اند که حذف پارانتزها در متدهایی با چند آرگومان در آینده ممنوع خواهد شد. در هر صورت حذف پارانتزها در متدهای تک آرگومان توصیه میشود.
[ویرایش] مثالها
مثال کلاسیک Hello world:
puts "Hello World!"
مقداری کد اساسی روبی:
# Everything, including a literal, is an object, so this works:
-199.abs # 199
"ruby is cool".length # 12
"Rick".index("c") # 2
"Nice Day Isn't It?".split(//).uniq.sort.join # " '?DINaceinsty"
[ویرایش] Collections
ایجاد و استفاده از یک آرایه:
a = [1, 'hi', 3.14, 1, 2, [4, 5]] a[2] # 3.14 a.reverse # [[4, 5], 2, 1, 3.14, 'hi', 1] a.flatten.uniq # [1, 'hi', 3.14, 2, 4, 5]
ایجاد و استفاده از یک هش:
hash = {:water => 'wet', :fire => 'hot'}
puts hash[:fire] # Prints: hot
hash.each_pair do |key, value| # Or: hash.each do |key, value|
puts "#{key} is #{value}"
end
# Prints: water is wet
# fire is hot
hash.delete_if {|key, value| key == :water} # Deletes :water => 'wet'
[ویرایش] Blocks and iterators
هر دو سینتکس برای ایجاد یک بلوک کد:
{ puts "Hello, World!" }
do puts "Hello, World!" end
ارسال پارامتر به یک بلاک تا یک closure شود:
# In an object instance variable, remember a block.
def remember(&b)
@block = b
end
# Invoke the above method, giving it a block that takes a name.
remember {|name| puts "Hello, #{name}!"}
# When the time is right (for the object) -- call the closure!
@block.call("John")
# Prints "Hello, John!"
بازگشت closure از یک متد:
def foo(initial_value=0)
var = initial_value
return Proc.new {|x| var = x}, Proc.new { var }
end
setter, getter = foo
setter.call(21)
getter.call # => 21
دادن جریان کنترل یک برنامه به یک بلوک که در هنگام فراخوانی ایجاد شده:
def a
yield "hello"
end
# Invoke the above method, passing it a block.
a {|s| puts s} # Prints: 'hello'
# Perhaps the following needs cleaning up.
# Breadth-first search
def bfs(e) # 'e' should be a block.
q = [] # Make an array.
e.mark # 'mark' is a user-defined method. (??)
yield e # Yield to the block.
q.push e # Add the block to the array.
while not q.empty? # This could be made much more Ruby-like.
u = q.shift
u.edge_iterator do |v|
if not v.marked? # 'marked?' is a user-defined method.
v.mark
yield v
q.push v
end
end
end
end
bfs(e) {|v| puts v}
ایجاد حلقه بر روی آرایهها و enumoration ها با استفاده از بلوکها:
a = [1, 'hi', 3.14]
a.each {|item| puts item} # Prints each element
(3..6).each {|num| puts num} # Prints the numbers 3 through 6
[1,3,5].inject(0) {|sum, element| sum + element} # Prints 9 (you can pass both a parameter and a block)
بلوکها با بسیاری از متدهای داخلی روبی کار میکنند:
File.open('file.txt', 'w+b') do |file|
file.puts 'Wrote some text.'
end # File is automatically closed here
یا:
File.readlines('file.txt').each do |line|
# Process each line, here.
end
استفاده از یک enumoration و یک بلوک برای جذر گرفتن اعداد 1 تا 10:
(1..10).collect {|x| x*x} => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[ویرایش] کلاسها
کد زیر یک کلاس بنام Person را تعریف میکند.
class Person
def initialize(name, age)
@name, @age = name, age
end
def <=>(person)
@age <=> person.age
end
def to_s
"#{@name} (#{@age})"
end
attr_reader :name, :age
end
group = [ Person.new("John", 20),
Person.new("Markus", 63),
Person.new("Ash", 16)
]
puts group.sort.reverse
کد بالا سه نام را بر حسب سن از زیاد به کم چاپ میکند:
Markus (63) John (20) Ash (16)
[ویرایش] استثناها
یک استثنا (exception) توسط اعلان raise ایجاد میشود:
raise
یک پیام اختیاری میتواند به استثنا اضافه شود:
raise "This is a message"
شما همچنین میتوانید تعیین کنید که چه نوعی از استثنا را میخواهید ایجاد کنید:
raise ArgumentError, "Illegal arguments!"
استثناها توسط rescue کنترل میشوند. این عنوان میتواند استثناهایی را که از StandardError مشتق میشوند بگیرد:
begin # Do something rescue # Handle exception end
توجه داشته باشید که تلاش برای گرفتن تمام استثناها توسط یک rescue یک اشتباه معمول است و برای گرفتن تمام استثناها باید بصورت زیر عمل کرد:
begin # Do something rescue Exception # Handle exception end
یا یک استثنای بخصوص:
begin # ... rescue RuntimeError # handling end
و نهایتا امکان آن وجود دارد که تعیین کرد شی استثنا برای عنوان کنترل کننده مهیا شود:
begin # ... rescue RuntimeError => e # handling, possibly involving e end
همچنین آخرین استثنا در یک متغیر جهانی بصورت !$ ذخیره میشود.
[ویرایش] پیاده سازیها
روبی دو پیاده سازی اصلی دارید: مفسر رسمی روبی که بیشتر مورد استفاده قرار میگیرد، و JRuby که یک پیاده سازی بر اساس جاوا است.
[ویرایش] سیستم عاملها
روبی برای سیستم عاملهای زیر ارائه میشود:
- بیشتر انواع یونیکس
- لینوکس
- داس (رایانه)
- ویندوز مایکروسافت Vista/2003/2000/NT/XP/98/95
- مکینتاش OSX
- BeOS
- Amiga
- MorphOS
- Acron RISC OS
- OS/2
- Syllable
پیاده سازیهای دیگر نیز ممکن است وجود داشته باشد.
[ویرایش] اجازه نامه
مفسر روبی و کتابخانههای آن تحت مجوز دوگانه آزاد و باز متن GPL و اجازه نامه روبی منتشر شده است.
[ویرایش] منابع و کتابخانهها
آرشیو برنامههای روبی (RAA) و همچنین RubyForge منابعی برای انواع مختلف برنامهها و کتابخانههای نوشته شده با روبی هستند که حاوی بیش از دو هزار آیتم هستند. با اینکه تعداد برنامههای موجود قابل قیاس با تعداد برنامههای موجود در پرل و پایتون نیست، ولی طیف وسیعی از ابزارهای مختلف برای توسعه سریع روبی موجود است. RubyGems برنامه استاندارد مدیریت بستهها برای کتابخانههای روبی است و بسیار شبیه به CPAN در پرل است، همچنین نحوه استفاده از آن بیشتر شبیه ابزار apt-get در لینوکس دبیان است.
[ویرایش] پانوشتها
- The Ruby Programming Language by Yukihiro Matsumoto on 2000-06-12 (informit.com)
- The Philosophy of Ruby, A Conversation with Yukihiro Matsumoto, Part I by Bill Venners on 2003-09-29 (Artima Developer)
- How Does Ruby Compare With Python (rubygarden.org)
- The Computer Language Shootout Benchmarks
- Ruby License (ruby-lang.org)
[ویرایش] پیوند به بیرون
[ویرایش] منبع
|
|||||||||||