맨위로가기

언어 바인딩

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

1. 개요

언어 바인딩은 라이브러리나 운영체제 서비스의 API가 특정 프로그래밍 언어를 위해 제공되는 것을 의미한다. 이는 소프트웨어 재사용을 위해 시스템 프로그래밍 언어로 작성된 라이브러리를 자바와 같은 고급 프로그래밍 언어에서 사용할 수 있도록 하는 래퍼 라이브러리를 만드는 것을 포함한다. 바인딩은 또한 이름 바인딩, 명령 바인딩, 소켓 바인딩 등 다양한 형태로 나타나며, 런타임 환경과 포팅에도 중요한 역할을 한다.

더 읽어볼만한 페이지

  • 컴파일러 - 바이너리 재컴파일러
  • 컴파일러 - 링커 (컴퓨팅)
    링커는 여러 모듈로 된 목적 파일을 결합해 실행 가능한 프로그램을 만들고, 정적/동적 링킹으로 라이브러리를 연결하며, 심볼 해결 및 재배치로 변수와 함수를 메모리 주소에 연결하는 소프트웨어 도구이다.
  • 라이브러리 - 바이너리 재컴파일러
  • 라이브러리 - 동적 링크 라이브러리
    동적 링크 라이브러리(DLL)는 윈도우 운영체제에서 프로그램 실행 시 필요한 코드와 데이터를 제공하며, 여러 프로그램에서 공유되어 메모리 효율성을 높이고 모듈성을 향상시키는 라이브러리 형식이다.
  • 컴퓨터에 관한 - 고속 패킷 접속
    고속 패킷 접속(HSPA)은 3세대 이동통신(3G)의 데이터 전송 속도를 높이는 기술 집합체로, 고속 하향/상향 패킷 접속(HSDPA/HSUPA)을 통해 속도를 개선하고 다중 안테나, 고차 변조, 다중 주파수 대역 활용 등의 기술로 진화했으나, LTE 및 5G 기술 발전으로 현재는 상용 서비스가 중단되었다.
  • 컴퓨터에 관한 - 데이터베이스
    데이터베이스는 여러 사용자가 공유하고 사용하는 정보의 집합으로, 데이터베이스 관리 시스템을 통해 접근하며, 검색 및 갱신 효율을 높이기 위해 고도로 구조화되어 있고, 관계형, NoSQL, NewSQL 등 다양한 모델로 발전해왔다.
언어 바인딩
개요
유형소프트웨어 라이브러리
설명다른 프로그래밍 언어로 작성된 라이브러리를 사용할 수 있도록 하는 소프트웨어 라이브러리
기능
주요 역할서로 다른 프로그래밍 언어로 작성된 코드 간의 인터페이스 제공
작동 방식한 언어에서 다른 언어의 함수나 루틴을 호출할 수 있도록 함
예시
CairoCairo 그래픽 라이브러리를 위한 다양한 언어 바인딩 제공 (Cairo 언어 바인딩 매뉴얼)
Python ctypesPython에서 C 라이브러리를 사용할 수 있도록 지원 (Python ctypes 문서)
OCaml FFIOCaml에서 외부 함수 인터페이스를 통해 C 코드를 호출할 수 있도록 지원 (Real World OCaml FFI)
Common Lisp CFFICommon Lisp에서 C 코드를 호출하기 위한 외부 함수 인터페이스 제공 (CFFI 사용자 매뉴얼)
JavaHLJava에서 Subversion C 라이브러리에 접근할 수 있도록 하는 JNI 기반 인터페이스 (Subversion JavaHL FAQ)
기타
관련 용어API (애플리케이션 프로그래밍 인터페이스)
인터페이스 (컴퓨터 인터페이스)

2. 언어 바인딩

'''언어 바인딩'''(language binding)은 라이브러리OS 서비스의 API가 특정 프로그래밍 언어를 위해 제공되는 것을 의미한다.

대부분의 라이브러리는 C 언어나 C++와 같은 시스템 프로그래밍 언어로 작성된다. 이러한 라이브러리를 자바와 같은 고급 프로그래밍 언어에서 사용하려면 해당 라이브러리의 자바 바인딩 등이 생성되어야 한다.

라이브러리의 언어 바인딩을 다양하게 준비하는 것은 소프트웨어 재사용을 위한 것이며, 라이브러리 자체를 여러 언어로 만드는 것보다 효율적이다. 또한, 시스템 언어와 동일한 기능을 고급 언어로 기술할 수 없기 때문인 경우도 있다.

2. 1. 개념

