SWIG
| 원저자 | 데이브 비즐리(Dave Beazley) |
|---|---|
| 개발자 | SWIG 개발자 |
| 발표일 | 1996년 2월[1] |
| 저장소 |
|
| 프로그래밍 언어 | C, C++ |
| 엔진 | |
| 운영 체제 | 크로스 플랫폼 |
| 라이선스 | GPL |
| 웹사이트 | swig |
SWIG(Simplified Wrapper and Interface Generator)는 C나 C++로 작성된 컴퓨터 프로그램이나 라이브러리들을 루아, 펄, PHP, 파이썬, R, 루비, Tcl과 같은 스크립트 언어 및 C 샤프, 자바, 자바스크립트, Go, 모듈라-3, OCaml, 옥타브, Scilab, 스킴 등의 다른 언어들과 연결하는데 사용하는 오픈 소스 소프트웨어 도구이다.
역사
SWIG는 C와 C++로 작성되어 있으며, 1996년 2월 이후로 일반에 공개되었다. 초기 개발자이자 주요 개발자는 데이브 비즐리이며, 로스 앨러모스 국립 연구소 및 유타 대학교에서 학부생으로 일하는 동안, 또 시카고 대학교에서 교수로 활동하는 동안 SWIG를 개발하였다. 개발은 현재 윌리엄 펄튼(William Fulton) 주도의 활발한 자발자들의 그룹에 의해 지원을 받고 있다. SWIG는 GNU GPL에 의거하여 출시되고 있다.
기능
다른 프로그래밍 언어가 C나 C++로 작성된 네이티브 함수의 호출을 허용하고, 복잡한 자료형을 해당 함수에 전달하고, 메모리를 부적절하게 해제하지 못하게 하며, 언어 간에 오브젝트 클래스를 상속할 수 있게 하는 것이 목적이다. 프로그래머는 C/C++ 함수의 목록이 포함된 인터페이스 파일을 작성하여 인터프리터에 보이게 한다. SWIG는 인터페이스를 컴파일한 다음 일반 C/C++ 및 대상 프로그래밍 언어를 발생시킨다. SWIG는 단순한 인수가 포함된 함수들을 위한 변환 코드를 만든다. 즉, 복잡한 인수형의 변환 코드는 프로그래머에 의해 작성되어야 한다. SWIG 도구는 C/C++과 대상 언어 간의 접착제(glue)를 제공하는 소스 코드를 만든다. 이 언어에 의존하여 이 접착제는 2가지 형태로 나타난다:
- 현존하는 인터프리터가 특정한 형태의 확장 모듈로 링크할 수 있는 공유 라이브러리
- 대상 언어로 컴파일된 다른 프로그램으로 링크할 수 있는 공유 라이브러리 (예를 들어 자바의 JNI, 자바 네이티브 인터페이스를 사용)
SWIG는 네이티브 코드에 의해 해석된 함수를 호출하기 위해 사용되지는 않는다. 즉, 프로그래머가 수동으로 완성해야 한다.
예
SWIG는 선언이 C 프로그램에서 사용되는 방식과 동일한 인터페이스를 작성함으로써 단순한 C 선언들을 래핑한다. 이를테면, 다음의 인터페이스 파일이 있다고 가정한다:[2]
%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++ 프로그램에서 스크립트 엔진을 임베드하는 주된 이유는 2가지가 있다:
- C/C++ 대신 스크립트 언어를 통해 프로그램을 훨씬 더 빠르게 개인화(customize)시킬 수 있다. 스크립트를 작성함으로써 공통 작업을 자동화될 수 있으므로 스크립트 엔진은 최종 사용자에게 노출될 수도 있다.
- 최종 제품이 스크립트 엔진을 포함하지 않는다고 하더라도 테스트 스크립트 작성에 매우 유용할 수 있다.
현존하는 인터프리터에 로드할 수 있는 동적 라이브러리를 만드는 이유가 몇 가지 있는데 다음을 포함한다:
- 스크립트 언어와 동등하지 않은 C/C++ 라이브러리로의 접근을 제공한다.
- 우선 스크립트 언어의 전반적인 프로그램을 작성하고 프로파일링을 거친 다음 성능에 많은 영향을 미치는 코드를 C나 C++로 재작성한다.
SWIG를 이용한 프로젝트
- ZXID
- Symlabs SFIS (상용)
- LLDB (디버거)
- GNU 라디오
- Xapian
- Armory
같이 보기
참고 문헌
- Article "Expose Your C/C++ Program's Internal API with a Quick SWIG 보관됨 2006-09-01 - 웨이백 머신" by Victor Volkman
- Article "Python Extensions In C++ Using SWIG" by Michael Fötsch
- Presentation "Application overview for openSUSE" by Klaus Kämpf
각주
외부 링크
- 모듈:Official_website 90번째 줄에서 Lua 오류: attempt to index field 'wikibase' (a nil value).
- 스크립트 오류가 있는 문서
- 웹아카이브 틀 웨이백 링크
- 위키데이터 속성 P18을 사용하는 문서
- 위키데이터 속성 P41을 사용하는 문서
- 위키데이터 속성 P94를 사용하는 문서
- 위키데이터 속성 P117을 사용하는 문서
- 위키데이터 속성 P154를 사용하는 문서
- 위키데이터 속성 P213을 사용하는 문서
- 위키데이터 속성 P227을 사용하는 문서
- 위키데이터 속성 P242를 사용하는 문서
- 위키데이터 속성 P244를 사용하는 문서
- 위키데이터 속성 P245를 사용하는 문서
- 위키데이터 속성 P268을 사용하는 문서
- 위키데이터 속성 P269를 사용하는 문서
- 위키데이터 속성 P271을 사용하는 문서
- 위키데이터 속성 P347을 사용하는 문서
- 위키데이터 속성 P349를 사용하는 문서
- 위키데이터 속성 P350을 사용하는 문서
- 위키데이터 속성 P373을 사용하는 문서
- 위키데이터 속성 P380을 사용하는 문서
- 위키데이터 속성 P396을 사용하는 문서
- 위키데이터 속성 P409를 사용하는 문서
- 위키데이터 속성 P428을 사용하는 문서
- 위키데이터 속성 P434를 사용하는 문서
- 위키데이터 속성 P435를 사용하는 문서
- 위키데이터 속성 P436을 사용하는 문서
- 위키데이터 속성 P454를 사용하는 문서
- 위키데이터 속성 P496을 사용하는 문서
- 위키데이터 속성 P549를 사용하는 문서
- 위키데이터 속성 P650을 사용하는 문서
- 위키데이터 속성 P651을 사용하는 문서
- 위키데이터 속성 P691을 사용하는 문서
- 위키데이터 속성 P716을 사용하는 문서
- 위키데이터 속성 P781을 사용하는 문서
- 위키데이터 속성 P791을 사용하는 문서
- 위키데이터 속성 P864를 사용하는 문서
- 위키데이터 속성 P865를 사용하는 문서
- 위키데이터 속성 P886을 사용하는 문서
- 위키데이터 속성 P902를 사용하는 문서
- 위키데이터 속성 P906을 사용하는 문서
- 위키데이터 속성 P947을 사용하는 문서
- 위키데이터 속성 P950을 사용하는 문서
- 위키데이터 속성 P966을 사용하는 문서
- 위키데이터 속성 P982를 사용하는 문서
- 위키데이터 속성 P1003을 사용하는 문서
- 위키데이터 속성 P1004를 사용하는 문서
- 위키데이터 속성 P1005를 사용하는 문서
- 위키데이터 속성 P1006을 사용하는 문서
- 위키데이터 속성 P1015를 사용하는 문서
- 위키데이터 속성 P1045를 사용하는 문서
- 위키데이터 속성 P1048을 사용하는 문서
- 위키데이터 속성 P1053을 사용하는 문서
- 위키데이터 속성 P1146을 사용하는 문서
- 위키데이터 속성 P1153을 사용하는 문서
- 위키데이터 속성 P1157을 사용하는 문서
- 위키데이터 속성 P1186을 사용하는 문서
- 위키데이터 속성 P1225를 사용하는 문서
- 위키데이터 속성 P1248을 사용하는 문서
- 위키데이터 속성 P1273을 사용하는 문서
- 위키데이터 속성 P1315를 사용하는 문서
- 위키데이터 속성 P1323을 사용하는 문서
- 위키데이터 속성 P1330을 사용하는 문서
- 위키데이터 속성 P1362를 사용하는 문서
- 위키데이터 속성 P1368을 사용하는 문서
- 위키데이터 속성 P1375를 사용하는 문서
- 위키데이터 속성 P1407을 사용하는 문서
- 위키데이터 속성 P1556을 사용하는 문서
- 위키데이터 속성 P1584를 사용하는 문서
- 위키데이터 속성 P1695를 사용하는 문서
- 위키데이터 속성 P1707을 사용하는 문서
- 위키데이터 속성 P1736을 사용하는 문서
- 위키데이터 속성 P1886을 사용하는 문서
- 위키데이터 속성 P1890을 사용하는 문서
- 위키데이터 속성 P1907을 사용하는 문서
- 위키데이터 속성 P1908을 사용하는 문서
- 위키데이터 속성 P1960을 사용하는 문서
- 위키데이터 속성 P1986을 사용하는 문서
- 위키데이터 속성 P2041을 사용하는 문서
- 위키데이터 속성 P2163을 사용하는 문서
- 위키데이터 속성 P2174를 사용하는 문서
- 위키데이터 속성 P2268을 사용하는 문서
- 위키데이터 속성 P2349를 사용하는 문서
- 위키데이터 속성 P2418을 사용하는 문서
- 위키데이터 속성 P2456을 사용하는 문서
- 위키데이터 속성 P2484를 사용하는 문서
- 위키데이터 속성 P2558을 사용하는 문서
- 위키데이터 속성 P2750을 사용하는 문서
- 위키데이터 속성 P2980을 사용하는 문서
- 위키데이터 속성 P3223을 사용하는 문서
- 위키데이터 속성 P3233을 사용하는 문서
- 위키데이터 속성 P3348을 사용하는 문서
- 위키데이터 속성 P3372를 사용하는 문서
- 위키데이터 속성 P3407을 사용하는 문서
- 위키데이터 속성 P3430을 사용하는 문서
- 위키데이터 속성 P3544를 사용하는 문서
- 위키데이터 속성 P3562를 사용하는 문서
- 위키데이터 속성 P3563을 사용하는 문서
- 위키데이터 속성 P3601을 사용하는 문서
- 위키데이터 속성 P3723을 사용하는 문서
- 위키데이터 속성 P3788을 사용하는 문서
- 위키데이터 속성 P3829를 사용하는 문서
- 위키데이터 속성 P3863을 사용하는 문서
- 위키데이터 속성 P3920을 사용하는 문서
- 위키데이터 속성 P3993을 사용하는 문서
- 위키데이터 속성 P4038을 사용하는 문서
- 위키데이터 속성 P4055를 사용하는 문서
- 위키데이터 속성 P4114를 사용하는 문서
- 위키데이터 속성 P4143을 사용하는 문서
- 위키데이터 속성 P4186을 사용하는 문서
- 위키데이터 속성 P4423을 사용하는 문서
- 위키데이터 속성 P4457을 사용하는 문서
- 위키데이터 속성 P4534를 사용하는 문서
- 위키데이터 속성 P4535를 사용하는 문서
- 위키데이터 속성 P4581을 사용하는 문서
- 위키데이터 속성 P4613을 사용하는 문서
- 위키데이터 속성 P4955를 사용하는 문서
- 위키데이터 속성 P5034를 사용하는 문서
- 위키데이터 속성 P5226을 사용하는 문서
- 위키데이터 속성 P5288을 사용하는 문서
- 위키데이터 속성 P5302를 사용하는 문서
- 위키데이터 속성 P5321을 사용하는 문서
- 위키데이터 속성 P5368을 사용하는 문서
- 위키데이터 속성 P5504를 사용하는 문서
- 위키데이터 속성 P5587을 사용하는 문서
- 위키데이터 속성 P5736을 사용하는 문서
- 위키데이터 속성 P5818을 사용하는 문서
- 위키데이터 속성 P6213을 사용하는 문서
- 위키데이터 속성 P6734를 사용하는 문서
- 위키데이터 속성 P6792를 사용하는 문서
- 위키데이터 속성 P6804를 사용하는 문서
- 위키데이터 속성 P6829를 사용하는 문서
- 위키데이터 속성 P7293을 사용하는 문서
- 위키데이터 속성 P7303을 사용하는 문서
- 위키데이터 속성 P7314를 사용하는 문서
- 위키데이터 속성 P7902를 사용하는 문서
- 위키데이터 속성 P8034를 사용하는 문서
- 위키데이터 속성 P8189를 사용하는 문서
- 위키데이터 속성 P8381을 사용하는 문서
- 위키데이터 속성 P8671을 사용하는 문서
- 위키데이터 속성 P8980을 사용하는 문서
- 위키데이터 속성 P9070을 사용하는 문서
- 위키데이터 속성 P9692를 사용하는 문서
- 위키데이터 속성 P9725를 사용하는 문서
- 위키데이터 속성 P9984를 사용하는 문서
- 위키데이터 속성 P10020을 사용하는 문서
- 위키데이터 속성 P10299를 사용하는 문서
- 위키데이터 속성 P10608을 사용하는 문서
- 위키데이터 속성 P10832를 사용하는 문서
- 위키데이터 속성 P11249를 사용하는 문서
- 위키데이터 속성 P11646을 사용하는 문서
- 위키데이터 속성 P11729를 사용하는 문서
- 위키데이터 속성 P12204를 사용하는 문서
- 위키데이터 속성 P12362를 사용하는 문서
- 위키데이터 속성 P12754를 사용하는 문서
- 위키데이터 속성 P13049를 사용하는 문서
- 프로그래밍 도구
- 스크립트 언어
- 크로스 플랫폼 소프트웨어