LINUX.ORG.RU

Статья о том, как связывать код на C с кодом на Ruby.


0

0

"Существует по меньшей мере 4 способа "скрестить" код на Ruby и C В этой заметке будет освещено несколько способов интеграции кода, написанного на C, с кодом на Ruby в целях расширения функциональности Ruby и оптимизации вычислений. Также будет описан еще ряд вопросов, возникающих при решении подобных задач."

http://maxidoors.ru/articles/2006/10/...

anonymous

Проверено: anonymous_incognito ()

Ответ на: комментарий от geekkoo

> printf - не показатель. Все просто здорово, пока не нужно
возвращать значения в вызывающий язык. А вот тогда и начинается
самое интересное...

Ничего там интересного, просто иногда надо явно указывать типы: =)

libс = ctypes.cdll('libc.so.6')
libc.strcat.restype = c_char_p
print libc.strcat("aaa", "bbb")

ero-sennin ★★
()
Ответ на: комментарий от anonymous

> А вот это не оно разве: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html Смотреть "Objects and Attributes".

Не-а. :) Это не свойства, а только имитация, пусть и неплохая. Были бы полноценные свойства, неотличимые от атрибутов, не надо было бы весь этот огород городить с attr_getter/attr_setter.

ero-sennin ★★
()
Ответ на: комментарий от ero-sennin

> Не-а. :) Это не свойства, а только имитация, пусть и неплохая. Были бы полноценные свойства, неотличимые от атрибутов, не надо было бы весь этот огород городить с attr_getter/attr_setter.

ну да. а если хочется установку свойства/атрибута через свой код пропустить? да, я знаю как это в питоне делается. синтаксически -- в руби короче и понятнее. практически -- никакой разницы.

dmiceman ★★★★★
()
Ответ на: комментарий от laser_linux

> Насколько мне известно, Руби используется в основном для Web. Насколько он хорош для десктопных приложений?

весьма. под винду -- ruby + wxWidgets + exerb и получится весьма такой транспортабельный exe-шник. под линукс лучше наверное на qtruby/korundum смотреть. насколько я понимаю текущую политическую ситуацию, korundum будет неотъемлемой частью kde4.

dmiceman ★★★★★
()
Ответ на: комментарий от Linfan

> Вдумайтесь в словосочетание Foreign Function Interface. > Если вам это незнакомо (судя по-всему) то привожу пример: > from ctypes import * > libc=cdll("libc.so") > libc.printf("Hello, %S", u"World!")

я надеюсь это не наезд на ruby в смысле того что там такого нет? :-) оно есть.

dmiceman ★★★★★
()
Ответ на: комментарий от dmiceman

> я надеюсь это не наезд на ruby в смысле того что там такого нет? :-) оно есть.

И не просто есть, это, как я написал, самый убогий из существующих механизмов. Только человек, никогда ничего не писавший, может считать FFI чем-то удобным.

max_lapshin ★★★★★
()

Из статьи: "Информация для людей, не знающих, что такое Windows. Это морально и технически устаревшая операционная система. Из важных особенностей: не имеет в штатной поставке компилятора."

Автор - клинический идиот.

anonymous
()
Ответ на: комментарий от geekkoo

Хм... мсье думает, шо в MIT и RedHat полные дауны сидят? ;) Естественно в ctypes продуман маппинг типов (есть правда недоработки, с массивами напр., но если сильно жмет - самостоятельно дописать можно) и предусмотрен callback. А printf - это просто для наглядности. Гляньте на сайте jniwrapper'а (там есть демки, только триал получить надо), че можно вытворять с такой технологией, и вы поймете, что сабж этого треда сильно устарел по жизни. Посмотреть советую WinPack demo. Подразумевается, что вы в курсе жабьих возможностей на десктопе.

Linfan ★★★★★
()
Ответ на: комментарий от max_lapshin

такс, а ну ка сцылочку на это "убожество" - боюсь, что мы говорим о разных вещах. Насколько я знаю, аналогов ctypes у рубироидов нет. Хотя может я ошибаюсь? ;)

Linfan ★★★★★
()
Ответ на: комментарий от dmiceman

> ну да. а если хочется установку свойства/атрибута через свой код пропустить? да, я знаю как это в питоне делается. синтаксически -- в руби короче и понятнее. практически -- никакой разницы

Практически разница в том, что в руби приходится создавать пустые геттеры-сеттеры, а в питоне этих костылей нет.

