روبی (زبان برنامه‌نویسی)

از ویکی‌پدیا، دانشنامهٔ آزاد
(تغییرمسیر از روبی)
پرش به: ناوبری, جستجو
برای دیگر کاربردها روبی (ابهام‌زدایی) را ببینید.

روبی (به انگلیسی: Ruby) یک زبان برنامه‌نویسی انعطافپذیر، پویا و شی‌گرا است. روبی ویژگی‌های نگارشی پرل و شی‌گرایی اسمال‌تاک را با هم در خود دارد. زبان روبی در سال‌های میانی دهه ۱۹۹۰ توسط یوکیهیرو ماتسوموتو در ژاپن اختراع شد. ویژگی‌های گوناگون زبان‌های پرل، لیسپ، اسمال‌تاک و آیفل الهام‌بخش ماتسوموتو در ساخت روبی بودند.

زبان روبی پارادایم‌های گوناگون برنامه‌نویسی از جمله برنامه‌نویسی تابعی، شیء گرا و بازتابی را پشتیبانی می‌کند، دارای گزاره‌ها و متغیرهای پویا و مدیریت حافظه خودکار است.

نسخه فعلی این زبان Ruby 1.9.1 است که به زبان سی و بصورت زبانی با مفسر تک‌گذره پیاده‌سازی شده است.[۱] تا سال ۲۰۱۰، گونه‌های مختلفی از زبان روبی توسعه یافته‌اند که از میان آنها می‌توان به جی‌روبی، روبینوس، مک‌روبی، آیرن‌روبی و هات‌روبی اشاره کرد.

محتویات

[ویرایش] تاریخچه

زبان روبی رسما در روز ۲۴ فوریه ۱۹۹۳ (۵ اسفند ۱۳۷۱) توسط یوکیهیرو ماتسوموتو معرفی شد. او دنبال ساخت زبانی بود که امکانات متعادلی برای برنامه‌نویسی تابعی و برنامه‌نویسی دستوری برای برنامه‌نویس فراهم آورد. ماتسوموتو درباره انگیزه‌اش برای ساخت روبی می‌گوید: «در جستجوی زبانی بودم که از پایتون شیء‌گراتر و از پرل قدرتمندتر باشد. برای همین تصمیم گرفتم خودم آن را بسازم».

[ویرایش] نام «روبی»

یوکیهیرو ماتسوموتو و همکارش دو نام «روبی» و «کورال» را برای این زبان جدید برگزیده بودند. از آنجاییکه نام کورال پیش از آن برای یکی از زبان‌های برنامه‌نویسی بریتانیایی انتخاب شده بود، نام «روبی» به عنوان نام نهایی برگزیده شد. ماتسوموتو گفته که یکی از دلایل انتخاب نام «روبی» این بود که یاقوت (به انگلیسی: Ruby) نشان ماه تولد یکی از همکاران وی بوده است.

[ویرایش] اولین انتشار

نخستین ویرایش روبی با عنوان روبی 0.95 در ۲۱ دسامبر ۱۹۹۵ (میلادی) (۳۰ آذر ۱۳۷۴) روی یکی از شبکه‌های تخصصی اینترنتی در ژاپن منتشر شد. پس از آن، سه ویرایش دیگر رویی در ظرف دو روز انتشار یافتند. در همین دوره نخستین لیست پست الکترونیک برای روبی در ژاپن براه افتاد.

[ویرایش] روبی ۱.۰

نخستین نسخه اصلی روبی با عنوان روبی 1.0 در ۲۵ دسامبر ۱۹۹۶ (۵ دی ۱۳۷۵) منتشر شد. پس از انتشار روبی 1.3 در سال ۱۹۹۹، نخستین لیست پست الکترونیک به زبان انگلیسی آغاز بکار کرد. در سپتامبر سال ۲۰۰۰ نخستین کتاب راهنمای برنامه‌نویسی به زبان روبی به انگلیسی به چاپ رسید که به افزایش محبوبیت این زبان در کشورهای مختلف کمک کرد.

[ویرایش] روبی آن ریلز

