2012-05-01 3 views
1

В чем заключаются основные отличия между выполнением привязок Ruby C и Ruby для системных вызовов?Ruby C Bindings против Ruby Wrapper для системных вызовов

К моему вопросу в контексте, я рассматриваю возможность полнофункционального управления функциями управления Git в приложении Ruby on Rails. При подходе к этой задаче я не понимаю, как думать о конвейере выполнения программы Ruby, которая включает в себя библиотеку, реализованную с привязками Ruby C, такую ​​как yajl-ruby, против оболочки Ruby для системных вызовов, таких как git Ruby Gem.

ответ

4

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

Упаковщики аналогичны трубам UNIX - программы не знают друг о друге и не взаимодействуют друг с другом через текстовый интерфейс. Тем не менее, свободная муфта поставляется с ценой. Системные вызовы - дорогостоящие операции и значительно замедляют ваше приложение.

Вот почему привязки отличные. Поскольку они используют интерфейс программирования библиотеки, накладные расходы значительно сокращаются. У GitHub была своя обертка git и speed was issue that led them to implement git in Ruby.

Они сделали это сами, потому что это трудно сделать привязки для git. Он не предназначен для использования в качестве библиотеки. Очень сложно вызвать его функции напрямую, так как он вызывает die() почти любую ошибку.

Потребность в надлежащей библиотеке git привела к развитию libgit2. Он даже поставляется с Ruby bindings! Поскольку вы хотите интегрировать функциональность git с вашим приложением, вы должны это проверить.

+1

Благодарим вас за тщательный, хорошо написанный ответ! [Ruby-wrapper for 'git'] (https://rubygems.org/gems/git) и [' libgit2'Ruby bindings] (https://github.com/libgit2/rugged) обе не нужны [ git subodule'] (http://git-scm.com/book/en/Git-Tools-Submodules), но вы помогли мне разобраться в различиях между ними. Я считаю, что я начну работать над расширением [Ruby wrapper for git'] (https://rubygems.org/gems/git), чтобы использовать ['git submodule'] (http://git-scm.com/book/en/Git-Tools-Submodules), поскольку он, вероятно, имеет более низкие барьеры для реализации. – rudolph9

Смежные вопросы