바인딩은 일반적으로 한 대상을 다른 대상에 매핑하는 것을 의미한다. 소프트웨어 라이브러리 맥락에서 바인딩은 두 개의 프로그래밍 언어를 연결하는 래퍼 라이브러리이며, 한 언어로 작성된 라이브러리를 다른 언어에서도 사용할 수 있게 해준다.[1] 많은 소프트웨어 라이브러리는 시스템 프로그래밍 언어C 또는 C++로 작성된다. 이러한 라이브러리를 Java, Common Lisp, Scheme, Python, 또는 Lua와 같은 고급 프로그래밍 언어로 작성된 다른 언어에서 사용하려면 해당 언어로 라이브러리에 대한 바인딩을 만들어야 하며, 필요한 수정량에 따라 언어 코드를 다시 컴파일해야 할 수도 있다.[2] 그러나 대부분의 언어는 Python의 `ctypes`, OCaml의 `ctypes`, Embeddable Common Lisp의 `cffi` 및 `uffi`와 같은 외래 함수 인터페이스를 제공한다.[3][4][5]

예를 들어, 어떤 목적으로 작성된 기존 C 라이브러리를 Python에서 사용하려면 Python 바인딩이 사용된다. 또 다른 예는 Subversion 소프트웨어 저장소에 접근하기 위한 API를 제공하기 위해 C로 작성된 `libsvn`이다. Java 코드 내에서 Subversion에 접근하려면 `libsvnjavahl`을 사용할 수 있는데, 이는 `libsvn`이 설치되어 있어야 하며, Java 언어와 `libsvn` 사이의 다리 역할을 하여, `libsvn`의 함수를 호출하여 작업을 수행하는 API를 제공한다.[6]

라이브러리 바인딩을 만드는 주요 동기는 소프트웨어 재사용으로, 여러 언어로 라이브러리를 다시 구현하는 것을 줄이고, 일부 알고리즘을 일부 고급 언어로 효율적으로 구현하는 어려움을 줄이기 위함이다.

2. 2. 목적

소프트웨어 라이브러리의 맥락에서 바인딩은 두 개의 프로그래밍 언어를 연결하는 래퍼 라이브러리이며, 한 언어로 작성된 라이브러리를 다른 언어에서도 사용할 수 있게 해준다.[1]

라이브러리 바인딩을 만드는 주요 동기는 소프트웨어 재사용이다. 이를 통해 여러 언어로 라이브러리를 다시 구현하는 것을 줄이고, 일부 알고리즘을 일부 고급 언어로 효율적으로 구현하기 어려운 문제를 해결할 수 있다.

2. 3. 예시

Python에서 기존 C 라이브러리를 사용하려면 Python 바인딩이 사용된다.[6] 또 다른 예로, Subversion 소프트웨어 저장소에 접근하기 위한 API를 제공하기 위해 C로 작성된 `libsvn`이 있다. Java 코드 내에서 Subversion에 접근하려면 `libsvnjavahl`을 사용할 수 있는데, 이는 `libsvn`이 설치되어 있어야 하며 Java 언어와 `libsvn` 사이의 브리지 역할을 하여 `libsvn`의 함수를 호출하여 작업을 수행하는 API를 제공한다.[6]

3. 이름 바인딩

'''이름 바인딩'''(name binding) 또는 '''이름 결합'''은 식별자에 대응시키는 것이다. 값에 바인딩된 식별자는 해당 값에 대한 참조라고 부른다. 기계어 수준에서는 식별자 개념이 없으므로 이름 바인딩은 프로그래밍 언어에 의한 추상화의 일종이다. 바인딩과 스코프는 밀접하게 관련되어 있으며, 스코프에 따라 바인딩 시점이 결정된다.[1]

3. 1. 정의

식별자을 대응시키는 것을 '''이름 바인딩'''(name binding) 또는 '''이름 결합'''이라고 한다. 값에 바인딩된 식별자는 해당 값에 대한 참조라고 부른다. 기계어 수준에서는 식별자 개념이 없으므로 이름 바인딩은 프로그래밍 언어에 의한 추상화의 일종이다. 바인딩과 스코프는 밀접하게 관련되어 있으며, 스코프에 따라 바인딩 시점이 결정된다.[1]

식별자가 프로그램 내에 나타나는 부분을 "정의"라고 부른다. 정의 외의 부분에서 해당 식별자가 나타나는 경우, 해당 식별자는 바인딩되어 있으며 값에 대한 참조로 사용되고 있다고 볼 수 있다.[1]

3. 2. 스코프와 바인딩 시점

이름 바인딩은 식별자에 대응시키는 것으로, 값에 바인딩된 식별자는 해당 값에 대한 참조라고 불린다. 이는 프로그래밍 언어에 의한 추상화의 일종이며, 스코프와 밀접하게 관련되어 바인딩 시점이 결정된다.

프로그램 내에서 식별자가 정의되는 부분을 제외하고, 해당 식별자가 나타나는 경우 그 식별자는 바인딩되어 값을 참조하는 것으로 간주된다.

