Это нечто более чем вероятно появилось в прошлом, и я нашел хорошие ресурсы и описания этого в Интернете, но ничего не было очень окончательным. Есть ли способ обернуть C++ вокруг расширения C Ruby, чтобы C++ и Ruby могли "общаться"? Простая причина этого заключается в том, что, хотя C-расширения в Ruby могут вести себя значительно быстрее в сценариях большого масштаба, чем Ruby, C++ может выполнять еще быстрее, чем C. Другая причина заключается в том, что многие люди, похоже, учатся C++ в отличие от C и более знакомы с ним. Если вы являетесь C++ профессионалом, то C будет куском пирога, чтобы учиться.
Любая помощь очень ценится!
Это возможно, но вы должны быть осторожны со многими вещами. В частности, исключения.
Ruby обрабатывает исключения с помощью setjmp/longjmp. Это позволяет стеку любой функции C++ быть освобожденным без вызова какого-либо локального деструктора вообще. В качестве обходного пути вам нужно будет избавиться от всех возможных вызовов, которые могут вызвать ошибки, бесплатно освободите ваш стек (возможно, используя исключение C++) и поднимите их снова.
Точно так же есть много вызовов в C++ stdlib, которые могут генерировать исключения (даже new
операторы), вы не можете позволить им войти в мир рубинов, иначе что-то грозит смертельно. Вы должны поймать их всех и поднять как рубиновые исключения.
Эта игра преобразования, скорее всего, замедлит ваш код и сделает интерфейс сложным для написания и понимания. Возможно, есть и другие проблемы. Выявление класса с цепочкой наследования может быть сложным.
Взгляните на рис. Это может помочь вам.
extern 'C'
.
extern "C"
. Но по причинам, которые делают это, я думаю, что вы полностью ошибаетесь. Нет никаких оснований считать, что C ++ будет «быстрее» (в каком бы значении вы ни дали этот термин), чем C. Это всего лишь один из городских мифов. Напротив, если вы не позаботитесь, у вас легко будет больше косвенных указаний в C ++ и, следовательно, больше накладных расходов. И вы также ошибаетесь, думая, что профессионалы C ++ как таковые «легко» напишут хороший C-код. Это два разных языка со своими особенностями.