СВИГ
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Оригинальный автор(ы) | Дэвид М. Бизли |
---|---|
Разработчик(и) | SWIG-разработчики |
Первоначальный выпуск | февраль 1996 г [1] |
Стабильная версия | 4.2.1 [2] ![]() |
Репозиторий | |
Написано в | С , С++ |
Лицензия | лицензия GPLv3 |
Веб-сайт | глоток |
Упрощенный генератор оболочек и интерфейсов ( SWIG ) — это программный инструмент с открытым исходным кодом, используемый для соединения компьютерных программ или библиотек, написанных на C или C ++, с языками сценариев, такими как Lua , Perl , PHP , Python , R , Ruby , Tcl и другими языками. такие реализации, как C# , Java , JavaScript , Go , D , OCaml , Octave , Scilab и Scheme . Вывод также может быть в форме XML .
Функция [ править ]
Цель состоит в том, чтобы позволить вызывать собственные функции (написанные на C или C++) из других языков программирования, передавать этим функциям сложные типы данных, предотвращать ненадлежащее освобождение памяти, наследовать классы объектов между языками и т. д. Программист пишет файл интерфейса, содержащий список функций C/C++, которые должны быть видны интерпретатору. SWIG скомпилирует файл интерфейса и сгенерирует код на обычном C/C++ и целевом языке программирования. SWIG сгенерирует код преобразования для функций с простыми аргументами; код преобразования для сложных типов аргументов должен быть написан программистом. Инструмент SWIG создает исходный код , который обеспечивает связь между C/C++ и целевым языком. В зависимости от языка этот клей бывает двух видов:
- общая библиотека , к которой существующий интерпретатор может подключиться как к некоторой форме модуля расширения, или
- общая библиотека, которую можно связать с другими программами, скомпилированными на целевом языке (например, с использованием собственного интерфейса Java (JNI) в Java).
- исходный код общей динамической библиотеки , который должен быть скомпилирован и динамически загружен (например, собственные расширения Node.js)
SWIG не используется для вызова интерпретируемых функций из собственного кода; это должно быть сделано программистом вручную.
Пример [ править ]
SWIG оборачивает простые объявления C, создавая интерфейс, который точно соответствует тому, как объявления будут использоваться в программе C. Например, рассмотрим следующий файл интерфейса: [3]
%module example
%inline %{
extern double sin(double x);
extern int strcmp(const char *, const char *);
extern int Foo;
%}
#define STATUS 50
#define VERSION "1.1"
В этом файле есть две функции sin()
и strcmp()
, глобальная переменная Foo
и две константы STATUS
и VERSION
. Когда SWIG создает модуль расширения, эти объявления доступны как функции языка сценариев, переменные и константы соответственно. В Питоне:
>>> example.sin(3)
0.141120008
>>> example.strcmp('Dave','Mike')
-1
>>> print(example.cvar.Foo)
42
>>> print(example.STATUS)
50
>>> print(example.VERSION)
1.1
Цель [ править ]
Есть две основные причины встроить механизм сценариев в существующую программу на C/C++:
- Тогда программу можно будет настроить гораздо быстрее, используя язык сценариев вместо C/C++ . Механизм сценариев может даже быть доступен конечному пользователю, чтобы он мог автоматизировать общие задачи путем написания сценариев.
- Даже если конечный продукт не будет содержать скриптовый движок, он, тем не менее, может быть очень полезен для написания тестовых сценариев.
Существует несколько причин для создания динамических библиотек, которые можно загружать в существующие интерпретаторы, в том числе:
- Обеспечьте доступ к библиотеке C/C++ , не имеющей эквивалента на языке сценариев.
- Сначала напишите всю программу на языке сценариев, а после профилирования перепишите критичный к производительности код на C или C++.
История [ править ]
SWIG написан на C и C++ и доступен для общественности с февраля 1996 года. Первоначальным автором и основным разработчиком был Дэвид М. Бизли, который разработал SWIG, работая аспирантом в Национальной лаборатории Лос-Аламоса и Университете Юты , а также во время работы над SWIG. факультет Чикагского университета . В настоящее время разработку поддерживает активная группа волонтеров во главе с Уильямом Фултоном. SWIG выпущен под лицензией GNU General Public License .
Google Summer of Code [ править ]
SWIG успешно участвовал в Google Summer of Code в 2008, 2009, 2012 годах. В 2008 году SWIG получила четыре слота. Хаоюй Бай проводил лето над бэкэндом SWIG Python 3.0, Ян Джезабек работал над поддержкой создания оболочек COM , Шерил Фойл работала над «Переводчиком комментариев» для SWIG, а Мацей Дрвал работал над бэкэндом C. В 2009 году SWIG снова приняла участие в Google Summer of Code. На этот раз в нем приняли участие четыре студента. Баозэн Дин работал над модулем Scilab . Матевз Ековец уделил время функциям C++0x . Ашиш Шарма провел лето за модулем Objective-C , Миклош Вайна — за PHP-директорами.
В 2012 году SWIG приняла участие в Google Summer of Code. На этот раз четверо из пяти студентов успешно справились с проектом. Лейф Миддельшульте работал над модулем целевого языка C. Свати Шарма усовершенствовал модуль Objective-C. Неха Наранг добавила новый модуль по JavaScript. Дмитрий Кабак работал над документацией исходного кода и Doxygen комментариями .
Альтернативы [ править ]
Для Python аналогичную функциональность предлагают SIP , Pybind11 и библиотека Boost.python компании Boost .
Проекты с использованием SWIG [ править ]
- ZXID (лицензия Apache, версия 2.0)
- Symlabs SFIS (коммерческий)
- LLDB
- GNU Radio до (включительно) версии 3.8.xx; более поздние версии используют Pybind11 [4]
- Ксапиан
- Тензорфлоу
- Апач СИНГА
- QuantLib
- Бабельтрасс
См. также [ править ]
- Языковая привязка
- Интерфейс внешних функций (FFI)
- Соглашение о вызовах
- Искажение имени
- Интерфейс прикладного программирования
- Бинарный интерфейс приложения
- Сравнение виртуальных машин приложений
- Функция-обертка
- GIWS для противоположности SWIG: вызов Java из C/C++
Ссылки [ править ]
- ^ «История СВИГа» .
- ^ «Релиз v4.2.1» .
- ^ «Основы СВИГ» .
- ^ Мюллер, Маркус. «Журнал изменений для GNU Radio 3.9.0.0» . Гитхаб .
Дальнейшее чтение [ править ]
- Статья « Раскройте внутренний API вашей программы на C/C++ с помощью быстрого SWIG ». Виктора Волкмана
- Статья « Расширения Python в C++ с использованием SWIG » Михаэля Фетша
- Презентация « Обзор приложения для openSUSE » Клауса Кемпфа