본문 바로가기
Python

[Programming] Binding: Name Binding and Language Binding

by ds31x 2024. 6. 6.

Programming에서의 Binding(binding)이란?

binding은 프로그램이 실행되는 동안 특정 identifier (or name)
어떤 속성이나 객체 등의 실제 대상을 binding(연결)하는 것을 의미함.


Binding의 기본 개념

  • Name or Identifier Usage(이름 또는 식별자 사용):
    • 프로그래밍에서 identifier (or name)는 variable, function, class 등의 다양한 요소 및 객체를 가리키는 데 사용됨.
  • Binding:
    • identifier에 특정 attribute나 object를 연결하는 행위임.
    • 이는 identifier가 실제 어떤 대상을 가리키는지를 정의함.

Binding의 종류

binding에는 크게 두 가지 주요 종류가 있음:

1. Language Binding(언어 binding):

  • 한 프로그래밍 언어에서 다른 프로그래밍 언어로 작성된 코드를 사용할 수 있도록 하는 기술을 가리킴.
  • 예를 들어, Python에서 C 또는 C++로 작성된 라이브러리를 사용할 수 있게 해주는 것이 Language Binding임.

2. Object/Property Binding(객체/속성 binding):

  • 프로그램 내에서 변수명이 특정 속성이나 객체 등을 가키도록 설정하는 과정임.

예제

Language Binding(언어 binding)의 예

  • NumPyPySide (or PyQt) 등은
  • C 또는 C++로 만들어진 라이브러리
  • Python으로 작성된 소스 코드에서 사용할 수 있도록
  • API 를 제공해주는 대표적인 language binding임.
  • 이는 주로 Execution Time(실행 시간)에 해당하는 dynamic binding임.

기술적으로는 dynamic linking을 이용한다.


NumPy 예시

import numpy as np

array = np.array([1, 2, 3, 4, 5])
sum_result = np.sum(array)  # 이 호출은 실행 시간에 C 코드로 구현된 함수가 동적으로 로드되어 실행됨.
print(f"Sum: {sum_result}")
  • 위 예제에서 np.sum(array)를 호출하면,
  • NumPy는 실제로 C로 구현된 함수를 호출하여 배열의 합계를 계산함.
  • 이는 Python과 C 라이브러리 간의 동적 linking(Dynamic Linking)을 통해 이루어짐.

PyTorch 예시

import torch

x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([4.0, 5.0, 6.0])
z = torch.add(x, y)  # 이 호출은 실행 시간에 C++ 코드로 구현된 함수가 동적으로 로드되어 실행됨.
print(z)
  • 위 예제에서 torch.add(x, y)를 호출하면,
  • PyTorch는 실제로 C++로 구현된 함수를 호출하여 tensor의 덧셈을 수행함.
  • 이는 Python과 C++ 라이브러리 간의 동적 링킹(Dynamic Linking)을 통해 이루어짐.

Object/Property Binding (객체/속성 바인딩 or Name Binding)의 예

Static Binding

static binding은 프로그램이 실행되기 전에 이미 결정되는 binding임.

  • 예를 들어, 변수의 자료형은 C에서 명시적으로 선언됨.
  • 이는 Early Binding(초기 바인딩)에 해당함.
int x = 10  // 여기서 x는 정수형 value 10으로 binding됨.
  • 이 코드를 실행하면 x는 정수 10과 binding됨.
  • 이 binding은 프로그램이 실행되는 동안 유지됨.

Dynamic Binding

Dynamic binding은 프로그램이 실행되는 동안(runtime)에야 결정되는 binding임.

  • 예를 들어, 사용자 입력에 따라 함수가 동적으로 binding될 수 있음.
  • 이는 Late Binding (지연 바인딩)에 해당함.
def add(a, b):
  return a + b

def subtract(a, b):
  return a - b

# 사용자의 입력에 따라 함수 선택
operation = input("Choose operation (add/subtract): ")

if operation == 'add':
  func = add
elif operation == 'subtract':
  func = subtract
else:
  print("Invalid operation")
  exit()

# 선택된 함수에 동적으로 binding
result = func(5, 3)  # 예: 사용자 입력에 따라 8 또는 2 출력
print(f"Result: {result}")
  • 위 코드에서 func identifier(or name)는 실행 시간에 add 또는 subtract 함수로 동적으로 binding됨.
  • 이는 사용자의 입력에 따라 결정됨.

Binding 과 Assignment 의 차이점

binding과 assignment statement는 종종 혼동되지만, 둘은 명확한 차이점이 있음.

  • Binding:
    • 이름(변수, 함수 등)에 특정 속성(자료형, 함수 구현 등)을 연결하는 행위임.
    • binding을 통해 프로그램의 구조와 동작이 정의됨.
    • 예) identifier 에 자료형을 할당하거나 특정 function을 연결하는 것임.
    • 예) C에서 int x;는 변수 x를 정수형으로 binding하는 것임.
  • Assignment:
    • 이미 binding된 변수에 실제 값을 할당하는 구체적인 명령문임.
    • assignment은 변수에 특정 값을 저장하는 행위를 포함함.
    • 예) C에서 x = 10;은 변수 x10을 저장하는 assignment임.

