Статьи

Попробуйте Mruby сегодня

Ruby доминирует в сети: на таких популярных сайтах, как Github, Heroku и Living Social. Но зачем веб-разработчикам получать удовольствие? Разве не было бы замечательно, если бы разработчики игр, инженеры встраиваемых систем или кто-либо еще мог использовать красивый синтаксис Ruby в своих программах на C? К счастью для нас, это именно то, что Mruby планирует сделать.

Последняя реализация Ruby от Matz надеется добиться больших успехов. Цель mruby — работать на любом устройстве, сохраняя при этом очень маленькую площадь. Довольно амбициозные устремления, так как запуск обычных процессов ruby ​​(MRI / cRuby) может занять 20 МБ или больше памяти, чтобы начать работу. Так что Mruby звучит довольно интересно, но как мы можем получить его до такой степени, что мы можем взломать его?

Следите за тем, как мы собираем mruby из исходного кода и запускаем его на вашем компьютере. Прежде чем мы сможем запустить mruby, нам нужно скачать исходный код и скомпилировать двоичный файл, но что именно является двоичным файлом?

Что такое бинарный?

Бинарный файл — это любой файл, который не является текстовым файлом. Довольно просто, но мы заботимся о конкретном виде двоичного файла. Это полнофункциональные программы, которые не требуют инсталляторов и могут запускаться непосредственно вашим компьютером. У вас уже есть несколько таких двоичных файлов на вашем компьютере прямо сейчас, но вы, вероятно, никогда не думали о них таким образом. Если в вашей системе установлен ruby, это бинарный файл. Вы можете запустить команду which ruby чтобы получить местоположение двоичного файла.

$ which ruby
/Users/schneems/.rvm/rubies/ruby-1.9.3-p194/bin/ruby

view raw
file.md
hosted with ❤ by GitHub

Примечание: ваш вывод будет отличаться от моего.

Как только мы узнаем, где хранится файл, вы можете запустить его, просто вызвав его полный путь в командной строке:

$ /Users/schneems/.rvm/rubies/ruby-1.9.3-p194/bin/ruby --help
Usage: /Users/schneems/.rvm/rubies/ruby-1.9.3-p194/bin/ruby [switches] [--] [programfile] [arguments]
  -0[octal]       specify record separator (\0, if no argument)
  -a              autosplit mode with -n or -p (splits $_ into $F)
  -c              check syntax only
  -Cdirectory     cd to directory, before executing your script
  # ...

view raw
file.md
hosted with ❤ by GitHub

Вы можете использовать полный путь к бинарному файлу ruby ​​для запуска чего-либо, как если бы вы использовали обычную команду ruby :

$ which ruby
/Users/schneems/.rvm/rubies/ruby-1.9.3-p194/bin/ruby

view raw
gistfile1.txt
hosted with ❤ by GitHub

Итак, теперь вы видите, что ruby — это двоичный файл на вашей машине, как вы собираетесь создавать двоичный файл и почему он вообще требуется?

Двоичные файлы, кому они нужны?

Хотя вас может не беспокоить то, какую операционную систему вы используете или на какой архитектуре построен ваш ЦП, ваше программное обеспечение должно знать эти вещи. Программное обеспечение, написанное на понятном человеку языке, должно быть скомпилировано так, чтобы ваш компьютер мог работать. Во многих случаях проще дать кому-то исходный код и скомпилировать его на своем компьютере, чем предварительно компилировать двоичные файлы для всех различных архитектур.

Если вы работаете на Mac и когда-либо использовали библиотеку homebrew для установки программного обеспечения, такого как postgres :

$ brew install postgres

view raw
file.md
hosted with ❤ by GitHub

Затем вы скомпилировали исходный код в двоичный файл. Мы можем заглянуть в другую формулу варева, чтобы понять, как это делается. Взгляните на формулу brew для wget библиотеки для получения файлов через http:

$ brew edit wget

view raw
file.md
hosted with ❤ by GitHub

После открытия вы можете увидеть в DSL доморощенного URL-адрес, по которому мы получаем исходный код:

  url http://ftpmirror.gnu.org/wget/wget-1.14.tar.gz