در سال ۲۰۰۵ با معرفی چارچوب جدیدی برای برنامه‌نویسی وب موسوم به روبی آن ریلز، محبوبیت زبان روبی به مراتب افزایش پیدا کرد. نام‌های «روبی» و «روبی آن ریلز» آنقدر با هم استفاده شده‌اند که برای بسیاری شاید تفاوت این دو روشن نباشد.

[ویرایش] روبی ۱.۹.۱

جدیدترین نسخه پایدار روبی، نسخهٔ ۱.۹.۱ است که نسبت به نسخهٔ پیشین (۱.۸.۶) چند تغییر عمده در خود دارد. از جمله تغییرات مهم می‌توان به افزودن متغیرهای محلی در «بلوک»های روبی، و امکان تنظیم کدگذاری رشته‌ها بصورت مستقل از هم اشاره کرد.

[ویرایش] فلسفه

سازنده زبان روبی یوکیهیرو ماتز ماتسوموتو می‌گوید روبی برای سازندگی بهتر برنامه نویس طراحی شده است که هدف User interface را به خوبی دنبال می‌کند.او نگران است که طراحی سیستم‌ها به جای کامپیوتر نیاز به توجه بر انسان‌ها داشته باشد.معمولا مردم‚مخصوصا مهندسان کامپیوتر بر روی ماشین تمرکز کند.آن‌ها فکر می‌کنند"با انجام این کار ماشین‌ها سریعتر می‌شوند‚ماشین‌ها در اجرا موثر تر می‌باشندو.... آن‌ها بر ماشین تمرکز می‌کنند‚اما در حقیقت ما نیاز داریم که به انسان‌ها توجه کنیم‚اینکه چگونه آنها به برنامه نویسی توجه دارندویا چگونه به اجرای برنامه‌های ماشین دقت می‌کنند. روبی برای تعقیب هدف کمترین قافلگیری بیان شدبه این معنی که زبان باید طوری رفتار کند که کمترین گیج کنندگی را برای استفاده کننده‌های ا تجربه داشته باشد.ماتسوموتو همچنین اظهار می‌دارد که هدف اولین طراحی او درست کردن زبانی که خودش از آن لذت ببرد این کار با کم کردن کار برنامه نویس و ابهامات منطقی می‌باشد.اما کمترین غافلگیری هنوز خیلی به بیان زبان برنامه نویسی روبی نزدیک است. افراد ناشی شاید این را به این معنا تعبیر کنند که رفتارهای روبی سعی در متصل کردن اشتراکات رفتارهای دیگر زبان‌ها را دارد. در بحث ماه می ۲۰۰۵ در روزنامه "کامپ.لنگ.روبی " ماکسوموتو تلاش کرد که روبی را از مینیمم غافلگیری دور کند.توضیح اینکه هر شانس طراحی بعضی‌ها را متعجب می‌کند. او از استاندارد خود برای ارزیابی غافلگیری استفاده کرد.ماتسوموتو این را در یک گزارش مطرح ساخت. "همه یک پیشینه شخصی دارند‚بعضی‌ها از جانب پیتون می‌آیند بعضی‌های دیگه از پرل و آن‌ها ممکن است از بعضی از جنبه‌های متفاوت زبان غافلگیر شوند.سپس آن‌ها به من می‌گویند ما از بعضی از جنبه‌های زبان غافلگیر شدیم‚بنابرین روبی قانون کمترین غافلگیری را زیر پا گذاشته است.صبر کنید..... هدف کمترین غافلگیری فقط برای شما نیست.این هدف به معنای کمترین غافلگیری ممکن برای بیان من می‌باشد.این به معنای کمترین غافلگیری بعد از آموزش کامل زبان است. برای مثال من قبل از اینکه روبی را طراحی کنم یک برنامه نویس سی++ بودم. من منحصرا دو، سه سال در سی++ برنامه نوشتم. و بعد از دو سال برنامه‌نویسی با آن ‚هنوز مرا متعجب می‌کرد.

[ویرایش] معنی‌شناسی