ero-sennin ★★
()
Ответ на: комментарий от max_lapshin

>Только человек, никогда ничего не писавший, может считать FFI чем-то удобным.

Молодой человек не ляпайте ерунды - тогда и краснеть надо будет не так часто :) ctypes - это УПРОЩЕНИЕ работы с нативом, причем зверски. Или вы считаете, что написание экстеншна на нативе намного проще, чем несколько строк на Питоне?

Linfan ★★★★★
()
Ответ на: комментарий от Linfan

> Насколько я знаю, аналогов ctypes у рубироидов нет. Хотя может я ошибаюсь? ;)

ты ошибаешься.

> Или вы считаете, что написание экстеншна на нативе намного проще, чем несколько строк на Питоне?

зачастую -- да. впрочем в руби действительно оччень простой C-шный интерфейс для написания расширений. может поэтому у меня такое впечатление сложилось. как с этим в питоне -- не знаю.

dmiceman ★★★★★
()
Ответ на: комментарий от ero-sennin

> Практически разница в том, что в руби приходится создавать пустые геттеры-сеттеры, а в питоне этих костылей нет.

да как бы не костыли это. а различать что наружу торчит а что нет -- всегда хорошо.

dmiceman ★★★★★
()
Ответ на: комментарий от dmiceman

Гуд, пример кода на руби в студию, аналогичный тому, что я привел чуть выше! И посмотрим, что вы имеете ввиду.

Linfan ★★★★★
()
Ответ на: комментарий от dmiceman

> да как бы не костыли это.

Во-во, конечно, сейчас будете говорить, что пустые геттеры и сеттеры - это тру ООП. А я говорю, что вам нужен простой атрибут типа public. С возможностью потом заменить его свойством с аксессорами. В питоне такая возможность есть, а в руби - нет. Поэтому рубийное решение - кастыль и плод искалеченного C++ разума. :-P

ero-sennin ★★
()
Ответ на: комментарий от Linfan

Функция вернула тебе void указатаель и крутись с ним как знаешь. И еще не известно кто этим указателем распоряжается (в питоне кажеца есть gc?). Вот и выходит, что ctype годится для простых типов, каковые возможности в том или ином виде присутствуют практически во всех интерпретируемых языках.

geekkoo
()
Ответ на: комментарий от ero-sennin

> Во-во, конечно, сейчас будете говорить, что пустые геттеры и сеттеры - это тру ООП

да как угодно как бы :-) я не настаиваю..

dmiceman ★★★★★
()
Ответ на: комментарий от ero-sennin

> А я говорю, что вам нужен простой атрибут типа public. С возможностью потом заменить его свойством с аксессорами. В питоне такая возможность есть, а в руби - нет.

Я чего-то не понимаю о чём речь. Можно примерчики кода на Python и Ruby?

anonymous
()
Ответ на: комментарий от anonymous

> Я чего-то не понимаю о чём речь. Можно примерчики кода на Python и Ruby?

да нуу.. это на руби писать длинно :-)

dmiceman ★★★★★
()
Ответ на: комментарий от dmiceman

ну так напиши на Питоне, посмотрим что там такого сверхкороткого можно сделать, что очень длинно получается в руби

anonymous
()
Ответ на: комментарий от anonymous

> не, пока еще можно отгребать 2000$ исклюсительно на джаве (плюс типичный инструментарии типа баша-перла)

Ну столько и на питоне отгребать не проблема.. И применение этому питону есть. Если даже на 100% задачу на нем не решить - для прототипирования идеальная вещь. А раби в России кому-нибудь вообще нужен? Имхо с ним проблема найти не просто достойную работу, а какую-нибудь вообще..

anonymous
()
Ответ на: комментарий от anonymous

> А раби в России кому-нибудь вообще нужен?

Тоже мне критерий, тут и Lisp нахрен никому не нужен, ну разве что в универе каком-нибудь. В Японию надо ехать, там руби рулит со страшной силой, национальный язык программирования можно сказать.

Sun-ch
()
Ответ на: комментарий от Sun-ch

> В Японию надо ехать, там руби рулит со страшной силой, национальный язык программирования можно сказать.

Вот только там жрать нечего и жить негде. :)

ero-sennin ★★
()
Ответ на: комментарий от redvasily

Наверное, имеется в виду высокая плотность населения и преобладание в пище морепродуктов.

Еще можно добавить - чтобы нормально там жить и работать, нужно знать японский.

anonymous
()
Ответ на: комментарий от redvasily