binding은 "이름"과 "속성"의 연결을 의미하는 더 넓은 개념이며,
assignment는 이러한 binding을 통해 변수가 실제로 어떤 값을 가지도록 만드는 구체적인 실행임.

Python의 경우,
assignment로 variable의 생성이 동시에 이루어지기 때문에 조금 모호함.
binding이 assignment를 포함하는 더 넓은 개념인 점만 명심할 것.


Binding 과 Linking 의 차이점

Binding(binding)과 Linking(linking)도 자주 혼동되지만, 이 둘은 다름.

  • Binding:
    • 이름에 특정 속성이나 객체를 연결하는 행위임.
    • 이는 프로그램의 논리적인 부분에 집중함.
  • Linking:
    • 프로그램의 여러 모듈이나 외부 라이브러리들을 하나의 실행 가능한 프로그램으로 결합하는 과정임.
    • 이는 주로 compile 과정(static linking) 또는 load time (dynamic linking)에 발생함.

예를 들어, Python에서는 import 문을 사용하여 외부 라이브러리를 포함하는 과정이 linking에 해당함.

import math  # math 라이브러리를 프로그램에 linking함.
  • 위 코드에서 import math는 Python 프로그램에 외부 라이브러리인 math 모듈을 포함하는 예시임.
  • 이는 Python 인터프리터가 실행 시간에 라이브러리를 로드하고 연결하는 dynamic linking에 해당함.

Binding Time(binding 시간)의 중요성

binding time (binding이 이루어지는 시점)이 중요한 이유는 다음과 같음:

 

효율성(Efficiency):

  • static bindig(Early Binding)은 프로그램 실행 전에 모든 것이 결정되기 때문에 실행 속도가 빠름.
    • 컴파일러가 미리 코드를 분석하고 최적화하기 때문에 실행 속도가 향상됨.
  • dynamic binding(Late Binding)은 실행 속도가 느릴 수 있지만, 코드의 유연성을 높여줌.
    • 런타임에 결정되기 때문에 상황에 따라 다른 동작을 하도록 설정할 수 있음.

유연성(Flexibility):

  • 동적 binding(Late Binding)은 코드의 유연성을 높여줌.
    • 런타임에 결정되기 때문에 상황에 따라 다른 동작을 하도록 설정할 수 있음.
    • 예를 들어, 사용자 입력에 따라 함수를 선택하거나 다양한 데이터 형식을 처리하는 경우 유용함.
  • 정적 binding(Early Binding)은 코드의 유연성을 제한할 수 있음.
    • 컴파일 시에 결정되기 때문에 나중에 변경하기 어려울 수 있음.

언어 선택:

  • 사용하는 프로그래밍 언어에 따라 binding 시간이 결정될 수 있음.
  • 예를 들어, C++는 static binding을 선호하는 언어이고,
  • Python은 dynamic binding을 선호하는 언어임.

적절한 사용:

  • 상황에 따라 적절한 binding 시간을 사용하는 것이 중요함.
  • 빠른 실행 속도가 중요한 경우 정적 binding을 사용하고,
  • 유연성이 중요한 경우 동적 binding을 사용하는 것이 좋음.

결론

binding은 프로그램의 구조, 실행 방식, 효율성에 영향을 미치는 중요한 개념임.

개발자는 다양한 binding 시간의 특징을 이해하고 상황에 맞게 적절하게 사용해야 함.

또한, binding과 assignment, linking의 차이점을 명확히 이해해야 코드를 명확하게 작성하고 디버깅할 수 있음.

 

NumPyPyTorch와 같은 라이브러리를 사용할 때는

내부적으로 C/C++ 코드와 dynamic linking을 통해 성능을 극대화하는 과정을 이해하면

더 효율적으로 프로그래밍할 수 있음.


참고 자료

Understanding Binding in Programming

 

Name binding - Wikipedia

From Wikipedia, the free encyclopedia Association of data/code with identifiers in programming languages In programming languages, name binding is the association of entities (data and/or code) with identifiers.[1] An identifier bound to an object is said

en.wikipedia.org

https://ko.wikipedia.org/wiki/%EC%96%B8%EC%96%B4_%EB%B0%94%EC%9D%B8%EB%94%A9

 

언어 바인딩 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 컴퓨팅에서 바인딩(binding)은 프로그래밍 언어가 해당 언어에 네이티브하지 않는 외부 라이브러리나 운영 체제 서비스를 사용할 수 있도록 만들어주는 글루 코

ko.wikipedia.org

 

Difference between Static and Dynamic Binding in C++

 

Python Bindings for C/C++ Libraries

 

1. Extending Python with C or C++

It is quite easy to add new built-in modules to Python, if you know how to program in C. Such extension modules can do two things that can’t be done directly in Python: they can implement new built...

docs.python.org

 

2024.03.04 - [Python] - [Programming] glue code and (language) binding

 

[Programming] glue code and (language) binding

Glue Code란glue의 사전적 의미는 "풀" (종이를 붙이는 딱풀 또는 접착제)을 의미한다.glue code란 말 그대로 연결 또는 붙여주는 코드를 가리킴.붙이는 대상을 넣어서 정의하면 다음과 같음."glue code"는

ds31x.tistory.com

 


 

 

728x90