روبي كوكوا
RubyCocoa هو إطار عمل لنظام macOS يوفر جسرًا بين لغتي البرمجة Ruby و Objective-C ، مما يسمح للمستخدم بالتعامل مع كائنات Objective-C من Ruby، والعكس صحيح. يُمكّن هذا الإطار من كتابة تطبيقات Cocoa بالكامل بلغة Ruby، بالإضافة إلى كتابة تطبيقات تجمع بين Ruby وObjective-C. [ 1 ] في عام 2008، كان مشروع MacRuby التابع لشركة Apple قيد التطوير ليحل محل RubyCocoa. [ 2 ] وفي عام 2012، تم إصدار نسخة مشتقة منه تحمل اسم RubyMotion ، وهي متاحة لأنظمة iOS وmacOS وAndroid. [ 3 ]
تُستخدم RubyCocoa لاستكشاف ميزات كائن Cocoa بشكل تفاعلي باستخدام irb ، ولإنشاء نماذج أولية لتطبيق Cocoa، وكتابة تطبيق Cocoa يجمع بين ميزات Ruby وObjective-C، وتغليف واجهة المستخدم الرسومية الأصلية لنظام macOS لبرنامج نصي مكتوب بلغة Ruby. [ 4 ]
RubyCocoa هو برنامج مجاني ، تم إصداره بموجب كل من رخصة Ruby ورخصة LGPL . [ 1 ]
تاريخ
بدأ مشروع RubyCocoa عام ٢٠٠١ على يد هيساكوني فوجيموتو عندما قام بتطوير وحدة امتداد للغة Ruby لتغليف دالتي NSObject وNSClassFromString. لاحقًا، تم دمجها مع Project Builder (الذي أصبح فيما بعد Xcode ). في عام ٢٠٠٢، تم تسجيل المشروع على منصة SourceForge وبدأ فريق التطوير بالتوسع.
في عام 2006، انضم إلى قائمة المساهمين مطور من شركة آبل ، لوران سانسونيتي، ثم قُدِّم عرضٌ تقديميٌّ عن RubyCocoa خلال مؤتمر WWDC . وأعلنت آبل أن RubyCocoa ستُضمَّن وتُدعم في نظام التشغيل Mac OS X v10.5 "Leopard".
في أغسطس 2008، أكد سانسونيتي أن ماك روبي "من المفترض أن تحل محل روبي كوكوا" في المستقبل. [ 5 ]
الوظائف
يُفسَّر RubyCocoa أحيانًا على أنه مجموعة من الروابط لأطر عمل Cocoa، وهذا غير صحيح. RubyCocoa هو جسر حقيقي بين لغتي البرمجة Objective-C وRuby.
استيراد الفئات الكسولة
سيقوم RubyCocoa باستيراد فئات Objective-C إلى بيئة Ruby عند الحاجة. على سبيل المثال، عند الوصول إلى فئة معينة OSX::NSTableViewلأول مرة في التعليمات البرمجية، سيسترجع RubyCocoa جميع المعلومات اللازمة المتعلقة بهذه الفئة من بيئة تشغيل Objective-C، وسينشئ فئة Ruby بنفس الاسم تعمل كوكيل. كما سيستورد بنفس الطريقة جميع الفئات الموروثة.
إعادة توجيه الرسائل
في كل مرة يرسل فيها المستخدم رسالة Ruby إلى كائن وكيل، سيحاول RubyCocoa إعادة توجيهها إلى مثيل Objective-C المضمن، عن طريق ترجمة اسم الرسالة إلى محدد Objective-C وطلب إعادة توجيهها من وقت تشغيل Objective-C.
إذا تم طرح استثناء من عالم Objective-C، فسيقوم RubyCocoa بتحويله إلى استثناء Ruby وإعادة توجيهه إليك.
يستخدم RubyCocoa مكتبة libffi لاستدعاء تطبيقات أساليب Objective-C.
تجاوز الطريقة التلقائية
يجعل RubyCocoa من السهل تجاوز طريقة Objective-C من Ruby، سواء في فئة فرعية أو مباشرة إلى الفئة (كما تفعل في Objective-C باستخدام فئة).
بمجرد إدراج طريقتك، سيقوم RubyCocoa باسترداد توقيع طريقة Objective-C الحالية وحقن طريقة جديدة في وقت تشغيل Objective-C، بنفس التوقيع، ولكنها تشير الآن إلى التعليمات البرمجية الخاصة بك.
لتحقيق ذلك، يستخدم RubyCocoa مكتبة libffi لإنشاء إغلاق ديناميكي يستدعي طريقة Ruby، ويقوم فقط بتمرير مؤشر إلى هذا الإغلاق الجديد إلى وقت تشغيل Objective-C.
الوصول إلى بتات C
بفضل طبيعة لغة Objective-C، يمكنك استخدام لغة C بحرية من خلال كود Objective-C. ولربط أجزاء C ذات الصلة بإطار عمل Objective-C، مثل هياكل C، والدوال، والتعدادات، والثوابت، وغيرها، يعتمد RubyCocoa على مشروع BridgeSupport .
سيقوم RubyCocoa بتفسير ملفات BridgeSupport أثناء التشغيل (باستخدام xmlTextReader من مكتبة libXML 2) ومعالجة محتواها وفقًا لذلك. على سبيل المثال، سيقوم بإنشاء فئات Ruby الوسيطة لهياكل C، بالإضافة إلى إنشاء الدوال.
لاحظ أن العمليات المكلفة، مثل ترجمة الرموز، تتم عند الطلب، ومن الواضح أنها تتم مرة واحدة فقط.
سلاسل التنسيق
يستطيع RubyCocoa اكتشاف واجهات برمجة التطبيقات التي تستخدم سلاسل التنسيق، مثل NSLog أو NSString.stringWithFormat، وتحويل الوسائط المتغيرة بشكل مناسب إلى الأنواع المحددة في سلسلة التنسيق.
مؤشرات الدوال
تتيح لك RubyCocoa تمرير Procكائنات Ruby كوسائط مؤشر دالة. ثم تستخدم مكتبة libffi لإنشاء إغلاق ديناميكي وتمريره إلى الدالة/الطريقة الأساسية.
إنشاء تطبيقات Cocoa مكتوبة بلغة Ruby
يؤدي تثبيت RubyCocoa أيضًا إلى تثبيت قوالب Xcode المقابلة تلقائيًا . وهذا يسمح للمطورين باختيار "تطبيق Cocoa-Ruby" كنوع مشروع Xcode، وسيقوم Xcode بإنشاء جميع الملفات اللازمة لذلك.
كيفية استدعاء دوال Objective-C من Ruby
لاستدعاء دالة في لغة Objective-C، استبدل كل نقطتين رأسيتين في اسم الدالة، باستثناء الأخيرة، بشرطة سفلية. على سبيل المثال، initWithContentRect:styleMask:backing:defer:تصبح دالة NSWindow في الكائن NSWindow كالتالي initWithContentRect_styleMask_backing_defer: .
جميع فئات ووظائف Cocoa تنتمي إلى OSXوحدة نمطية، على سبيل المثال، كود Objective-C:
[[ NSWindow alloc ] initWithContentRect : frame styleMask : NSTitledWindowMask backing : NSBackingStoreBuffered defer : NO ]سيصبح:
OSX :: NSWindow.alloc.initWithContentRect_styleMask_backing_defer ( frame , OSX :: NSTitledWindowMask , OSX :: NSBackingStoreBuffered , false )كما تلاحظ، يُقلل هذا من سهولة قراءة الكود بجعل تسمية المعاملات في Objective-C غير مجدية. لذا، توجد طريقة أخرى ملائمة لكتابة استدعاءات الدوال، objc_sendوهي الدالة التي تقبل رموز Ruby كأسماء للمعاملات. على سبيل المثال، يمكن كتابة الكود السابق أيضًا على النحو التالي:
OSX :: NSWindow . alloc . objc_send ( :initWithContentRect , frame , :styleMask , OSX :: NSTitledWindowMask , :backing , OSX :: NSBackingStoreBuffered , :defer , false )مزايا روبي كوكوا
- بما أن لغة روبي هي لغة تفسيرية، فلا حاجة لإعادة تجميع التطبيق بشكل متكرر أثناء التطوير.
- بعض الميزات الغنية للغة روبي، مثل دعم التعبيرات النمطية المدمجة ، تجعل كتابة الكود أسرع، كما تجعل RubyCocoa أداة مثالية لإنشاء النماذج الأولية.
العيوب
- بغض النظر عن سرعة مترجم Ruby، ستكون تطبيقات RubyCocoa دائمًا أبطأ من تطبيقات Objective-C/Cocoa بسبب العبء الإضافي لتحويل الكائنات.
- لأن لغة روبي ليست آمنة للاستخدام المتزامن، فليس من الممكن إرسال عدة خيوط أصلية لتنفيذ كود روبي كوكوا. ومع ذلك، يمكن استخدام الخيوط المحاكاة في روبي.
مراجع
- 1 2 "ملف: RubyCocoa - جسر Ruby/Objective-C — توثيق RubyCocoa" . rubycocoa.github.io . تم الاطلاع عليه بتاريخ 18-12-2024 .
- ↑ "منتديات براغماتيك | هل يُغيّر ماك روبي قواعد اللعبة؟" . 2010-04-02. مؤرشف من الأصل في 2 أبريل 2010. تم الاطلاع عليه بتاريخ 2024-12-18 .
- ↑ "نبذة عن روبي موشن | روبي موشن" . rubymotion.com . تم الاطلاع عليه بتاريخ 18-12-2024 .
- ↑ "Ruby and Python on OS X" . developer.apple.com . تم الاطلاع عليه بتاريخ 18-12-2024 .
- ↑ "رف الكتب العملي: من المطورين، للمطورين" . pragprog.com . تم الاطلاع عليه بتاريخ 18-12-2024 .
روابط خارجية
- أدوات برمجة نظام التشغيل MacOS
- روبي (لغة برمجة)
