Можно ли обернуть C ++ вокруг расширения Ruby C?

0

Это нечто более чем вероятно появилось в прошлом, и я нашел хорошие ресурсы и описания этого в Интернете, но ничего не было очень окончательным. Есть ли способ обернуть C++ вокруг расширения C Ruby, чтобы C++ и Ruby могли "общаться"? Простая причина этого заключается в том, что, хотя C-расширения в Ruby могут вести себя значительно быстрее в сценариях большого масштаба, чем Ruby, C++ может выполнять еще быстрее, чем C. Другая причина заключается в том, что многие люди, похоже, учатся C++ в отличие от C и более знакомы с ним. Если вы являетесь C++ профессионалом, то C будет куском пирога, чтобы учиться.

Любая помощь очень ценится!

  • 5
    Не должно быть никаких проблем, если вы объявляете свои функции C ++ как extern "C" . Но по причинам, которые делают это, я думаю, что вы полностью ошибаетесь. Нет никаких оснований считать, что C ++ будет «быстрее» (в каком бы значении вы ни дали этот термин), чем C. Это всего лишь один из городских мифов. Напротив, если вы не позаботитесь, у вас легко будет больше косвенных указаний в C ++ и, следовательно, больше накладных расходов. И вы также ошибаетесь, думая, что профессионалы C ++ как таковые «легко» напишут хороший C-код. Это два разных языка со своими особенностями.
  • 0
    Ну, эй, я не пытаюсь говорить или в первую очередь выражать, что эффективность - это то, что меня интересует или наступает на чьи-то пальцы. Мне просто любопытно, если это возможно! :)
Показать ещё 1 комментарий
Теги:
wrapper

1 ответ

1

Это возможно, но вы должны быть осторожны со многими вещами. В частности, исключения.

Ruby обрабатывает исключения с помощью setjmp/longjmp. Это позволяет стеку любой функции C++ быть освобожденным без вызова какого-либо локального деструктора вообще. В качестве обходного пути вам нужно будет избавиться от всех возможных вызовов, которые могут вызвать ошибки, бесплатно освободите ваш стек (возможно, используя исключение C++) и поднимите их снова.

Точно так же есть много вызовов в C++ stdlib, которые могут генерировать исключения (даже new операторы), вы не можете позволить им войти в мир рубинов, иначе что-то грозит смертельно. Вы должны поймать их всех и поднять как рубиновые исключения.

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

Взгляните на рис. Это может помочь вам.

  • 0
    Очень круто! Я понял, что избыток вещей может пойти не так при взаимодействии, выполняя что-то подобное, поэтому я не пытался подразумевать, что это будет для повышения производительности. На самом деле я столкнулся с рисом, когда исследовал это, и именно на это я думал @Jens Gustedt, когда рекомендовал вариант extern 'C' .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню