Кіріспе
MacOS framework RubyCocoa – бұл Ruby және Objective-C бағдарламалау тілдері арасында байланыс құратын MacOS framework, ол пайдаланушыға Ruby-ден Objective-C объектілерін және керісінше басқаруға мүмкіндік береді. Оның арқасында Cocoa қолданбасын толығымен Ruby тілінде жазуға, сондай-ақ Ruby және Objective-C кодтарын біріктіретін қолданбаны жасауға болады. 2008 жылы Apple компаниясы RubyCocoa-ны алмастыру мақсатында MacRuby жобасын дамытып жатты. Кейіннен 2012 жылы iOS, macOS және Android платформалары үшін қолжетімді RubyMotion деп аталатын коммерциялық жоба жарық көрді. RubyCocoa-ның пайдалы қолданыстарының қатарында irb арқылы Cocoa объектісінің мүмкіндіктерін зерттеу, Cocoa қолданбасының прототипін жасау, Ruby және Objective-C мүмкіндіктерін біріктіретін Cocoa қолданбасын жазу және Ruby сценарийі үшін macOS-тың түпнұсқалық GUI-ын пайдалану бар. RubyCocoa – Ruby лицензиясы және LGPL лицензиясы бойынша таратылатын ақысыз бағдарламалық қамтамасыз ету.
RubyCocoa is a macOS framework that provides a bridge between the Ruby and the Objective C programming languages, allowing the user to manipulate Objective C objects from Ruby, and vice versa. It makes it possible to write a Cocoa application completely in Ruby as well as to write an application that mixes Ruby and Objective C code. An Apple project called MacRuby was under development to replace RubyCocoa in 2008. A proprietary spin off called RubyMotion was subsequently released in 2012, available for iOS, macOS and Android. Some useful applications of RubyCocoa are exploration of a Cocoa object's features with irb interactively, prototyping of a Cocoa application, writing a Cocoa application that combines the features of Ruby and Objective C and wrapping macOS' native GUI for a Ruby script. RubyCocoa is free software, released under both the Ruby License and the LGPL.
Тарих
RubyCocoa 2001 жылы Hisakuni Fujimoto бастаған, ол NSObject және NSClassFromString функцияларын қамту үшін Ruby кеңейту модулін жасаған. Кейіннен ол Project Builder (кейіннен Xcode) құралымен біріктірілді. 2002 жылы жоба SourceForge-де тіркелді және даму тобы кеңейе бастады. 2006 жылы коммиттерлер тізіміне алғаш рет Apple компаниясының бағдарламашысы Лоран Сансонетти қосылды, содан кейін WWDC кезінде RubyCocoa туралы презентация жасалды. Apple компаниясы RubyCocoa-ның Mac OS X v10.5 “Leopard” жүйесіне енгізілетінін және қолдау көрсетілетінін мәлімдеді. 2008 жылдың тамызында Сансонетти MacRuby болашақта "RubyCocoa-ны алмастыруға тиіс" екенін растады.
Көпір қалай жұмыс істейді?
RubyCocoa кейде Cocoa шеңберлеріне байланыстар жиынтығы деп қате түсіндіріледі. RubyCocoa – Objective-C және Ruby бағдарламалау тілдері арасындағы нағыз байланыс.
Жалқау класты импорттау
RubyCocoa C мақсатты сыныптарды қажет болғанда Ruby ортасына импорттайды. Мысалы, сіз кодыңызда алғаш рет OSX::NSTableView-ке қол жеткізгенде, RubyCocoa осы сыныпқа қатысты барлық қажетті ақпаратты Objective C жүктеу кезінен алады және прокси ретінде жұмыс істейтін сол аттас Ruby сыныбын құрайды. Ол мұрагерлікке өткен барлық сыныптарды да осылай импорттайды.
Хабарларды жіберу
Жоғарыда айтылғандай, RubyCocoa арнайы прокси-объектілерді құрайды. Қандай да бір прокси-объектіге Ruby хабарын жіберген сайын, RubyCocoa оны Objective-C нысанына жіберуге тырысады, хабар атауын Objective-C таңдауышына аударып, Objective-C орындалу ортасынан оны жіберуді сұрайды. Егер Objective-C әлемінен қате пайда болса, RubyCocoa оны Ruby қатесіне айналдырып, сізге жібереді. RubyCocoa Objective-C әдістерін іске асыру үшін libffi кітапханасын пайдаланады.
Автоматты әдістің басымдығы
RubyCocoa Ruby-ден Objective C әдісін, субкласта немесе тікелей класта (Objective C-де категория қолданылғандай) қайта жазуды жеңілдетеді. Әдісіңіз енгізілгеннен кейін, RubyCocoa қолданыстағы Objective C әдісінің қолтаңбасын анықтап, Objective C орындалу ортасына сол қолтаңбаға ие жаңа әдіс енгізеді, бірақ енді ол сіздің кодыңызға бағытталған болады. Мұны іске асыру үшін RubyCocoa libffi кітапханасын пайдаланып, Ruby әдісін шақыратын жабылуды динамикалық түрде жасайды және осы жаңа жабылуға мекенжайын Objective C орындалу ортасына жібереді.
C биттерге қатынау
Objective-C тілінің ерекшелігіне байланысты, Objective-C кодынан C тілін еркін пайдалануға болады. Objective-C шеңберінің C бөліктерін, мысалы, C құрылымдарын, функцияларын, тізімдемелерін, тұрақтыларын және тағы да басқаларын байланыстыру үшін RubyCocoa BridgeSupport жобасына сенеді. RubyCocoa орындалу барысында BridgeSupport файлдарын (өте жылдам libXML2-нің xmlTextReader-ін қолдана отырып) түсіндіріп, олардың мазмұнын тиісінше өңдейді. Мысалы, C құрылымдары үшін Ruby прокси-кластарын құрастырып, функцияларды да жасайды. Ескеріңіз, символдарды іздеу сияқты едәуір операциялар тек қажет болғанда ғана, және әрине, бір рет жасалады.
Пішімдеу тізбегі
RubyCocoa пішім тізбектерін қолданатын, мысалы, NSLog немесе NSString. stringWithFormat сияқты API-лерді анықтай алады және формат тізбегінде көрсетілген типтерге сәйкес айнымалы аргументтерді дұрыс түрлендіреді.
Функция сілтемелері
RubyCocoa Ruby Proc объектілерін функция көрсеткіштері ретінде жіберуге мүмкіндік береді. Ол libffi кітапханасын пайдаланып, динамикалық түрде жабылуды (closure) құрады және оны негізгі функцияға немесе әдіске жібереді.
Руби тілінде жазылған Какао қолданбаларын жасау
RubyCocoa орнату арқылы қажетті Xcode үлгілері автоматты түрде орнатылады. Бұл әзірлеушілерге Xcode жобасының түрі ретінде "Cocoa Ruby Application" таңдауға және Xcode-тың олар үшін қажетті барлық файлдарды жасауға мүмкіндік береді.
Рубикокоаның артықшылықтары
Ruby интерпретацияланатын тіл болғандықтан, дамыту барысында қолданбаны жиі қайта компиляциялау қажеттілігі тумайды. Ruby-дің тұрақты өрнектерді қолдау сияқты көптеген мүмкіндіктері кодты жазуды жылдамдатады, сондай-ақ RubyCocoa-ны прототиптер жасау үшін өте қолайлы құралға айналдырады.
Кемшіліктер
Ruby интерпретаторының жылдамдығын ескермесек, RubyCocoa қолданбалары объектілерді түрлендірудің қосымша жүктемесінен Objective C/Cocoa қолданбаларынан әрқашан баяу болады. Ruby жіптік қауіпсіздігі болмағандықтан, RubyCocoa кодын орындау үшін бірнеше түпнұсқалық жіптерді жіберу мүмкін емес. Дегенмен, Ruby-дің эмуляцияланған жіптерін қолдануға болады.