заменить с ++ на go + swig - PullRequest
       19

заменить с ++ на go + swig

13 голосов
/ 09 января 2012

Я недавно задал этот вопрос https://softwareengineering.stackexchange.com/questions/129076/go-instead-of-c-c-with-cgo и получил очень интересную информацию. Однако в моем вопросе есть ошибка: я предположил, что cgo может также использоваться для доступа к коду c ++, но это невозможно. Вместо этого вам нужно использовать SWIG.

Go faq говорит: «Программа cgo предоставляет механизм для« интерфейса внешних функций », позволяющий безопасно вызывать библиотеки C из кода Go. SWIG расширяет эту возможность для библиотек C ++».

мой вопрос: Можно ли получить доступ к высокоуровневым средам C ++, таким как QT, с помощью SWIG + Go и получить продуктивность? Я хотел бы использовать Go в качестве «языка сценариев» для использования библиотек c ++.

У вас есть какой-нибудь опыт работы с глотком? Есть ли подводные камни, о которых я должен знать?

Обновление / Ответ : я тоже об этом спрашивал через IRC и думаю, что вопрос решен:

SWIG - довольно чистый способ сопряжения кода C ++ с другими языками. К сожалению, сопоставление типов с ++ с чем-то вроде go может быть очень сложным, и в большинстве случаев вы должны сами определять отображение. Это означает, что SWIG - это хороший способ использовать существующую кодовую базу для повторного использования уже написанных алгоритмов. Однако отображение библиотеки типа Qt to go займет у вас много времени. Имейте в виду, что это возможно, но вы не хотите этого делать.

Те из вас, кто пришел сюда для программирования на графическом интерфейсе с помощью go, могут захотеть попробовать go-gtk или версию wxWidgets go.

Ответы [ 2 ]

5 голосов
/ 14 марта 2012

Возможно ли это? Да.

Можно ли это сделать за достаточно короткий промежуток времени? Нет.

Если вы вернетесь и посмотрите на другие проекты, которые взяли большие фреймворки и попытались поместить на него слой абстракции, вы обнаружите, что большинство из них «неполны». Вы, вероятно, можете неплохо начать работу и получить некоторые начальные оболочки, но обычно даже работа по разрешению простых случаев требует времени, когда имеется много базового кода для переноса, даже с помощью автоматизированных инструментов (которые помогают, но никогда не полное решение). А потом ... вы получите неприятные оставшиеся 10%, которые унесут вас навсегда (хорошо, действительно очень долго). А затем подумайте о том, как это меняется цель в первую очередь. Например, Qt собирается выпустить следующую основную переписку.

В общем, безопаснее всего придерживаться языка фреймворка, для которого он был разработан. Хотя у многих есть языковые расширения внутри самого проекта. Например, для Qt вы должны проверить QML, который обеспечивает (помимо прочего) привязку javascript к Qt. Вроде, как бы, что-то вроде. Но это может удовлетворить ваши требования "сценариев".

2 голосов
/ 17 сентября 2013

Соответствующее обновление по этой проблеме: теперь возможно взаимодействовать с C ++, используя cgo с этим CL , который объединен для Go 1.2.Однако он ограничен вызовами функций, подобных C, а классы, методы и полезности C ++ не поддерживаются (пока, я надеюсь).

...