스코프에 따라 이름 바인딩은 정적 바인딩과 동적 바인딩으로 분류된다.

컴파일된 프로그램은 대개 메모리 상에서 재배치 가능(relocatable)하다. 따라서 메모리 참조는 기본적으로 동적 바인딩이다. 각 변수나 함수 참조는 베이스 주소로부터의 오프셋으로 표시되며, 실행 전까지는 주소가 확정되지 않는다.

3. 2. 1. 정적 바인딩

정적 스코프에서 이름 바인딩은 프로그램 실행 전에 이루어진다. 이를 '''정적 바인딩'''(static binding) 또는 '''초기 바인딩'''(early binding)이라고 한다.[7][8][9] C++(C++)나 자바(Java) 등 정적 타입(static typing) 객체 지향 프로그래밍 언어에서 가상 함수 테이블을 이용한 Dynamic dispatch영어를 동적 바인딩이나 지연 바인딩이라고 부르기도 한다. 그러나 가상 함수 테이블의 구조는 컴파일 시에 정적으로 확정되므로, 이는 정적 바인딩/초기 바인딩의 일종이다.

3. 2. 2. 동적 바인딩

식별자에 대응시키는 이름 바인딩이 프로그램 실행 중에 이루어지는 것을 '''동적 바인딩'''(dynamic binding)이라고 하며, '''지연 바인딩'''(late binding)이라고도 한다.[10][8] 동적 스코프에서는 이름 바인딩이 프로그램 실행 중에 이루어진다.

