맨위로가기

SWIG

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

SWIG는 C 및 C++로 작성된 소프트웨어 개발 도구로, 1996년 2월에 처음 공개되었다. C/C++ 코드를 다른 프로그래밍 언어에서 사용할 수 있도록 래핑하는 역할을 하며, 다양한 스크립트 언어와 C/C++ 간의 인터페이스를 생성한다. SWIG는 구글 썸머 오브 코드에 여러 차례 참여했으며, 공유 라이브러리, 동적 라이브러리, 실행 파일 등 다양한 형태로 글루 코드를 생성하여 스크립트 언어에서 C/C++ 코드에 접근할 수 있도록 한다. SWIG는 C/C++ 라이브러리를 스크립트 언어에서 활용하거나, 성능 향상을 위해 C/C++로 작성된 코드를 스크립트 엔진에 통합하는 데 사용된다. 파이썬의 SIP, Pybind11, Boost.python 등이 SWIG의 대안으로 사용될 수 있으며, ZXID, LLDB, GNU Radio, TensorFlow 등 다양한 프로젝트에서 SWIG를 사용한다.

더 읽어볼만한 페이지

  • 프로그래밍 도구 - 소스 코드 편집기
    소스 코드 편집기는 구문 강조, 자동 완성, 들여쓰기 등의 기능으로 코드 편집을 용이하게 하고 개발 도구 실행 환경을 제공하며, 텍스트 편집 대신 AST를 조작하는 구조 편집기도 존재한다.
  • 프로그래밍 도구 - GNU 툴체인
    GNU 툴체인은 GNU 프로젝트의 핵심 구성 요소로, 소프트웨어 개발에 필요한 다양한 도구들을 모아 놓은 것으로, 소스 코드 컴파일부터 디버깅, 빌드 자동화까지 소프트웨어 개발 전반을 지원하며 다양한 언어와 플랫폼을 지원한다.
  • 스크립트 언어 - Tcl
    Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다.
  • 스크립트 언어 - PHP
    PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
  • 크로스 플랫폼 소프트웨어 - MSN
    MSN은 1995년 마이크로소프트가 윈도우 95와 함께 출시한 웹 포털이자 관련 서비스 모음으로, 뉴스, 엔터테인먼트, 스포츠, 금융 등 다양한 콘텐츠를 제공하며 주요 온라인 서비스를 통합하는 허브 역할을 수행한다.
  • 크로스 플랫폼 소프트웨어 - 구글 포토
    구글 포토는 사진 및 동영상 저장, 공유, 관리 기능을 제공하는 구글의 클라우드 기반 서비스로, 자동 분류, 얼굴 인식, 검색 기능을 제공하지만 2021년부터 무료 무제한 저장 용량 제공 정책이 변경되었고, 2024년에는 기술의 군사적 이용에 대한 윤리적 논란이 있었다.
SWIG - [IT 관련 정보]에 관한 문서
기본 정보
이름SWIG
저자데이비드 M. 비즐리
출시일1996년 2월
최신 버전4.1.1
최신 버전 출시일2022년 11월 30일
운영 체제크로스 플랫폼
라이선스GPL
웹사이트SWIG 공식 웹사이트

2. 역사

SWIG는 C와 C++로 작성되었으며, 1996년 2월부터 공개되었다. 최초 개발자는 데이브 비즐리로, 로스 앨러모스 국립 연구소와 유타 대학교에서 대학원생으로, 시카고 대학교에서 교수로 재직하면서 SWIG를 개발했다. 현재 개발은 윌리엄 펄튼 주도의 자원 봉사자 그룹이 지원하고 있다. SWIG는 GPL에 따라 배포된다.[1]

2. 1. 구글 썸머 오브 코드 (Google Summer of Code)

구글 썸머 오브 코드(Google Summer of Code)에 SWIG는 2008년, 2009년, 2012년에 참여했다.

연도내용
2008년SWIG는 4개의 프로젝트를 진행했다.
2009년4명의 학생이 참여했다.
2012년5명의 학생 중 4명이 프로젝트를 성공적으로 완료했다.


3. 기능