روبی شی گراست: همه انواع داده شی هستند‚از جمله کلاس‌ها و خیلی از انواع داده‌ای که به طور معمول در بقیه زبان‌ها نیز هست مانند داده صحیح ‚دودویی ... تابع به صورت متد می‌باشد.روبی ارث بری را با فرستادن پویا و متدهای یکتا پشتیبانی می‌کند(متعلق به‚تعریف شده برای‚یک نمونه تک به جای تعریف شدن در کلاس) همچنین روبی از ارث بری چندگانه پشتیبانی می‌کند.نحو رویه‌ای پشتیبانی می‌شود‚اما همهی متدها که خارج از حوزه یک شی خاص تعریف می‌شوندهمه آن در حقیقت متدهای شی یک کلاس هستند.تا زمانی که این کلاس والد کلاس دیگر استتغییرات برای همه کلاس‌ها و شی‌ها ممکن است.روبی به عنوان یک زبان برنامه نویسی چند مدلی تشریح شده.در روبی اجازهی برنامه نویسی رویه‌ای داده شده وشی گرا و تابعی. بر طبق سوالات متداول روبی" اگر تو به پرل علاقمند باشیتو روبی را هم دوست خواهی داشت ومی‌توانی از نحو آن استفاده کنی‚اگر اسمالتالک را دوست داری روبی را هم دوست خواهی داشت و می‌توانی از معنای آن لذت ببری و اگر طرفدار پیتون هستی تو ممکن است تفاوت عمده‌ای بین پیتون و روبی پیدا کنی یا که نه.

[ویرایش] امکانات

  • کاملا شی گرا
  • داینامیک
  • نحو کوتاه و انعطاف پذیر
  • چهار سطح از حوزه دید متغیر شامل: global, class ,instance ,local
  • exception handling
  • پشتیبانی از iterators و closures (بر اساس تبادل بلوکهای کد)
  • پشتیبانی محلی از regular expressions (شبیه پرل) در سطح زبان
  • operator overloading
  • جمع آوری زباله خودکار
  • قابلیت حمل بالا
  • در همه سیستم‌عامل اصلی پیاده سازی
  • پردازش استثنا
  • سربار اپراتور
  • پشتیبانی شراکتی از multi-threading در تمام پلتفرمهای با استفاده از green threads
  • پشتیبانی کامل از یونیکد و رمزنگاریهای شخصیت چند گانه (از نسخه 1.9)
  • کتابخانه‌های اشتراکی/DLL در اکثر پلتفرمها
  • introspection, reflection و meta-programming
  • اتصال بومی APIها در C
  • پوسته تعاملی روبی (REPL)
  • بسته مدیریت متمرکز از طریق RubyGems
  • کتابخانه استاندارد بزرگ
  • پشتیبانی از dependency injection
  • continuations و generators


[ویرایش] تعامل

توزیع استاندارد روبی دارای یک مفسر تعاملی خط فرمان بنام 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 که یک پیاده‌سازی براساس جاوا است.

[ویرایش] سیستم‌عامل‌ها

روبی برای سیستم‌عامل‌های زیر ارائه می‌شود:

پیاده سازی‌های دیگر نیز ممکن است وجود داشته باشد.

[ویرایش] اجازه‌نامه

مفسر روبی و کتابخانه‌های آن تحت مجوز دوگانه آزاد و باز متن GPL و اجازه‌نامه روبی منتشر شده است.


[ویرایش] منابع و کتابخانه‌ها

آرشیو برنامه‌های روبی (RAA) و همچنین RubyForge منابعی برای انواع مختلف برنامه‌ها و کتابخانه‌های نوشته شده با روبی هستند که حاوی بیش از دو هزار آیتم هستند. با اینکه تعداد برنامه‌های موجود قابل قیاس با تعداد برنامه‌های موجود در پرل و پایتون نیست، ولی طیف وسیعی از ابزارهای مختلف برای توسعه سریع روبی موجود است. RubyGems برنامه استاندارد مدیریت بسته‌ها برای کتابخانه‌های روبی است و بسیار شبیه به CPAN در پرل است، همچنین نحوه استفاده از آن بیشتر شبیه ابزار [apt-get] در لینوکس دبیان است.

[ویرایش] جستارهای وابسته

[ویرایش] منابع

  1. «Download Ruby»(انگلیسی)‎. وبگاه رسمی زبان روبی. 

[ویرایش] پیوند به بیرون

ابزارهای شخصی
گویش‌ها
فضاهای نام
عملکردها
گشتن
چاپ/برون‌بری
جعبه‌ابزار
زبان‌های دیگر