Только в апреле прошлого года Лоран Сансонетти захватил воображение всего сообщества Ruby с помощью RubyMotion . Впервые разработчики Ruby смогли писать приложения непосредственно для мобильной платформы iOS, используя язык, который мы все знаем и любим. Теперь больше нет необходимости изучать архаичный, многословный язык Objective-C или, что еще хуже, научиться ориентироваться в запутанном множестве окон и диалоговых окон в XCode IDE. Мы можем просто перенести магию Ruby на iOS, используя наши любимые инструменты командной строки.
В начале месяца я был в восторге, когда Лоран согласился взять у меня интервью для RubySource. Я мог бы узнать больше о RubyMotion непосредственно от его изобретателя. Поскольку у меня было так много вопросов, я разделил интервью на два поста. Сначала я задам Лорану несколько основных вопросов: что такое RubyMotion? Что оно делает? Как мы должны это использовать? Отличается ли написание Ruby для iOS от написания «нормального» Ruby-приложения?
Завтра я опубликую вторую половину интервью , которое будет более техническим: как внутреннее работает RubyMotion? Как Лоран использует каркас LLVM для компиляции кода Ruby в статический исполняемый файл? Чем он отличается от работы MacRuby и Rubinius? Мне нравится изучать внутренности Ruby, и RubyMotion, безусловно, является уникальной и увлекательной реализацией Ruby.
#INSPECT — первая конференция, посвященная RubyMotion
Вопрос: Не хотите ли вы рассказать нам о предстоящей конференции RubyMotion # INSPECT2013 ?
Через 6 месяцев после выхода RubyMotion у меня появилась идея провести небольшое мероприятие, однодневную конференцию, о RubyMotion. А потом я просто занялся другими вещами. Я оставил это в стороне, и недавно мои друзья из Phusion , которые провели конференцию под названием BubbleConf в Амстердаме, посвященную стартапам, пригласили меня выступить, и это было здорово. Я говорил о страхе и депрессии до того, как запустил RubyMotion (доступно здесь ). Нинь Буй, очень хороший друг, на самом деле организовал конференцию; ну, он получил некоторую помощь, конечно. Это своего рода большое дело. Тогда я ревновал; Я сказал: «Я тоже хочу провести свою собственную конференцию».
Q: Это звучит как огромный объем работы.
Да, это не легко. В то же время я не такой амбициозный, как Нинь. Нинь сделал действительно большое шоу; он арендовал очень старое заведение, потрясающий кинотеатр в Амстердаме на 300 человек. Мой намного проще; Я хочу только 150 человек. Изначально я хотел сделать это в США, потому что именно там большинство пользователей RubyMotion. Но потом я сказал себе для самого первого издания, что он должен быть особенным, и я решил сделать это здесь, в Бельгии.
Q: почему это?
Во-первых, мне легче организовать это. Я хотел сделать первый как можно меньше, сделать что-то интимное, где люди могут на самом деле разговаривать друг с другом, могут на самом деле взломать вместе. Я не делаю это ради денег, я думаю, что мы действительно потеряем деньги на первом. Все дело в том, чтобы развлекаться и пытаться продвигать RubyMotion. Просто проведение конференции — отличный знак того, что сообщество здорово. У нас также будут мероприятия для людей, которые приходят с людьми на конференцию: посещение шоколадной фабрики, а также мы посетим пивоварню, где они делают очень типичное пиво из Брюсселя.
У нас на самом деле есть длинный список ораторов. Но в то же время это очень короткие беседы по 30 минут, и между ними много места. Я также хотел один трек — только один набор динамиков. В число наших спикеров входят люди из сообщества RubyMotion, известные люди, такие как Ник Куаранто (37signals) и Мэтт Томпсон (Heroku), но также и менее известные люди, которые делают удивительные вещи в RubyMotion. Поэтому я думаю, что это будет интересно.
Как началась RubyMotion
В: Вы раньше работали в Apple, верно?
Да, в течение семи лет. MacRuby был моим последним проектом в Apple. Это открытый исходный код, который редко встречается в Apple. Это было отчасти успешно; В какой-то момент стало ясно, что руководство больше не заинтересовано в спонсировании MacRuby, поэтому мне пришлось принять решение: я мог бы остаться в Apple и заняться чем-то другим, или я мог бы уйти из компании и присоединиться к другой компании или начать свою работу. владеть компанией. Я много думал об этом и понял, что у меня есть прекрасная возможность создать свою собственную компанию.
Мой ребенок был очень молод, четыре месяца. В то время мы жили в Калифорнии, но мы хотели вернуться в Европу. Все кусочки головоломки фактически таяли, и все это имело смысл, что я должен был сделать запуск.
Q: Работаете ли вы с другими людьми на RubyMotion?
Это был только я в течение длительного периода времени, но четыре месяца назад я нанял Шизуо Фудзиту ; чье прозвище «Уотсон». Он очень популярен в сообществе MacRuby. Когда я начал работать над RubyMotion, я действительно больше не работал над MacRuby. Уотсон взял все с проекта; он был самым большим участником проекта. Есть еще два человека, которых я хотел бы нанять в этом году.
Что такое RubyMotion?
Q: Что такое RubyMotion? Как вы начали с этим? Откуда пришла идея?
RubyMotion — это набор инструментов для разработки iOS под Ruby. Под набором инструментов я имею в виду набор различных компонентов. Во-первых, RubyMotion — это реализация Ruby для iOS. Это переопределение языка Ruby поверх среды выполнения Objective-C и поверх основных платформ iOS. Это означает, что в RubyMotion объектная модель фактически реализована с использованием среды выполнения Objective-C. Таким образом, в RubyMotion при создании классов, объектов или методов вы фактически используете одну и ту же реализацию объектов, классов или методов Objective-C во время выполнения. Между языками Ruby и Objective-C нет моста. В RubyMotion люди могут получить доступ ко всему набору API-интерфейсов iOS, которые изначально реализованы в Objective-C, без использования какого-либо промежуточного программного обеспечения.
Q: Они все являются частью одной и той же рабочей системы?
Точно. Среда выполнения Objective-C — это на самом деле очень маленькая библиотека C, которую могут использовать люди, и это то, что мы делаем. Приложение RubyMotion вызывает тот же API времени выполнения, как если бы приложение было написано в Objective-C. Кроме того, эта реализация Ruby использует базовые платформы iOS для реализации некоторых встроенных классов.
Например, класс String в RubyMotion реализован как подкласс NSMutableString из базового фреймворка. С точки зрения пользователя Ruby изменений очень мало. Под обложками он фактически использует то же поведение, что и строка Objective-C. Это означает, что если вы создаете строку в Ruby, а затем передаете эту строку в Objective-C API, который ожидает строку, в которой нет преобразования; мы просто передаем объект как есть. Это то, что мы называем «унифицированным временем выполнения». Мы используем ту же среду выполнения Objective C для объектной модели, и мы используем базовые платформы для построения классов.
Q: Вы должны были написать поддержку методов Ruby, таких как «upcase», которые не являются частью Objective-C?
Да. RubyMotion — это разновидность MacRuby , которую я создал в Apple около 5-6 лет назад. Этот дизайн исходит от MacRuby.
Q: Что еще есть в наборе инструментов RubyMotion?
RubyMotion также имеет статический компилятор. Это сразу компилирует Ruby в оптимизированный машинный код. Это связано с этой реализацией Ruby, которую мы написали. Это то, что представляет собой RubyMotion — это среда выполнения, реализация Ruby, а также компилятор.
Q: Итак, что происходит на устройстве — это среда выполнения Objective C, среда Ruby, и все?
Да это оно. Мы используем среду выполнения Objective C для объектной модели, а затем у нас есть среда выполнения Ruby, с которой мы статически связываем, которая составляет около 1 МБ. Он содержит все существующие классы, такие как String, Array, Hash и т. Д., А также реализует все возможности языка Ruby, которых нет в Objective-C. Например, Objective-C не имеет понятия о миксин. Мы должны сами внедрять миксины. Кроме того, в Objective-C вы не можете динамически устанавливать переменные экземпляра для класса, поэтому мы также должны обойти это.
RubyMotion против МРТ
Q: На какой версии Ruby основана RubyMotion?
На самом деле мы следуем за Ruby 1.9. RubyMotion — это форк MacRuby, и MacRuby долгое время пытался следовать проекту RubySpec . RubySpec — это исполняемый набор спецификаций для Ruby. Я думаю, что это было извлечено из проекта Рубиниуса . MacRuby пытался следовать этому, чтобы убедиться, что мы соответствуем спецификациям Ruby. В то время, я думаю, последняя версия RubySpec была 1.9.1. Затем мы разбудили MacRuby для RubyMotion и с тех пор мы больше не обращали внимания на RubySpec.
В RubyMotion мы фактически удалили функции из Ruby, так как он статически компилируется, и есть некоторые функции Ruby, которые мы просто не можем предоставить.
В: Если я являюсь разработчиком Ruby, если я пишу Ruby каждый день и начинаю использовать RubyMotion, что бы я заметил по-другому?
Я думаю, что самое большое различие, а также одно из единственных различий заключается в том, что в RubyMotion нет оператора «требуется».
Q: что это значит? Как вы включаете другие библиотеки?
Поскольку RubyMotion статически компилируется, система сборки должна заранее знать во время сборки все файлы проекта. Он должен построить исполняемый файл заранее. Поэтому мы не можем просто требовать файлы во время выполнения.
Q: Это похоже на программу на C, использующую включает в себя, имея Makefile, и тому подобное?
Точно. И система сборки сейчас очень умная. Когда вы создаете проект RubyMotion, у вас есть каталог с именем «app». А в каталоге app вы можете просто создавать файлы .rb; наличие одного файла на класс — хороший способ структурировать ваш проект. Затем система сборки возьмет все эти файлы .rb и попытается обнаружить зависимости между ними. Например, в одном файле вы создаете класс Foo, а затем в отдельном файле вы создаете класс Bar, который наследуется от Foo. Система сборки обнаружит это и скомпилирует первый файл перед вторым файлом. Во время выполнения, когда программа запускается, класс Foo создается перед классом Bar.
Из-за этой функции людям обычно не нужны файлы.
Q: … это просто происходит автоматически?
На самом деле у нас может быть метод require, который можно использовать как подсказку компилятора. Но я не доволен этой идеей, потому что require в Ruby — это метод класса Kernel; это не ключевое слово языка. Поскольку это метод, вы можете передать ему переменную. Это не должно быть непосредственным типом. Вы можете потребовать X, который указывает на строку, которая была определена ранее. Это означает, что компиляция должна была бы иметь дело с этими крайними случаями, и это не кажется хорошей идеей.
Поэтому сейчас система сборки просто проанализирует код и попытается установить зависимости для вас. Require в RubyMotion прямо сейчас вызывает исключение. Это самая большая разница между традиционным Ruby и RubyMotion. Кроме этого, различия довольно малы.
Второе отличие состоит в том, что в RubyMotion «метод eval» строки не работает. Поддержка eval будет означать, что нам потребуется отправить переводчик для Ruby, переводчик внутри приложения. Это то, что не совсем понятно в отношении рекомендаций Apple для iOS.
Q: Они не позволят вам сделать это?
Вы можете отправить переводчика, но не можете скачать код. Я просто боялся, что если мы отправим переводчика в RubyMotion, Apple перестанет утверждать приложения RubyMotion.
Q: Таким образом, удалив eval, вы можете сказать им, что не делали этого …
Кроме того, аппаратное обеспечение iOS, особенно старое, не такое быстрое. Вообще-то они были медленными. Интерпретация кода во время выполнения была просто плохой идеей.
Q: Связанные методы также недопустимы, такие как instance_eval, class_eval, и тому подобное?
Они работают — все остальное должно работать. Вы можете назвать все вещи метапрограммирования.
Q: Это единственные два различия, тогда?
Это об этом; за исключением нескольких небольших различий. Вот список:
-
Require не поддерживается из-за системы сборки,
-
Eval строки не работает,
-
Привязка Proc # была удалена, и
-
Переопределение операторов на Fixnum и Float отключено.
[Примечание автора: Лоран и я обсуждаем привязку Proc # и переопределение операторов во второй части этого интервью . ]
Почему RubyMotion не является открытым исходным кодом?
Q: Является ли RubyMotion открытым исходным кодом? Или фирменный?
Фирменными компонентами являются среда выполнения и компилятор. Система сборки написана на Ruby и имеет открытый исходный код, и это здорово, потому что многим нравится взламывать систему сборки.
Q: То есть настоящая специальная технология, которую вы предоставляете клиентам в RubyMotion, это компилятор?
Да, компилятор и реализация Ruby (среда выполнения). Реализация Ruby является закрытым исходным кодом. Я действительно много думал об этом: должен ли я открыть исходный код все или открыть исходный текст.
Чтобы проект был жизнеспособным, мне нужны деньги. Если бы это было бесплатно, с открытым исходным кодом, мне нужно было бы найти спонсоров. Мне не очень нравятся спонсоры, так как они могут отпустить вас в любое время, а затем вам нужно найти других спонсоров, чтобы поддержать проект, или вам нужно выполнить другую работу на стороне. А потом я также понял, что если бы RubyMotion был бесплатным и открытым исходным кодом, то это не означало бы, что проект действительно будет расти быстрее. MacRuby был открытым исходным кодом с самого начала, с самого начала, и я думаю, что у нас было всего четыре человека в течение шести лет, которые фактически вносили код в среду выполнения или компилятор.
Меня беспокоит, что если бы RubyMotion был открытым исходным кодом, я не уверен, что это поможет, потому что RubyMotion в основном используется программистами Ruby. И программисты Ruby не очень знакомы с компиляторами C и виртуальными машинами.
Q: Это не похоже на Rails, где они могут войти и легко исправить вещи или добавить новые функции. Никто не собирается заходить в ваш компилятор и что-то там менять.
Точно. Поэтому с RubyMotion я попытался открыть исходный код всего, что является Ruby, и это здорово, потому что мы получаем много патчей. Я вижу, что у нас на самом деле есть больше запросов на получение, поэтому я должен их проверить. Я очень ленивый.
Q: Извините! Я забираю все ваше время …
Все нормально.
Поэтому я думаю, что это отличный компромисс; мы открываем исходный код, что может быть, и таким образом мы просим финансовый вклад от пользователей, чтобы мы могли построить бизнес вокруг этого. Также я не хочу получать инвестиции для этого стартапа. Моя цель — запустить полностью загруженную компанию, и нет внешних инвесторов.
Q: Это фантастика.
И я думаю, что так оно и должно быть, потому что я хочу, чтобы продукт был живым в течение многих лет, и как только вы берете инвестиции, вы больше не контролируете компанию, потому что большинство инвесторов хотят возврата своих инвестиций. от 3 до 5 лет.
Q: Таким образом, вы можете делать то, что вы хотите, по своему собственному графику.
Точно. Для меня единственный способ сделать это состоял в том, чтобы фактически взимать плату за это.
Что дальше?
В: Что дальше для RubyMotion?
Сейчас это сложно, потому что RubyMotion растет так быстро. Прошло всего 8 месяцев с тех пор, как мы выпустили его. Сейчас мы находимся в той точке, где у нас много разных вариантов. Мы можем сделать много вещей, много важных функций для платформы. В то же время мы ограничены с точки зрения человеческих ресурсов. Поэтому мы должны принять решение.
Что мы, вероятно, сделаем, это улучшим набор инструментов. В настоящее время набор инструментов полностью основан на командной строке и работает для большинства пользователей. Но в то же время некоторым людям действительно нравятся IDE, и мы работаем с JetBrains. RubyMine имеет отличную поддержку RubyMotion; вы можете отладить код RubyMotion внутри RubyMine, и это здорово. Мы хотим продолжать работать с ними, чтобы мы могли написать IDE для пользователей RubyMotion.
Многие пользователи также запрашивают перенос RubyMotion на другие платформы.
Будьте на связи!
Как я упоминал в начале, следите за второй половиной этого интервью завтра на RubySource . Лоран и я рассмотрим, как на самом деле работает RubyMotion.