У меня богатый опыт использования swig. SWIG утверждает, что это быстрое решение для упаковки вещей. Но в реальной жизни ...
Минусы:
SWIG разработан, чтобы быть общим, для всех и для 20+ языков. Как правило, это приводит к недостаткам:
- требуется настройка (шаблоны SWIG .i), иногда это сложно,
- отсутствие обработки некоторых особых случаев (см. свойства python далее),
- недостаточная производительность для некоторых языков.
Минусы Python:
1) Несоответствие стиля кода . C ++ и python имеют очень разные стили кода (это очевидно, конечно), возможности быстрого превращения целевого кода в Pythonish очень ограничены. В качестве примера, это то, что нужно создавать свойства из методов получения и установки. Смотрите этот вопрос & 1018 *
2) Отсутствие широкого сообщества . У SWIG есть хорошая документация. Но если кто-то поймал то, чего нет в документации, информации вообще нет. Ни блоги, ни поиск в Google не помогают. Поэтому в таких случаях приходится копать сгенерированный SWIG-код ... Это ужасно, я бы сказал ...
Плюсы:
В простых случаях это действительно быстро, легко и просто
Если вы создали файлы интерфейса swig один раз, вы можете перенести этот код C ++ на ЛЮБОЙ из 20+ языков (!!!).
Одна большая проблема SWIG - это производительность. Начиная с версии 2.04 SWIG включает флаг «-builtin», который делает SWIG даже быстрее, чем другие автоматизированные способы упаковки. По крайней мере некоторые тесты показывают это.
Когда ИСПОЛЬЗОВАТЬ SWIG?
Итак, я пришел к выводу о двух случаях, когда можно использовать глоток:
2) Если нужно обернуть код C ++ для нескольких языков . Или, если потенциально может быть время, когда нужно распространять код на несколько языков. Использование SWIG надежно в этом случае.
1) Если нужно быстро обернуть всего несколько функций из некоторой библиотеки C ++ для конечного использования.
Живой опыт
Обновление :
Прошло полтора года, как мы конвертировали нашу библиотеку с помощью SWIG.
Сначала мы сделали версию на Python. Было несколько моментов, когда у нас были проблемы с SWIG - это правда. Но сейчас мы расширили нашу библиотеку до Java и .NET. Таким образом, у нас есть 3 языка с 1 SWIG. И я мог бы сказать, что SWIG качает с точки зрения экономии МНОГО времени.
Обновление 2 :
Уже два года мы используем SWIG для этой библиотеки. SWIG интегрирован в нашу систему сборки. Недавно у нас было серьезное изменение API библиотеки C ++. SWIG работал отлично. Единственное, что нам нужно было сделать, это добавить несколько% rename к файлам .i, чтобы наш CppCamelStyleFunctions()
теперь looks_more_pythonish
в python. Сначала меня беспокоили некоторые проблемы, которые могли возникнуть, но ничего не пошло не так. Это было прекрасно. Всего несколько правок и все распространено на 3 языках. Теперь я уверен, что это было хорошим решением использовать SWIG в нашем случае.
Обновление 3 :
Уже более 3 лет мы используем SWIG для нашей библиотеки. Основные изменения : часть Python полностью переписана на чистом Python. Причина в том, что Python сейчас используется для большинства приложений нашей библиотеки. Даже если версия на чистом Python работает медленнее, чем упаковка C ++, пользователям удобнее работать с чистым Python, не борясь с нативными библиотеками.
SWIG все еще используется для версий .NET и Java.
Главный вопрос здесь: «Будем ли мы использовать SWIG для Python, если мы начнем проект с самого начала?». Мы будем! SWIG позволил нам быстро распространять наш продукт на многих языках. Это работало в течение определенного периода времени, что дало нам возможность лучше понять требования наших пользователей.