Подтвердить что ты не робот

Заменить С++ go + swig

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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