Ну, в смысле, у нас любой программер не сильно напрягаясь зарабатывает достаточно, чтобы нормально питаться и жить в нормальной квартире (хотя бы снимать). А в Японии ты будешь работать больше, питаться сплошным рисом и растворимым раменом, а жить в комнатушке без душа и отопления. :)

ero-sennin ★★
()

в ruby есть что-то типа java-policy файлов которыми можно запретить выполнение определенных действий рантаймом?

r ★★★★★
()
Ответ на: комментарий от redvasily

> Работал в Японии?

Один знакомый туда уехал, рассказывал. :) А через два года смотался оттуда в Новую Зеландию, теперь доволен. :)

ero-sennin ★★
()
Ответ на: комментарий от dmiceman

Буееее... Теперь я вас поддерживаю - в руби эта технология реализована ОТВРАТНО и синтаксис кошмарный! Проще экстеншн на сях набоянить ;)

Linfan ★★★★★
()
Ответ на: комментарий от geekkoo

"Вот и выходит, что ctype годится для простых типов" - да не правильно у вас выходит. Работать с pointer void наоборот бывает удобно. Например в ImageMagick проще не разбирать что из себя представляет MagickWand (а в потрохах этой структуры напихана туева туча структур со множественной вложенностью) а юзать его as is - получил при зачитке изображения и скармливай потом разным маджиковским функциям. Дестроить тоже нужно нативной функцией. А питонский объект питон сам обработает.

Linfan ★★★★★
()
Ответ на: комментарий от ero-sennin

> А вот через лисповские исходники продираться бывает охх тяжко, особенно наутро,

Ты наверное с будуна байткод компилированый пытался читать. Потому, если уж лисповые исходники тебе нечитаемые, чё уж про питон говорить, если там даже скопкоф недоделали, не говоря уж про макросы и прочее.

bugmaker ★★★★☆
()
Ответ на: комментарий от anonymous

> Из статьи: "Информация для людей, не знающих, что такое Windows. Это морально и технически устаревшая операционная система. Из важных особенностей: не имеет в штатной поставке компилятора."

> Автор - клинический идиот.

Да хуже. Это надо же, венду воперационной системой назвать!

bugmaker ★★★★☆
()
Ответ на: комментарий от ero-sennin

Ну ты и трепло.

> А я говорю, что вам нужен простой атрибут типа public. С возможностью потом заменить его свойством с аксессорами. В питоне такая возможность есть, а в руби - нет.

Стиль Питона. Все переменные паблик, все открыты. Я забываю что один атрибут мне нужно сделать закрытым, потому что ведь все нахх открыто. И провтыкиваю, что в каком-то месте к этому атрибуту идет доступ и меняется значение.

Стиль Руби. Все изначально закрыто. Ты задаешь сам права доступа к классу с помощью attr_accessor, attr_reader, attr_writter. Ты явно прописываешь что открыто и что закрыто.

Это просто другой подход. Он более безопасен. Он не лучше и не хуже он другой, поэтому не завирайся. Какая в жопу разница что это паблик переменная или аккссесор?

Cris
()
Ответ на: комментарий от Selecter

> Например, мне очень не хватает attr_accessor в том же php5.

Они есть. Ты делай все по дефолту открытым и если нужно сделать скрытым, используй магические методы для перегрузки доступа. Это принцип аналогичынй питоновскому.

Про недостаток подхода я уже писал выше.

Cris
()
Ответ на: комментарий от Cris

> Какая в жопу разница что это паблик переменная или аккссесор?

Уже устал повторять, блин. Аксессор здесь избыточная сущность (кастыль). В этом и разница.

ero-sennin ★★
()
Ответ на: комментарий от ero-sennin

> Уже устал повторять, блин. Аксессор здесь избыточная сущность (кастыль). В этом и разница.

Чес. И субъективщина. Атрибуты закрыты для внешнего мира. Получается закрытая система. Взаимодействие с ней осуществляется Посредством интерфейса. Интерфейс реализуется методами.

Даже не так. Нееет. Не так.

У меня есть класс. Я хочу чтобы ты написал в Питоне класс, но чтобы доступ к атрибутам класса был закрыт. Что? Ты пишешь подчеркивание!!! Да ты же лишнюю сущность, гад, плодишь! Нет? Ой, я перепутал, не нужно было делать эту переменную закрытой. Открой ее. Что приходится лазить по всему классу подчеркивание убирать? Ну ничего, бывает.

