Ruby

بهترین دوست یک برنامه نویس

Ruby

بهترین دوست یک برنامه نویس

درباره روبی

از خودتان می پرسید که چرا روبی این قدر محبوب است؟ طرفدار هایش می گویند که روبی یک زبان زیبا و هنرمندانه است. و در عین حال می گویند که بدرد بخور و کاربردی است. چرا؟

آرمان های خالق روبی

روبی یک زبان با تعادل دقیقی می باشد. خالقش، یوکیهیرو ماتسوموتو ملقب به ماتز (Yukihiro “Matz” Matsumoto)، قسمت های زبان های مورد علاقه اش را (Perl, Smalltalk, Eiffel, and Lisp) با هم ترکیب کرد، تا زبان جدیدی را خلق کند که تعادلی بین برنامه نویسی تابعی (functional) و برنامه نویسی رویه ای (imperative) برقرار می کند.

او به طور معموع گفته است که "تلاش می کنم روبی را طبیعی کنم، نه ساده"، طوری که تصویری از زندگی باشد.

بر اساس این، او اضافه می کند:

روبی به ظاهر ساده است، ولی درونش پیچیده است، دقیقا مانند بدن انسان. (1)

درباره رشد روبی

از زمان توزیع عمومی اش در سال 1995، روبی کدر (coder) های متعهد را به خود جذب کرده است. سال 2006، روبی به پذیرش عمومی دست یافت. با یوزر گروپ های فعال که در شهرهای بزرگ جهان شکل گرفته اند و کنفرانس های روبی که تا آخر ظرفیت پر می شوند.


Ruby-Talk، لیست مکاتبه ای اصلی برای بحث درمورد زبان روبی، به میانگین 200 پیغام در روز، در سال 2006 رسید. در سال های اخیر، که اندازه انجمن باعث شد که بحث ها از یک لیست مرکزی به چند تا گروه کوچکتر منتقل شود، این تعداد کاهش پیدا کرده است.

TIOBE index، که رشد زبان های برنامه نویسی را اندازه می گیرد، روبی را به عنوان نهمین در بین زبان های برنامه نویسی در جهان رتبه بندی کرده است. بیشتر رشد به محبوبیت نرم افزار های نوشته شده با روبی، به ویژه فریم ورک طراحی وب Ruby on Rails، بستگی دارد. (2)

همچنین روبی کاملا رایگان است. نه تنها پولی پرداخت نمی کنید، بلکه برای استفاده، اصلاح و توزیع کاملا آزاده است. (خلاصه اینکه "منبع آزاد" است.بهتر است درباره قوانین open source تحقیقی انجام بدهید.)

همه چیز را به عنوان آبجکت (object یعنی شئ) دیدن

در ابتدا، ماتز (Matz) به دیگر زبان ها نگاه می کرد که سینتکس ایده آلی را پیدا کند. با بیادآوردن تحقیقش، او گفت، "من می خواستم یک زبان اسکرپتی (scripting) که قوی تر از Perl و شئ گراتر از Python باشد.(3)"

در روبی، همه چیز یک آبجیت است. تمام تکه های اطلاعات و کد را می توان خاصیت ها (property) و فعالیت های (action) مربوط به خودش را، داد. برنامه نویسی شئ گرا، خاصیت ها را با نام instance variable و فعالیت ها را با نام method صدا می کند. روش خالص شئ گرای روبی، عموما با تکه کدی، که فعالیت را به یک عدد مربوط داده می کند، نشان داده می شود.

در بیشتر زبان ها اعداد و سایر انواع داده ای اولیه، عدد نیستند. روبی از زبان Smalltalk تأثیر می گیرد، که به همه ی انواع داده ای اولیه، method  و instance variable نسبت می دهد. این، استفاده از روبی را آسان می کند، زیرا قوانینی که به آبجکت ها نسبت داده می شود، به کل روبی نسبت داده می شود.

انعطلاف پذیری روبی

روبی یک زبان انعطاف پذیر تلقی می شود، زیرا به استفاده کننده اجازه می دهد که آزادانه، قسمت های مختلفش را تغییر دهند. قسمت های مهم روبی را می توان، بصورت دلخواه، حذف یا دوباره تعریف کرد. می توان روبی قسمت های موجود، بر روی قسمت های موجود، می توان قسمت جدیدی اضافه کرد. روبی سعی می کند که کدنویس را محدود نکند.

برای مثال، عمل جمع با اپراتور + انجام می شود. اما اگر بخواهید از کلمه plus استفاده کنید، می توانید این متود را به کلاس از پیش ساخته شده Numeric، اضافه کرد.

اپراتور های روبی، syntactic sugar برای متودها هستند. شما می توانید آن ها را هم دوباره تعریف کنید.

بلاک ها: یک ویژگی واقعا رسا

بلاک های روبی، همچنین یکی از منبع های انعطاف پذیری اش تلقی می شوند. یک برنامه نویس، می تواند یک بستار (closure) را به هر متود متصل کند، که توصیف می کند آن متود باید چطور کار کند. Closure، که بلاک (block) نامیده می شود، و یکی از محبوب ترین ویژگی ها، برای تازه وارد ها به روبی از زبان های رویه ای مانند PHP و Visual Basic، است.

بلاک ها از زبان های تابعی (functional) الهام گرفته شده اند. ماتز گفته است، "در کلوژر(closure) های روبی، می خواستم به سنت Lisp احترام بگذارم.(4)"

در کد بالا، بلاک در ساختار do … end توصیف شده است. متود map، بلاک را به لیست در اختیار گذاشته شده، اعمال می کند. خیلی دیگر از متود در روبی، این اختیار را به کدر (coder) می دهند که بلاک خودشان را برای پر کردن جزئیات اجرا، بنویسند.