view raw
file.md
hosted with ❤ by GitHub

Wget — это библиотека, написанная на языке программирования C. После того, как вы загрузили исходный код, вам необходимо настроить его для своего компьютера, а затем запустить сценарии компиляции, чтобы он мог работать на вашем компьютере. Вы можете увидеть, где homebrew настраивает и устанавливает программное обеспечение:

system "./configure", *args
system "make install"

view raw
file.md
hosted with ❤ by GitHub

Когда система завершит выполнение этих команд, она создаст двоичный файл, скомпилированный для запуска на вашем компьютере. Этот файл можно использовать прямо из вашей системы. Распространять исходный код гораздо проще для разработчиков кода. Это означает, что если вы разрабатываете новую операционную систему или архитектуру ЦП, у вас все еще есть шанс скомпилировать код в то, что может понять ваша новая машина. Если вы создаете библиотеки с открытым исходным кодом, людям также легче модифицировать ваш код, попробовать изменения, а затем, надеюсь, отослать все исправления или обновления обратно в апстрим. Компиляция двоичных файлов может быть не такой простой, как перетаскивание, но она гораздо более гибкая.

Итак, теперь вы знаете, что такое двоичный файл и почему это важно. Мы быстро рассмотрим PATH прежде чем что-то компилировать.

Пройдите ПУТЬ

Мы видели, как мы можем вызвать двоичный файл напрямую, используя полный путь, но это довольно грязно. Есть ли способ сократить эту команду, чтобы мы могли вызвать:

# We want to be able to call
$ ruby

view raw
file.md
hosted with ❤ by GitHub

Без указания полного пути к двоичному файлу:

# instead of having to specify the full path
$ /Users/schneems/.rvm/rubies/ruby-1.9.3-p194/bin/ruby

view raw
file.md
hosted with ❤ by GitHub

* Системы на основе Nix, такие как Mac, решают эту проблему, позволяя нам хранить список каталогов, в которых операционная система будет искать двоичный файл с тем же именем. Вы можете почти думать об этом как method_missing для вашей ОС. Когда ты бежишь

$ ruby

view raw
file.md
hosted with ❤ by GitHub

Он будет идти по списку путей до тех пор, пока не найдет бинарный файл с именем ruby , а затем выполнит его. Вы можете взглянуть на каталоги, которые уже находятся на вашем пути, запустив:

$ echo $PATH

view raw
file.md
hosted with ❤ by GitHub

Команда echo — это как puts или print in bash (ваша командная строка). Здесь мы распечатываем переменную PATH , знак доллара впереди говорит bash, что мы хотим оценить значение переменной окружения PATH .

В выводе вы получите разные пути, разделенные двоеточием : когда я запускаю эту команду, я получаю что-то вроде этого:

/Users/schneems/.rvm/rubies/ruby-1.9.3-p194/bin:/Users/schneems/.rvm/bin:/usr/local/bin:/usr/local/sbin #...

view raw
file.md
hosted with ❤ by GitHub

Вы можете видеть, что первый путь к моей библиотеке ruby, расположенный в /Users/schneems/.rvm/rubies/ruby-1.9.3-p194/bin является первой частью пути. Когда я выполняю команду $ ruby , моя операционная система сначала ищет этот путь, чтобы выполнить двоичный файл с именем ruby . Если он не может найти его, он перейдет к следующему пути, пока не найдет файл.

Так что это все интересно и все, но как насчет mruby?

Клон мруби

Давайте загрузим исходный код mruby, чтобы мы могли скомпилировать его для нашей машины.

Перейдите на страницу Mruby Github . Мы можем получить git url для клонирования исходного кода на наш компьютер.

$ git clone git://github.com/mruby/mruby.git
$ cd mruby

view raw
file.md
hosted with ❤ by GitHub

Примечание: mruby в альфа-версии, и эти инструкции могут отличаться. Для получения актуальной информации посетите веб-сайт https://github.com/mruby/mruby/blob/master/INSTALL.

Теперь, когда у вас есть исходный код, вам понадобится способ его скомпилировать. Для этого мы будем использовать Bison на вашей машине.

Установить зависимости: Бизон