Ты переопределяешь доступ через пропертис?? И снова плодишь лишнюю сущность!

Ты что, не понял, что это __зеркальная__ ситуация? Питон и ПХП дает возможность сократить в одном случае, а Руби в другом. Разница в подходе и ни один из них не лучше другого.

Поэтому сядь и придумай что-то стоящее...

Cris
()
Ответ на: комментарий от Cris

> Ты что, не понял, что это __зеркальная__ ситуация? Питон и ПХП дает возможность сократить в одном случае, а Руби в другом. Разница в подходе и ни один из них не лучше другого.

Ну вообще-то, Питон позволяет сократить в обеих случаях: просто не использовать закрытые атрибуты. :D А хак с подчёркиванием на то и хак, чтоб не пользоваться им без сильной нужды. Если интересно, полистай исходники разных питоновских программ и библиотек и обрати внимание на то, как редко эти "закрытые переменные" там встречаются.

> Даже не так. Нееет. Не так.

> У меня есть класс. Я хочу чтобы ты написал в Питоне класс, но чтобы доступ к атрибутам класса был закрыт. Что? Ты пишешь подчеркивание!!! Да ты же лишнюю сущность, гад, плодишь! Нет? Ой, я перепутал, не нужно было делать эту переменную закрытой. Открой ее. Что приходится лазить по всему классу подчеркивание убирать? Ну ничего, бывает.

Bicycle Repair Man наш друг, а Руби и тут обламывается. :P

ero-sennin ★★
()
Ответ на: комментарий от ero-sennin

> Ну вообще-то, Питон позволяет сократить в обеих случаях: просто не использовать закрытые атрибуты. :D

Есть объект человек у него есть параметр давление крови и я __не_хочу__, чтобы этот объект-человек умер из-за того что параметр давление поменяется вне объекта? Но внутри объекта мне этот параметр нужен! Ну! Не использовать закрытые атрибуты?

Объясню просто. В Руби ты просто используешь параметр @pressure. Лишних сущностей не плодится. В Питоне создаешь проперти. Плодится лишняя сущность.

Вот питон и слил :p. Скажу больше. Когда все торчит наружу, ошибиться в доступе гораздо легче, чем когда доступ задается явно. :D Вот питон слил и во второй раз ;).

Cris
()
Ответ на: комментарий от Cris

вот пардон что не учавствую, но таки вы какие-то странные вещи обсуждаете. у руби вообще-то серъезные проблемы есть, от которых он сливает существенно, а вы все к каким-то атрибутам пропертям прицепились..

dmiceman ★★★★★
()
Ответ на: комментарий от ero-sennin

>> Что приходится лазить по всему классу подчеркивание убирать? Ну ничего, бывает.

> Bicycle Repair Man наш друг, а Руби и тут обламывается

А можно о BRM подробнее?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> А можно о BRM подробнее?

Рефакторилка такая. :)

import bike
bike.refactor.rename.rename('main.py', lineno=3, col=1, newname='blablabla')

Эту штуку умеет исользовать Emacs (правда, сам не пробовал),
Vim (правда, изрядно глючит) и Eric (в нём вроде всё работает
как надо, см. менюшку Refactoring).

ero-sennin ★★
()
Ответ на: комментарий от ero-sennin

>> А можно о BRM подробнее?

> Рефакторилка такая. :)

Это я знаю :) Он входит и в PyDev (хотя не пользуюсь его рефакторингом). Я хотел спросить - как впечатления от использования? Он код не портит? Работает предсказуемо?

tailgunner ★★★★★
()
Ответ на: комментарий от ero-sennin

Вопрос - к WingIDE нет случаем опыта прикручивания этой рефакторилки?

Linfan ★★★★★
()
Ответ на: комментарий от bugmaker

>Ты наверное с будуна байткод компилированый пытался читать. Потому,
если уж лисповые исходники тебе нечитаемые, чё уж про питон говорить,
если там даже скопкоф недоделали, не говоря уж про макросы и прочее.


Мне больше вот такая байда нравится:

(defmacro dm2b (&whole form a (&whole b (c . d) &optional (e 5))
&body f &environment env)
``(,',form ,,a ,',b ,',(macroexpand c env) ,',d ,',e ,',f))

Слабо сказать, что получится после вызова

(macroexpand '(dm2b x1 (((incf x2) x3 x4)) x5 x6))

?

По мне, так скомпилированный и то проще читать...

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.