SWIG는 다른 프로그래밍 언어에서 C나 C++로 작성된 네이티브 함수를 호출하고, 복잡한 데이터 유형을 전달하며, 메모리 누수를 방지하고, 언어 간 객체 클래스 상속 등을 가능하게 하는 것이 목적이다. 프로그래머는 인터프리터에 표시할 C/C++ 함수 목록이 포함된 인터페이스 파일을 작성한다. SWIG는 이 인터페이스를 컴파일하여 일반 C/C++ 및 대상 프로그래밍 언어 코드를 생성한다.

SWIG는 단순한 인수를 가진 함수에 대한 변환 코드를 생성한다. 복잡한 인수 유형에 대한 변환 코드는 프로그래머가 작성해야 한다. SWIG 도구는 C/C++와 대상 언어 간의 접착제(glue) 역할을 하는 소스 코드를 생성하며, 이 접착제는 언어에 따라 두 가지 형태로 나타난다.


  • 기존 인터프리터가 특정 형태의 확장 모듈로 링크할 수 있는 공유 라이브러리
  • 대상 언어로 컴파일된 다른 프로그램에 링크할 수 있는 공유 라이브러리 (예: JNI를 사용하는 자바)


SWIG는 네이티브 코드로 해석된 함수를 호출하는 데 사용되지 않으며, 이는 프로그래머가 수동으로 수행해야 한다.

SWIG의 주요 목적은 프로그램과 스크립트 언어 간의 연결을 최소한의 노력으로 달성하는 것이다. 헤더 파일에 몇 가지 특수 명령어를 작성하면, SWIG는 C/C++와 대상 언어를 중개하는 글루 코드를 생성한다. 글루 코드는 언어에 따라 다음 세 가지 형태를 가진다.

  • 원래 프로그램처럼 작동하지만, 스크립트 언어의 인터프리터가 내장된 실행 파일
  • 기존 인터프리터의 확장 모듈로 링크할 수 있는 공유 라이브러리
  • 대상 언어로 컴파일되어 다른 프로그램에 링크할 수 있는 형태의 공유 라이브러리 (예: JNI를 사용한 자바)


기존 C/C++ 프로그램에 스크립트 언어 엔진을 포함하는 것에는 두 가지 주요 용도가 있다.

  • C/C++ 대신 스크립트 언어를 사용함으로써 프로그램을 빠르게 커스터마이즈할 수 있다. 사용자가 스크립트를 작성하여 일반적인 작업을 자동화할 수 있도록 스크립트 엔진을 사용자에게 공개할 수 있다.
  • 최종 제품에 스크립트 언어 엔진이 포함되지 않더라도 테스트용 스크립트를 작성하는 것은 매우 유용하다.


기존 인터프리터에서 로드할 수 있는 동적 라이브러리를 생성하는 이유는 다음과 같다.

  • 스크립트 언어에 상응하는 것이 없는 C/C++ 라이브러리에 접근할 수 있는 방법을 제공한다.
  • 먼저 스크립트 언어로 프로그램 전체를 작성하고, 성능 분석 후 성능에 중요한 부분의 코드를 C나 C++로 작성한다.

4. 동작 원리

SWIG는 C나 C++로 작성된 함수를 다른 프로그래밍 언어에서 호출할 수 있도록 해주는 도구이다. 이를 위해 프로그래머는 C/C++ 함수 목록이 있는 인터페이스 파일을 작성한다. SWIG는 이 인터페이스 파일을 컴파일하여 C/C++ 코드와 대상 프로그래밍 언어 코드를 생성한다.

SWIG는 단순한 인수를 가진 함수에 대해서는 변환 코드를 자동으로 생성한다. 그러나 복잡한 자료형을 가진 인수의 변환 코드는 프로그래머가 직접 작성해야 한다. SWIG는 C/C++와 대상 언어 사이의 다리 역할을 하는 소스 코드를 생성하며, 이 코드는 다음과 같은 형태로 제공된다.


  • 기존 인터프리터가 확장 모듈로 링크할 수 있는 공유 라이브러리
  • 대상 언어로 컴파일된 다른 프로그램에 링크할 수 있는 공유 라이브러리 (예: JNI를 사용하는 자바)
  • 컴파일되어 동적으로 로드되어야 하는 공유 동적 라이브러리 소스 코드 (예: Node.js 네이티브 확장)