Посетите http://www.gnu.org/software/bison/ и найдите ссылку для загрузки . Найдите самый большой номер версии и нажмите на файл, который оканчивается на .tar.gz это указывает на то, что файл был заархивирован и затем скопирован . Это сделано для того, чтобы размер загрузки был небольшим. Если вы хотите сделать это программно, вы можете использовать команду wget мы рассмотрели ранее, или curl -O вместе с URL.

После загрузки файла вы сможете дважды щелкнуть его на компьютере Mac, и он будет автоматически разархивирован. Если вы находитесь в командной строке, вы можете использовать команду tar чтобы разархивировать файл

$  tar xvf bison.tar

view raw
file.md
hosted with ❤ by GitHub

Теперь, когда у нас есть компьютер Bison, угадайте, что … нам нужно его скомпилировать! Звучит страшно, но это не так.

Перейдите в каталог, где находится папка Bison. Для меня это в загрузках:

$ cd ~/Downloads/

view raw
file.md
hosted with ❤ by GitHub

Используемая версия Bision — 2.6 поэтому я перейду в этот каталог:

$ cd bison-2.6.2

view raw
file.md
hosted with ❤ by GitHub

Примечание. Номер вашей версии может отличаться.

Теперь тебе захочется бежать

$ ./configure

view raw
file.md
hosted with ❤ by GitHub

а потом

$ make

view raw
file.md
hosted with ❤ by GitHub

и наконец:

$ make install

view raw
file.md
hosted with ❤ by GitHub

Примечание. При запуске этих команд вы увидите много текста. Мне нравится быть уверенным, что я нахожусь в публичном месте при компиляции бинарных файлов, так как хакеры смотрят это по телевизору Тогда, когда это будет сделано, вы можете захлопнуть свой ноутбук, закричать «они на меня» и убежать!

Если в конце вы не получите кучу сообщений об ошибках, значит, все работает.

Эта серия команд ./configure , make и make install является очень распространенным шаблоном для установки программного обеспечения в * nix-подобных системах (таких как mac). Если вы еще не знали эти команды, не волнуйтесь, есть README, который говорит вам искать в файле INSTALL указания. В случае сомнений проверьте наличие файла README или других файлов caps в базовом каталоге библиотеки.

После завершения вы должны иметь команду бизонов на вашей машине

$ which bison
/usr/local/bin/bison

view raw
file.md
hosted with ❤ by GitHub

По умолчанию бинарный файл находится в каталоге /usr/local/bin который должен находиться на вашем пути. Если это не так, вы можете добавить его на свой путь в вашем ~/.bashrc .

Теперь, когда у нас есть зависимости от вашей системы, пришло время для основного шоу, мы собираемся скомпилировать и запустить mruby!

Составление мрубы

Вернитесь в каталог, где вы клонировали Mruby. Я храню весь свой код в каталоге projects под документами

$ cd ~/documents/projects/mruby

view raw
file.md
hosted with ❤ by GitHub

Примечание. Ваш источник mruby, вероятно, будет находиться в другом файле.

Попав в папку, просто запустите make :

$ make

view raw
file.md
hosted with ❤ by GitHub

Если все работает, вы должны увидеть двоичные файлы в папке bin :

$ ls bin
mirb  mrbc  mruby

view raw
file.md
hosted with ❤ by GitHub

Если вы получили ошибки, убедитесь, что зубр доступен. Попробуйте прибегнуть к поиску ошибок. Если все скомпилировано нормально, вы можете запустить mirb которая является версией IRB для mruby:

$ bin/mirb
mirb - Embeddable Interactive Ruby Shell

This is a very early version, please test and report errors.
Thanks 🙂

> 1 + 1
 => 2
> a = 1
 => 1
> 100.times {a += 1}
 => 100
> puts a
 => 101

view raw
file.md
hosted with ❤ by GitHub

Если вы смогли запустить mirb , отличная работа! Вы только что скомпилировали самую новую реализацию ruby, и она еще даже не выпущена!

Вы также получаете доступ к команде mruby которая ведет себя очень похоже на cRuby:

$ bin/mruby -e «puts ‘hello world'»
hello world

