● 바인딩
변수나 데이터가 실제 메모리 주소를 할당받는것 "int a에서 4바이트의 메모리를 할당받고 "에 해당
정적 바인딩과, 동적 바인딩이 존재한다.
- 정적 바인딩(함수 호출문에 대한 주소가 컴파일시 이미 정해저 있는것)
프로그램 시작전에 미리 메모리에 할당 받는것 / 실행파일을 만들때 호출될 함수로 점프할 번지가 결정되어 바인딩 되는것
- 동적 바인딩(함수 호출문에 대한 주소가 실행중에 호출할 함수를 정하는것)
1. 이것은 가상함수 테이블을 이용한다.
2. 중요한것은 포인터(또는 레퍼런스)로 호출할때만 동작함
(이유는 포인터가 아니면 어떤 객체에 대한 함수인지 알수 있으므로 정적바인딩 된다.)
3. 실행파일을 만들때 바인딩 되지 않고 보류상태로 둠
4. 필요한 메모리 번지를 저장할 메모리를 4바이트씩 가지고 있다가 프로그램 실행시 결정
★ 단점
수행속도가 떨어지고 필요없는 메모리 공간 낭비
※ 단점이 있음에도 동적바인딩을 쓰는 이유 ?
상속해서 베이스 포인터로 접근할때
- 동적 바인딩을 사용하면 어떤 포인터에 의해 접근 되었는지에 상관없이 참조된 인스턴스의
실제 클래스형에 따라, 재정의된 함수가 호출된다;.
출처 : http://blog.naver.com/yuc1206/50141743922
1. early binding : 정적 바인딩이 맞습니다.
2. late binding : 동적 바인딩이 맞고요..
바인딩은 교과서에 나와있는 의미대로 본다면 값을 할당하는것입니다.
어디에? 어떤값을?
일반적으로 프로그래밍 언어를 구성하는 것은 변수, 프로시저 인데, 변수라고 하는것에는 그 나름대로의 특징이 있지요.
예를들면 변수이름, 변수값, Data Type, Life Time 등등...
이런 각각의 특징에 특정 값을 할당하는것을 바인딩이라 합니다.
바인딩은 바인딩 되는 시점이 총6개가 존재하는데
1. 프로그래밍 언어 만들때 (정의할때)
2. 컴파일러 만들때
3. 컴파일때
4. 링크때
5. 메모리에 로드시에
6. 실행시에
그중 실행시에 바인딩되는것을 동적 바인딩이라 하며, 나머지 5개의 경우 정적 바인딩이라 합니다.
아래와 같은 선언문이 있다면,
int a = 1;
변수 a 에 관하여
1) Data Type 은 int 라는 것이 바인딩되며, 컴파일시에 할당되므로 정적 바인딩
2) 변수명 a 는 컴파일시에 할당되므로 또한 정적바인딩
3) 값 1 은 실행시에 할당되므로 동적바인딩 이라 합니다.
1. 바인딩 개념
(1) 바인딩의 정의
프로그램 작성시 2개의 정보를 연관시켜 묶는다(Bind)는 의미
프로그램 내에서 식별자(Identifier)를 그 대상과 관련짓는 것
변수, 배열, 라벨, 절차 등의 명칭, 즉 식별자와 그 값을 연결시키는 것
(2) 바인딩 시간(Binding Time)
프로그램에서 변수들이 갖는 속성이 완전히 결정되는 시간
이름에 속성이 연결되는 시간
2. 바인딩 시간의 종류
(1) 실행 시간 : 동적 바인딩(Dynamic Binding)
바인딩이 프로그램 실행중 그 순간의 상태에 따라 이루어지며, 늦은 바인딩이라고도 함
변수에 값을 바인딩하거나 변수에 저장 장소를 바인딩 하는 것
① 모듈의 시작 시간
부프로그램(Subroutine)이나 블록(Block)을 시작할 때 바인딩이 일어나도록 하는 경우가 많음
C나 Pascal에서 저장 장소에 대한 형식 매개 변수(Formal Parameter)와 실 매개 변수 (Actual Parameter)의 바인딩은 부프로그램의 시작에서만 일어나도록 함
지역 변수들에 대한 기억 장소 할당
② 실행시 임의의 시간
프로그램 실행중 임의의 시간에 바인딩이 일어날 수 있음
거의 모든 언어에서 배정문(Assignment Statement)을 통해 변수의 값을 바인딩 하는 경우
LISP와 ML 같은 일부 언어에서는 메모리에 대한 이름의 바인딩을 임의의 시점에서 일어 나도록 함
(2) 번역 시간 : 정적 바인딩(Static Binding)
바인딩 실행 전 컴파일, 링크(Link), 로드(Load) 시간에 이루어지며 정적 바인딩이라 함
변수의 형, 자료 구조의 형과 크기, 레코드의 각 항목들의 형들을 확정, 변수에 대한 기억 장소를 바인딩하는 것
① 프로그래머에 의해서 선택된 바인딩
프로그래머는 프로그램 작성시 번역 시간 동안 바인딩해야 하는 변수의 형, 문장구조 등 에 대해 미리 결정함
② 번역기에 의해서 선택된 바인딩
프로시저에 할당된 저장소 안에 있는 자료 객체의 상대적 위치나 배열의 저장 방법과 크 기 등은 언어 번역기가 결정함
③ 적재기(Loader)에 의해서 선택된 바인딩
메모리에 프로그램을 실행할 컴퓨터의 실제 주소를 할당
FORTRAN의 기억 장소 할당도 Load 시간에 행해짐
(3) 언어 정의 시간
① 한 언어의 특징은 그 언어가 정의된 시점에서 대부분 확정됨
② 자료 구조, 프로그램 구조 등과 같은 특징은 언어를 정의할 때 고정됨
허용된 자료 구조, '+'와 '*' 등 연산의 종류 등
(4) 언어 구현 시간
① 언어에서 정수의 자릿수, 실수의 유효 숫자 개수 등이 바인딩 되는 시간
integer type 변수의 길이(16 bit or 32 bit) 등
② 언어 구현 시간의 바인딩을 최소화하여 특정 기종에 구애받지 않는 호환성을 갖도록 함
초기 바인딩과 후기 바인딩의 장단점은 효율성과 편리성에 의해서 서로 상충된다. 수행 시간이 주요 관건인 언어(FORTRAN, Pascal, C)에서는 가능한 한 바인딩이 번역 시간에 이루어지도록 설계되었다. 그러나 LISP, ML과 같이 편리성이 중요한 언어에서는 대부분 바인딩을 실행 시간까지 지연시켜서 자료에 의존할 수 있도록 하였다. 효율성과 편리성을 모두 중요시한 Ada와 같은 언어에서는 바인딩 시간을 선택할 수 있도록 하였다.
* 자료형의 명세와 구현
[명세]
- 속성
- 값
- 연산
[구현]
- 저장방법
- 연산의 구현
* 선언의 목적
1. 저장 방법에 대한 선택 : 선언이 언어번역기에게 자료형과 자료 객체의 속성에 대한 정보를 제공한다면, 번역기는 그 자료 객체에 대해 번역된 프로그램의 수행 시간과 필요한 저장소를 절감할 수 있는 최선의 저장 방법을 결정할 수 있다.
2. 저장소 관리 : 선언에 의해 제공된 자료 객체의 수명에 관한 정보는 프로그램 수행중에 효율적으로 저장소를 관리할 수 있도록 해준다.
3. 다항적 연산
* 강성 형(Strong typing)
프로그램 안에 있는 모든 형 오류가 정적으로 발견될 수 있으면 그것을 강성 형 언어라 부른다. 안전한 형을 가진 모든 연산에 대해 결과가 올바른 형이라는 것을 정적으로 d라 수 있으며 동적인 검사가 필요하지 않다. 분명히 모든 연산이 안전한 형이면 그 언어는 강성 형 언어이다.
완전하게 강성 형인 언어는 거의 없다. 예를 들어 C에서 X와Y가 short형이면 X+Y와 X*Y는 short 정수의 계산 허용 범위를 벗어날 수도 있으며, 형 오류를 일으킬 수도 있다. 완전한 강성 형은 아니지만 한 단계의 형 변환으로 제한하면, 강성 형에 비슷하게 접근 할 수 있다.
*모호성
A(I,J) 와 같은 경우 FORTRAN구문에서 함수 호출을 위한 구문과, 2차원 배열을 참조하는 구문으로 모두 쓰일 수 있다.
두 실행 순서 중 어느 것인지가 불확실 하기 때문에 위의 문장의 모호하다.
모호성의 문제를 해결하기 위해 begin....end / if....end if 와 같은 구분문자 짝을 사용한다.
*묵시적(암시적) 인수(Implicit arguments)
프로그램에서의 연산은 인수를 이용하여 호출된다. 그러나 전역변수 혹은 다른 비지역변수를 통하여 암시적인 매개변수에 접근하는 경우가 있다. 연산의 결과에 영향을 미치는 모든 자료를 완벽하게 결정하는 것은 암시적인 인수 때문에 힘들다
*부수효과(Side effect)
어떤 연산이 덧셈의 결과로서의 합을 반환할 때, 그 값은 프로그래머 혹은 시스템이 정의한 다른 자료 객체의 값을 변경시킬 수도 있다. 그러한 암시적인 결과를 부수효과라 한다. 함수는 결과를 반환할 뿐만 아니라, 입력 인수도 변경시킬 수 있다. 부수효과는 많은 연산의 일부분이다. 특히 자료 구조를 변경하는 경우에 대헤서는 더욱 그러하다. 따라서 이러한 부수효과는 연산의 영역을 정확하게 명시하는 것이 힘들다.
*쓰레기(Garbage)
자료 객체에 대한 모든 접근 경로가 없어지고 자료 객체가 계속해서 존재할 때 그것을 쓰레기라 한다. 그 자료 객체는 프로그램의 다른 곳에서 접근할 수가 없기 때문에 더 이상 사용이 불가능하고, 그 자료 객체에 대한 바인딩은 그대로 남아있기 때문에 그 공간은 다시 사용할 수 없다. 메모리가 한정되어 있기 때문에 쓰레기를 자꾸 만들어 가는 것은 귀찮은 문제를 야기시킨다.
*허상참조(Dangling reference)
허상 참조는 관련된 자료 객체의 수명이 다한 후에도 접근 경로가 존재하는 경우를 말한다. 원래 접근 경로는 자료 객체의 위치로 이끌어 주는 역할을 한다. 객체의 수명이 다하면, 이공간은 후에 다른 객체를 위해 사용이 가능해야 한다. 그러나 그 공간을 다시 사용할 수 없다고 해서 현재의 접근 경로를 없애는 것이 아니면 허상참조로 계속해서 존재한다.
허상참조는 무결성에 해를 끼치기 때무에 기억장치 관리에 심각한 문제를 야기시킨다.
*포인터
포인터 자료 객체는 다른 메모리 공간의 주소를 포함하고 있는 메모리 위치로 나타낸다. 그 주소는 포인터에 의해 지정된 자료 객체를 나타낸 공간의 기준 주소이다. 포인터 값을 위한 두 가지 저장 방법이 존재한다.
1.절대주소 : 포인터 값이 자료 객체의 메모리 공간의 실제 주소이다.
2.상대주소 : 포인터 값은 자료 객체가 저장될 수 있는 힙 블록의 기준 주소로부터의 변위를 나타낸다(base+offset)
출처 : http://www.patchman.co.kr/147
'프로그래밍 > 참고' 카테고리의 다른 글
string (0) | 2013.03.19 |
---|---|
string의 메서드 (0) | 2013.03.19 |
알짜배기 정보! (0) | 2013.03.07 |
SVN 용어설명 (0) | 2013.03.07 |
const로 알아보는 서로 다른 메모리 영역 (0) | 2013.03.07 |