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
Примечание: ваш вывод будет отличаться от моего.
Как только мы узнаем, где хранится файл, вы можете запустить его, просто вызвав его полный путь в командной строке:
$ /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
# ...
Вы можете использовать полный путь к бинарному файлу ruby для запуска чего-либо, как если бы вы использовали обычную команду ruby
:
$ which ruby | |
/Users/schneems/.rvm/rubies/ruby-1.9.3-p194/bin/ruby |
Итак, теперь вы видите, что ruby
— это двоичный файл на вашей машине, как вы собираетесь создавать двоичный файл и почему он вообще требуется?
Двоичные файлы, кому они нужны?
Хотя вас может не беспокоить то, какую операционную систему вы используете или на какой архитектуре построен ваш ЦП, ваше программное обеспечение должно знать эти вещи. Программное обеспечение, написанное на понятном человеку языке, должно быть скомпилировано так, чтобы ваш компьютер мог работать. Во многих случаях проще дать кому-то исходный код и скомпилировать его на своем компьютере, чем предварительно компилировать двоичные файлы для всех различных архитектур.
Если вы работаете на Mac и когда-либо использовали библиотеку homebrew для установки программного обеспечения, такого как postgres :
$ brew install postgres
Затем вы скомпилировали исходный код в двоичный файл. Мы можем заглянуть в другую формулу варева, чтобы понять, как это делается. Взгляните на формулу brew для wget библиотеки для получения файлов через http:
$ brew edit wget
После открытия вы можете увидеть в DSL доморощенного URL-адрес, по которому мы получаем исходный код:
url http://ftpmirror.gnu.org/wget/wget-1.14.tar.gz
Wget — это библиотека, написанная на языке программирования C. После того, как вы загрузили исходный код, вам необходимо настроить его для своего компьютера, а затем запустить сценарии компиляции, чтобы он мог работать на вашем компьютере. Вы можете увидеть, где homebrew настраивает и устанавливает программное обеспечение:
system "./configure", *args
system "make install"
Когда система завершит выполнение этих команд, она создаст двоичный файл, скомпилированный для запуска на вашем компьютере. Этот файл можно использовать прямо из вашей системы. Распространять исходный код гораздо проще для разработчиков кода. Это означает, что если вы разрабатываете новую операционную систему или архитектуру ЦП, у вас все еще есть шанс скомпилировать код в то, что может понять ваша новая машина. Если вы создаете библиотеки с открытым исходным кодом, людям также легче модифицировать ваш код, попробовать изменения, а затем, надеюсь, отослать все исправления или обновления обратно в апстрим. Компиляция двоичных файлов может быть не такой простой, как перетаскивание, но она гораздо более гибкая.
Итак, теперь вы знаете, что такое двоичный файл и почему это важно. Мы быстро рассмотрим PATH
прежде чем что-то компилировать.
Пройдите ПУТЬ
Мы видели, как мы можем вызвать двоичный файл напрямую, используя полный путь, но это довольно грязно. Есть ли способ сократить эту команду, чтобы мы могли вызвать:
# We want to be able to call
$ ruby
Без указания полного пути к двоичному файлу:
# instead of having to specify the full path
$ /Users/schneems/.rvm/rubies/ruby-1.9.3-p194/bin/ruby
* Системы на основе Nix, такие как Mac, решают эту проблему, позволяя нам хранить список каталогов, в которых операционная система будет искать двоичный файл с тем же именем. Вы можете почти думать об этом как method_missing
для вашей ОС. Когда ты бежишь
$ ruby
Он будет идти по списку путей до тех пор, пока не найдет бинарный файл с именем ruby
, а затем выполнит его. Вы можете взглянуть на каталоги, которые уже находятся на вашем пути, запустив:
$ echo $PATH
Команда 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 #...
Вы можете видеть, что первый путь к моей библиотеке 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
Примечание: 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
Теперь, когда у нас есть компьютер Bison, угадайте, что … нам нужно его скомпилировать! Звучит страшно, но это не так.
Перейдите в каталог, где находится папка Bison. Для меня это в загрузках:
$ cd ~/Downloads/
Используемая версия Bision — 2.6
поэтому я перейду в этот каталог:
$ cd bison-2.6.2
Примечание. Номер вашей версии может отличаться.
Теперь тебе захочется бежать
$ ./configure
а потом
$ make
и наконец:
$ make install
Примечание. При запуске этих команд вы увидите много текста. Мне нравится быть уверенным, что я нахожусь в публичном месте при компиляции бинарных файлов, так как хакеры смотрят это по телевизору Тогда, когда это будет сделано, вы можете захлопнуть свой ноутбук, закричать «они на меня» и убежать!
Если в конце вы не получите кучу сообщений об ошибках, значит, все работает.
Эта серия команд ./configure
, make
и make install
является очень распространенным шаблоном для установки программного обеспечения в * nix-подобных системах (таких как mac). Если вы еще не знали эти команды, не волнуйтесь, есть README, который говорит вам искать в файле INSTALL указания. В случае сомнений проверьте наличие файла README или других файлов caps в базовом каталоге библиотеки.
После завершения вы должны иметь команду бизонов на вашей машине
$ which bison
/usr/local/bin/bison
По умолчанию бинарный файл находится в каталоге /usr/local/bin
который должен находиться на вашем пути. Если это не так, вы можете добавить его на свой путь в вашем ~/.bashrc
.
Теперь, когда у нас есть зависимости от вашей системы, пришло время для основного шоу, мы собираемся скомпилировать и запустить mruby!
Составление мрубы
Вернитесь в каталог, где вы клонировали Mruby. Я храню весь свой код в каталоге projects
под документами
$ cd ~/documents/projects/mruby
Примечание. Ваш источник mruby, вероятно, будет находиться в другом файле.
Попав в папку, просто запустите make
:
$ make
Если все работает, вы должны увидеть двоичные файлы в папке bin
:
$ ls bin
mirb mrbc mruby
Если вы получили ошибки, убедитесь, что зубр доступен. Попробуйте прибегнуть к поиску ошибок. Если все скомпилировано нормально, вы можете запустить 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
Если вы смогли запустить mirb
, отличная работа! Вы только что скомпилировали самую новую реализацию ruby, и она еще даже не выпущена!
Вы также получаете доступ к команде mruby
которая ведет себя очень похоже на cRuby:
$ bin/mruby -e «puts ‘hello world'» | |
hello world |
Если вы хотите использовать $ mirb
в качестве команды для запуска в любом месте на вашем компьютере, как и $ irb
вы можете скопировать ее в папку в вашей переменной PATH:
$ cp ./bin/mirb /usr/local/bin/mirb
Или, если вы не хотите копировать файл, вы можете сделать символическую ссылку . Это на самом деле так, как библиотеки, такие как 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
Затем запустите это:
$ mruby mandelbrot.rb
Вы можете заметить, что в mruby он работает быстрее, чем в cruby, используя команду time
:
$ time mruby mandle.rb
$ time ruby mandle.rb
Это связано со скоростью mruby в вычислениях с плавающей запятой. Реализация mruby построена не для скорости, а для размера. Если это происходит быстрее в нескольких областях, это просто счастливое совпадение. Мэтт проделал хорошую работу с mruby, включая его начало работы с mruby guide.
Завершение
Возможно, вы начинаете мечтать о всех микроконтроллерах, или о мозговых штурмах lego, которые вы собираетесь взломать с помощью mruby, или, может быть, вы просто счастливы, что знаете mruby лучше. В любом случае, надеюсь, вы оцените всю работу по компиляции и упаковке двоичных файлов для работы в различных системах и работу PATH
. Запуск mruby локально — это только начало, от вас зависит, как создать встроенную программу-убийцу. Поскольку mruby должен бегать где угодно, вы ограничены только своим воображением. Мы можем запустить mruby на любой системе, большой или маленькой, не было бы здорово, если бы мы могли скомпилировать ее для запуска на Heroku? Может быть, мы сохраним это на следующей неделе …