SWIG는 네이티브 코드로 해석된 함수를 호출하는 데 사용되지 않으며, 이는 프로그래머가 직접 수행해야 한다.

SWIG의 주된 목적은 프로그램과 스크립트 언어 간의 연결을 최소한의 노력으로 가능하게 하는 것이다. 헤더 파일에 몇 가지 특수 명령어를 작성하면, SWIG는 C/C++와 대상 언어를 연결하는 글루 코드를 생성한다. 이 글루 코드는 언어에 따라 다음과 같은 세 가지 형태가 될 수 있다.

  • 스크립트 언어의 인터프리터가 내장된 실행 파일 (원래 프로그램과 동일하게 작동)
  • 기존 인터프리터의 확장 모듈로 링크할 수 있는 공유 라이브러리
  • 대상 언어로 컴파일되어 다른 프로그램에 링크할 수 있는 공유 라이브러리 (예: JNI를 사용한 자바)

5. 목적

기존의 C/C++ 프로그램에 스크립트 엔진을 포함하는 주된 이유는 두 가지이다.


  • C/C++ 대신 스크립트 언어를 사용함으로써, 프로그램을 신속하게 개인화(customize)할 수 있다. 사용자가 스크립트를 작성하여 흔한 작업을 자동화할 수 있도록 스크립트 엔진을 사용자에게 공개해도 좋다.
  • 최종 제품이 스크립트 언어 엔진을 포함하지 않더라도, 테스트용 스크립트를 작성하는 것은 매우 유용하다.


기존의 인터프리터에서 로드할 수 있는 동적 라이브러리를 생성하는 이유는 여러 가지가 있다.

  • 스크립트 언어로 동일한 것이 없는 C/C++ 라이브러리에 접근할 수 있는 방법을 제공한다.
  • 먼저 스크립트 언어로 프로그램 전체를 작성하고, 성능 분석 후, 성능에 결정적인 부분의 코드를 C나 C++로 작성한다.


SWIG의 목적은 프로그램과 스크립트 언어 간의 연결을 최소한의 작업으로 달성하는 것이다.

6. 예제

SWIG는 C 프로그램에서 선언이 사용되는 방식과 매우 유사한 인터페이스를 생성하여 단순한 C 선언을 감싼다. 예를 들어, 다음 인터페이스 파일을 고려해 볼 수 있다.[7]

```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"

```

이 파일에는 두 개의 함수 `sin()`과 `strcmp()`, 전역 변수 `Foo`, 그리고 두 개의 상수 `STATUS` 및 `VERSION`이 있다. SWIG가 확장 모듈을 생성하면 이러한 선언은 스크립팅 언어 함수, 변수 및 상수로 각각 접근할 수 있다. 파이썬에서는 다음과 같다.

```python

>>> example.sin(3)

0.141120008

>>> example.strcmp('Dave','Mike')


  • 1

>>> print(example.cvar.Foo)

42

>>> print(example.STATUS)

50

>>> print(example.VERSION)

1.1

7. 대안

SIP, Pybind11, 그리고 Boost의 Boost.python 라이브러리가 파이썬에서 비슷한 기능을 제공한다.

8. SWIG를 사용하는 프로젝트

다음은 SWIG를 사용하는 프로젝트 목록이다.

프로젝트 이름라이선스비고
ZXID아파치 라이선스 2.0
Symlabs SFIS상용
LLDB
GNU Radio최대 3.8.x.x 버전까지. 이후 버전은 Pybind11 사용[3]
Xapian
Armory
TensorFlow
아파치 SINGA
QuantLib
Babeltrace


참조

[1] 웹사이트 SWIG History https://www.swig.org[...]
[2] 웹사이트 SWIG Basics https://www.swig.org[...]
[3] 웹사이트 Changelog for GNU Radio 3.9.0.0 https://github.com/g[...]
[4] 웹사이트 SWIG / News: SWIG-4.1.1 released https://sourceforge.[...] 2023-09-26
[5] 웹인용 SWIG History http://www.swig.org/[...]
[6] 웹인용 SWIG / News: SWIG-4.0.2 released https://sourceforge.[...]
[7] 웹사이트 http://www.swig.org/[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com