파이썬(Python) 등의 동적 프로그래밍 언어나, C 샤프(C#)/비주얼 베이직 닷넷(VB.NET) 등의 동적 타입(dynamic typing) 기능을 지원하는 정적 타입 언어에서 동적 바인딩 또는 지연 바인딩이라는 용어가 사용된다.[10][8]

3. 3. 재바인딩과 변경

식별자에 대응시키는 것을 '''이름 바인딩'''(name binding) 또는 '''이름 결합'''이라고 한다. 값에 바인딩된 식별자를 해당 값에 대한 참조라고 부른다. 기계어 수준에서는 이름 바인딩이 존재하지 않으며, 이는 프로그래밍 언어에 의한 추상화의 일종이다. 바인딩과 스코프는 밀접하게 관련되어 있으며, 스코프에 따라 바인딩 시점이 결정된다.

식별자가 프로그램 내에 나타나는 부분을 "정의"라고 부르며, 그 외의 부분에서 해당 식별자가 나타나는 경우, 해당 식별자는 바인딩되어 있으며 값에 대한 참조로 사용되고 있다고 볼 수 있다.

재할당(rebinding)과 변경(mutation)은 다르다. 재할당은 참조하는 식별자를 변경하는 것이고, 변경은 참조되는 값을 변경하는 것이다. 다음 Java영어 코드를 보자.

```java

LinkedList list;

list = new LinkedList();

list.add("foo");

list = null;

```

식별자 `list`는 처음에 아무것도 참조하지 않는다(미초기화 상태). Java영어에서는 필드는 컴파일러가 타입에 따라 적절한 기본값을 할당하지만, 지역 변수는 기본값이 할당되지 않는다. 그리고 어떤 객체(문자열 연결 리스트)에 재할당된다. 다음으로, 이 `list`에서 참조되는 연결 리스트에 대한 변경으로서 문자열이 추가된다. 마지막으로 `list`는 `null`에 재할당된다.

4. 명령 바인딩

'''명령 바인딩''' 또는 '''키 바인딩'''은 응용 소프트웨어에서 고급 사용자를 위해 제공되는 키보드 매크로나 기능과 키의 연관성을 의미한다. 대부분의 경우 바인딩은 변경 및 추가가 가능하지만 삭제는 불가능하다.

컴퓨터 게임에도 유사한 바인딩이 존재한다. 예를 들어, "쏘기" 동작을 특정 키에 연결할 수 있다. 반사 신경이 필요한 게임에서는 컨트롤러의 각 버튼에 대한 기능 할당을 사용자가 직접 설정할 수 있는 경우가 많다.

4. 1. 목적

명령 바인딩(키 바인딩)은 사용자가 자주 사용하는 기능을 키보드 입력을 통해 빠르게 실행할 수 있도록 하여 사용자 인터페이스(UI)의 효율성을 높인다. 예를 들어, macOS의 많은 응용 프로그램에서는 단축키 Command-S를 저장 동작에 연결하여, GUI를 통한 메뉴 조작 없이도 저장 기능을 사용할 수 있다. Emacs에서는 "save-buffers-kill-emacs" 명령을 Ctrl-X Ctrl-C라는 키 누름에 대응시켜, 저장하고 종료하는 기능을 빠르게 실행할 수 있다. Microsoft Excel과 같은 응용 프로그램에서는 일련의 조작을 매크로로 생성하고, 이를 실행하는 간단한 명령과 바인딩할 수 있다. 컴퓨터 게임에서도 "쏘기" 동작을 특정 키에 연결하는 등 유사한 바인딩이 존재하며, 사용자가 컨트롤러 버튼의 기능 할당을 직접 설정할 수 있는 경우도 많다.

4. 2. 예시

macOS의 많은 응용 프로그램에서는 단축키 Command-S를 눌러 저장할 수 있다. GUI를 통한 메뉴 조작 없이도 가능하다. Emacs에서는 "save-buffers-kill-emacs" 명령이 Ctrl-X Ctrl-C 키 누름에 대응한다. 이 단축키를 이용하면 저장 후 종료 기능을 "save-buffers-kill-emacs"를 매번 입력할 필요 없이 간단하게 실행할 수 있다.

5. 소켓 바인딩

네트워크 소켓에서 소켓의 파일 디스크립터와 로컬 포트 번호 및 IP 주소를 연관시키는 것을 '''바인딩'''이라고 한다[11][12]

5. 1. 사용 함수

BSD 소켓에서는 `bind()` 함수를 사용한다. Winsock 1.x/2.x에도 호환 API가 구현되어 있다[13][14]

6. 런타임 환경

다양한 객체 모델과 가상 머신이 런타임 환경에서 언어 간 상호 운용성을 지원한다.

6. 1. 객체 모델

객체 모델은 여러 프로그래밍 언어 간의 상호 작용을 위한 표준 또는 규약을 정의한다. 주요 객체 모델에 대한 자세한 내용은 하위 섹션을 참고하면 된다.

6. 1. 1. 주요 객체 모델

6. 2. 가상 머신

가상 머신은 서로 다른 플랫폼에서 동일한 코드를 실행할 수 있도록 추상화 계층을 제공한다.

  • 애플리케이션 가상 머신 비교

7. 포팅

포팅은 소프트웨어를 원래 설계된 환경이 아닌 다른 환경에서도 동작할 수 있도록 수정하는 작업이다. 이식 가능한 객체는 크로스 플랫폼 언어 객체 모델 정의를 통해 플랫폼 간 이식성을 높인다.

참조

[1] 웹사이트 Appendix A. Creating a language binding for cairo http://www.cairograp[...] Cairographics.org 2014-04-02
[2] 웹사이트 Standards, APIs, Interfaces and Bindings https://web.archive.[...] Acm.org 2014-04-02
[3] 웹사이트 ctypes – A foreign function library for Python https://docs.python.[...] Docs.python.org 2020-06-04
[4] 웹사이트 Real Worl OCaml, Chapter 19. Foreign Function Interface https://realworldoca[...] 2015-07-19
[5] 웹사이트 Introduction – CFFI User Manual http://common-lisp.n[...] Common-lisp.net 2014-04-02
[6] 웹사이트 Subversion JavaHL FAQ http://subclipse.tig[...] Subclipse.tigris.org 2013-06-18
[7] Microsoft Docs Use early binding and late binding in Automation - Office https://docs.microso[...]
[8] Microsoft Docs 事前バインディングと遅延バインディング - Visual Basic https://docs.microso[...]
[9] Microsoft Learn Option Strict Statement - Visual Basic https://learn.micros[...]
[10] Python.org What is Python? Executive Summary https://www.python.o[...]
[11] Linux manual page bind(2) - Linux manual page https://man7.org/lin[...]
[12] Microsoft Docs Binding a Socket - Win32 apps https://docs.microso[...]
[13] Microsoft Docs bind function (winsock.h) - Win32 apps https://docs.microso[...]
[14] Microsoft Docs bind function (winsock2.h) - Win32 apps https://docs.microso[...]
[15] 웹인용 Appendix A. Creating a language binding for cairo http://www.cairograp[...] Cairographics.org 2014-04-02
[16] 웹인용 Standards, APIs, Interfaces and Bindings http://www.acm.org/t[...] Acm.org 2014-04-02
[17] 웹인용 15.17. ctypes – A foreign function library for Python https://docs.python.[...] Docs.python.org 2014-04-02
[18] 웹인용 Real Worl OCaml, Chapter 19. Foreign Function Interface https://realworldoca[...] 2015-07-19
[19] 웹인용 Introduction – CFFI User Manual http://common-lisp.n[...] Common-lisp.net 2014-04-02
[20] 웹인용 Subversion JavaHL FAQ http://subclipse.tig[...] Subclipse.tigris.org 2013-06-18



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

문의하기 : help@durumis.com