روبی و ترکیب(Mixin)

برخلاف خیلی از زبان های شئ گرا، روبی عمدا فقط از ارث بری تکی، پشتیبانی می کند. اما روبی مفهوم ماژول ها را درک می کند (در زبان Objectic-C به نام دسته ها (Categories) شناخته می شوند). ماژول ها، مجموعه های متود ها هستند.

کلاس ها می توانند با یک ماژول ترکیب شوند و تمام متودهایش را دریافت کنند. برای مثال، هر کلاسی که متود each را پیاده سازی می کند، می تواند با ماژول Enumerable ترکیب شود، که چندین متود که از each برای حلقه درست کردن استفاده می کنند را، اضافه می کند.


 به طور کلی، روبی نویس ها (Rubyists) این روش را، راهی واضح تر برای وراثت چندتایی می دانند، که پیچیده تر است و می تواند خیلی محدود کننده باشد.

نمود بصری روبی

با اینکه روبی از نماد گذاری محدودی استفاده می کند و معمولا از کلامات کلیدی انگلیسی استفاده می کند، کمی نماد گذاری برای پیراستن روبی استفاده شده است.

از قرارداد ساده ای برای مشخص کردن برد متغییر ها استفاده می کند.

·         var می تواند یک تغییر محلی باشد.

·         @var می تواند یک متغییر نمونه (instance variable) باشد.

·         $var می تواند یک تغییر جهانی باشد.

این علائم رمزی، خوانایی برنامه را، با دادن امکان تشخیص نقش هر متغییر به برنامه نویس، بالا می برند. این همچنین استاده از دستور خسته کننده self.، که به هر مغییر نمونه اضافه می شود، را غیر ضروری می کند.

 

فراتر از مبانی

روبی گنجینه ای از دیگر ویژگی ها را دارست، از بینشان به موارد هستند:

§         روبی ویژگی های مدیریت استثنا، مثل جاوا و پایتون، برای آسان کردن کنترل ارور ها، داراست.

§         روبی یک ویژگی "زباله روبی علامت گذاری و تمیز کردن" (mark-and-sweep)  را برای همه ی کلاس ها در اختیار می گذارد. نیازی به شمردن ارجاع ها در کتابخانه های بسطی نیست. همانطور که ماتز (Matz) می گوید، "این برای سلامتی شما بهتر است."

§         نوشتن بسط ها برای روبی، با یک API زیبا برای صدا کردن روبی از C، آسان تر از Python و Perl است. این، تعبیه روبی در نرم افزار (به عنوان یک زبان متی) را نیز شامل می شود. برای این کار یک رابط SWIG نیز وجود دارد.

§         اگر سیستم عامل اجازه بدهد، بسط کتابخانه ای را می توان به صورت پویا بارگذاری کرد.

§         روبی ویژگی ریسمان کشی مستقل (independent threading) سیستم عامل را داراست. برای همین، برای همه پلتفرم هایی که، روبی در آنها اجرا می شود، ویژگی چند ریسمانی (multithreading) را دارید، صرفنظر از اینکه سیستم عامل آن را پشتیبانی می کند یا نه، حتی MS-DOS!

§         روبی بسیار قابل جابجایی است: بیشتر بر روی لینوکس توسعه یافته است، ولی روی خیلی از انواع Unix، Mac OS X، ورژن های مختلف Windows، DOS، BeOS، OS/2 و غیره کار می کند.

دیگر پیاده سازی های روبی

روبی، به عنوان یک زبان، پیاده سازی های کمی دارد. این راهنما درباره پیاده سازی مرجع روبی MRI (Matz’s Ruby Interpreter) بحث می کند، اما پیاده سازی دیگری هم وجود دارد. آن ها اغلب در بعضی موارد به درد بخور هستند. یکپارچه سازی های اضافی با دیگر زبان ها و محیط ها در اختیار می گذارند، یا ویژگی های خاصی در اختیار می گذارند که MRI ندارد.

§         JRuby روبی است که بر روی JVM کار می کند، و از همه ویژگی هایش بهره می برد.

§         Rubinius «روبی نوشته شده با روبی» است. ساخته شده بر روی LLVM، Rubinius از یک ماشین مجازی جذابی استفاده می کند که بقیه زبان ها هم دارند بر روی آن ساخته می شوند.

§         MacRuby روبی است که به طور محکمی با کتابخانه Cocoa شرکت اپل، یکپارچه سازی شده است، که به شما اجازه طرای آسان اپلیکیشن های دسکتاپ را می دهد.

§         mruby یک پیاده سازی سبک زبان روبی است که می تواند درون یک اپلیکیشن لینک یا تعبیه شود. توسعه اش توسط خالق روبی یوکیهیرو ماتسوموتو، ملقب به ماتز، رهبری می شود.

§         IronRuby پیاده سازی است که به صورت مستحکم با .Net frameworks یکپارچه سازی شده است.

§         MagLev یک پیاده سازی سریع و با ثبات روبی، یکپارچه شده با پایگاه داده شی گرا و کش توزیع شده اشتراکی، می باشد.   

§         Cardinal یک مترجم (compiler) روبی برای ماشین مجازی Parrot (Perl 6) است.

بعضی از این پیاده سازی ها، از جمله MRI، راهنمایی های RubySpec را دنبال می کنند. یک «مشخصات کامل قابل اجرا برای زبان برنامه نویسی روبی» می باشد.

منابع

1 Matz, speaking on the Ruby-Talk mailing list, May 12th, 2000.

2 See the Ruby on Rails home page for more.

3 Matz, in An Interview with the Creator of Ruby, Nov. 29th, 2001.

4 Matz, in Blocks and Closures in Ruby, December 22nd, 2003.