{{위키데이터 속성 추적}}
{{소프트웨어 정보
| name                   = SWIG
| logo                   = 
| screenshot             = 
| caption                =
| collapsible            =
| author                 = 데이브 비즐리(Dave Beazley)
| developer              = SWIG 개발자
| released = {{시작 날짜와 나이|1996|02}}<ref>{{웹 인용|url=http://www.swig.org/history.html|title = SWIG History}}</ref>
| latest release version = 4.0.2
| latest release date = {{시작 날짜와 나이|2020|06|08}}<ref>{{웹 인용|url=https://sourceforge.net/p/swig/news/2020/06/swig-402-released/|title = SWIG / News: SWIG-4.0.2 released}}</ref>
| latest preview version =
| latest preview date    = 
| frequently updated     =
| programming language   = [[C (프로그래밍 언어)|C]], [[C++]]
| operating system       = [[크로스 플랫폼]]
| platform               =
| size                   =
| language               =
| status                 =
| genre                  =
| license                = [[GPL]]
| website                = {{URL|swig.org}}
}}
'''SWIG'''(Simplified Wrapper and Interface Generator)는 [[C (프로그래밍 언어)|C]]나 [[C++]]로 작성된 [[컴퓨터 프로그램]]이나 라이브러리들을 [[루아 (프로그래밍 언어)|루아]], [[펄]], [[PHP]], [[파이썬]], [[R (프로그래밍 언어)|R]], [[루비 (프로그래밍 언어)|루비]], [[Tcl]]과 같은 [[스크립트 언어]] 및 [[C 샤프]], [[자바 (프로그래밍 언어)|자바]], [[자바스크립트]], [[Go]], [[모듈라-3]], [[OCaml]], [[GNU 옥타브|옥타브]], [[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 선언들을 래핑한다. 이를테면, 다음의 인터페이스 파일이 있다고 가정한다:<ref>http://www.swig.org/Doc3.0/SWIG.html#SWIG_nn9</ref>
<syntaxhighlight lang="swig">
%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"
</syntaxhighlight>
이 파일에서 {{code|sin()}} 및 {{code|strcmp()}}라는 두 개의 함수와 전역 변수 {{code|Foo}}, 그리고 {{code|STATUS}}와 {{code|VERSION}}이라는 두 개의 상수가 있다. SWIG가 확장 모듈을 만들 때 이 선언들은 스크립트 언어 함수, 변수, 상수로 각각 접근이 가능하다. 파이썬에서는:
<syntaxhighlight lang="pycon">
>>> example.sin(3)
0.141120008
>>> example.strcmp('Dave','Mike')
-1
>>> print example.cvar.Foo
42
>>> print example.STATUS
50
>>> print example.VERSION
1.1
</syntaxhighlight>

== 목적 ==
기존의 C/C++ 프로그램에서 [[스크립트 언어|스크립트 엔진]]을 임베드하는 주된 이유는 2가지가 있다:
* C/C++ 대신 스크립트 언어를 통해 프로그램을 훨씬 더 빠르게 개인화(customize)시킬 수 있다. 스크립트를 작성함으로써 공통 작업을 자동화될 수 있으므로 스크립트 엔진은 최종 사용자에게 노출될 수도 있다.
* 최종 제품이 스크립트 엔진을 포함하지 않는다고 하더라도 테스트 스크립트 작성에 매우 유용할 수 있다.
현존하는 인터프리터에 로드할 수 있는 동적 라이브러리를 만드는 이유가 몇 가지 있는데 다음을 포함한다:
* 스크립트 언어와 동등하지 않은 C/C++ [[라이브러리 (컴퓨팅)|라이브러리]]로의 접근을 제공한다.
* 우선 스크립트 언어의 전반적인 프로그램을 작성하고 [[프로파일링 (컴퓨터 프로그래밍)|프로파일링]]을 거친 다음 성능에 많은 영향을 미치는 코드를 C나 C++로 재작성한다.

== SWIG를 이용한 프로젝트 ==
* [[ZXID]]
* Symlabs SFIS (상용)
* [[LLDB (디버거)]]
* [[GNU 라디오]]
* [[Xapian]]
* Armory

== 같이 보기 ==
* [[LLDB (디버거)]]

== 참고 문헌 ==
* Article "[http://codeguru.com/csharp/.net/net_asp/scripting/article.php/c11103/ Expose Your C/C++ Program's Internal API with a Quick SWIG] {{웨이백|url=http://codeguru.com/csharp/.net/net_asp/scripting/article.php/c11103/ |date=20060901192332 }}" by Victor Volkman
* Article "[https://web.archive.org/web/20090129071001/http://geocities.com/foetsch/python/extending_python.htm Python Extensions In C++ Using SWIG]" by Michael Fötsch
* Presentation "[https://web.archive.org/web/20090425013344/http://blip.tv/file/1179673/ Application overview for openSUSE]" by Klaus Kämpf

== 각주 ==
{{각주}}

== 외부 링크 ==
* {{공식 웹사이트}}

[[분류:프로그래밍 도구]]
[[분류:스크립트 언어]]
[[분류:크로스 플랫폼 소프트웨어]]