view raw
gistfile1.txt
hosted with ❤ by GitHub

Если вы хотите использовать $ mirb в качестве команды для запуска в любом месте на вашем компьютере, как и $ irb вы можете скопировать ее в папку в вашей переменной PATH:

$ cp ./bin/mirb /usr/local/bin/mirb

view raw
file.md
hosted with ❤ by GitHub

Или, если вы не хотите копировать файл, вы можете сделать символическую ссылку . Это на самом деле так, как библиотеки, такие как RVM, позволяют вам установить несколько версий ruby ​​одновременно, хранит их в отдельных файлах, а затем изменяет вашу ссылку или PATH так, чтобы они указывали на правильное расположение в зависимости от того, какой Ruby вы хотите использовать. ,

Используя mruby

Теперь, когда у вас есть mruby на вашем компьютере, для чего вы можете его использовать? Поскольку эта реализация может работать на микроконтроллерах и встроенных системах, а также на вашем ноутбуке, вы можете создавать программы на своем компьютере и затем переносить их на другую систему. Прямо сейчас нет никаких библиотек для mruby, так как он так молод. Одно из проектных решений — поддерживать только функциональность, доступную на всех устройствах. Это решение означает, что нет собственной поддержки файлов, процессов или потоков, поскольку нельзя предполагать, что mruby всегда будет работать в ОС. Если вам это нужно, есть активная ветка mruby / mruby, которая добавляет эти функции https://github.com/iij/mruby, процесс установки должен быть похожим.

Обычно разные языки программирования общаются друг с другом путем компиляции библиотек, с которыми можно динамически связываться. Так что, если вы хотите сделать что-то действительно быстрое в cRuby, вы можете написать это как c-расширение. С mruby процесс на самом деле идет в обратном направлении, большинство людей пишут свои программы на C, а затем встраивают mruby непосредственно в свои программы, когда им требуется больше гибкости. Это особенно полезно при разработке игр или при тестировании сценариев во встроенных системах. Везде, где вы можете запустить Lua, mruby тоже подойдет. Примером существующего проекта mruby является mod_mruby, который позволяет запускать mruby внутри сервера Apache, аналогичного mod_lua .

В основе mruby лежит подмножество cRuby, поэтому посмотрите, какие вещи вы можете перенести и запустить. Если вам посчастливилось принять участие в выступлении Мэтта Аймонетти на AlohaRubyConf, вы, возможно, видели несколько сгенерированных mruby наборов mandelbrot. Теперь вы тоже можете создавать красивые наборы Мандельброта, не выходя из собственного дома. Быстрый захват кода:

$ curl -O https://raw.github.com/gist/3919010/646a69e8235da2316a36b5242a4bb96a92fd8de1/mandelbrot.rb

view raw
file.md
hosted with ❤ by GitHub

Затем запустите это:

$ mruby mandelbrot.rb

view raw
file.md
hosted with ❤ by GitHub

Вы можете заметить, что в mruby он работает быстрее, чем в cruby, используя команду time :

$ time mruby mandle.rb
$ time ruby mandle.rb

view raw
file.md
hosted with ❤ by GitHub

Это связано со скоростью mruby в вычислениях с плавающей запятой. Реализация mruby построена не для скорости, а для размера. Если это происходит быстрее в нескольких областях, это просто счастливое совпадение. Мэтт проделал хорошую работу с mruby, включая его начало работы с mruby guide.

Завершение

Возможно, вы начинаете мечтать о всех микроконтроллерах, или о мозговых штурмах lego, которые вы собираетесь взломать с помощью mruby, или, может быть, вы просто счастливы, что знаете mruby лучше. В любом случае, надеюсь, вы оцените всю работу по компиляции и упаковке двоичных файлов для работы в различных системах и работу PATH . Запуск mruby локально — это только начало, от вас зависит, как создать встроенную программу-убийцу. Поскольку mruby должен бегать где угодно, вы ограничены только своим воображением. Мы можем запустить mruby на любой системе, большой или маленькой, не было бы здорово, если бы мы могли скомпилировать ее для запуска на Heroku? Может быть, мы сохраним это на следующей неделе …