프로그래밍[Univ]/프로그래밍 언어론

[프로그래밍 언어론] 명령형 언어의 특징 2 - 변수(value)

Cloud Travel 2011. 10. 13. 12:29
명령형 언어의 특징이라는 주제를 달고 나온 부분은 자신이 프로그램언어를 개발시
고려해야할 상항에 대해서 나와 있는 것입니다.
-----------------------------------------------------------------------------------------------------
* 변수란?
 - 메모리 공간에 대한 추상화
 - 6개의 특징이 포함되어 있어야 한다.
  > name, address, value, type, lifetime, and scope
 - 선언된 변수는 symbol Table에 변수를 저장한다.
   ex) int a,b,c; //symbol Table에 저장

        



1. Name(이름) : "명명법은 명령형 언어의 특징 1"에서 이미 소개 되어 있기 때문에 건너띈다.


2. Address(주소)
 변수의 주소를 기억하고 있다. 원칙상, 하나의 변수는 하나의 메모리만 취해야 한다. 반대로 하나의 메모리에는 하나의 변수 만이 가르키고 있어야한다. 하지만, 실제로 그렇지 않다.
 ex1) 하나의 변수가 여러개의 메모리를 가르키고 있을 때...
        재귀 함수에 대해서 생각해보자.
        RecursionF(){
         int apple;
         Recursion F();
         ...
        }                
        


이와 같이 재귀함수가 있으면 메모리는 스택을 싸아 차곡 차곡 쌓게 된다. 
 
여기서 살표보면 apple이라는 변수가 여러 곳의 메모리를 가르키고 있다.

재귀함수에서 뿐만아니라 지역변수로써 여러 곳에 같은 이름의 변수가 존재하고,
각각 다른 곳의 메모리를 가르키고 있다. 
 






 ex2) 두 개 이상의 변수가 하나의 메모리를 지칭(Aliases 되어 있다)
        우리가 흔히 사용하는 C언어의 포인터를 에를 들 수도 있다.
        C언어의 포인터 뿐만아니라 과거에는 메모리를 절약하기 위해서 일부로  Aliases하는 기술을 개발하였다.
        예를 들어, c언어의 union, java의 참조형 변수 등이 있다.
        하지만, Aliases에 의해서 가독성(하나의 변수 변경시 다른 값도 변경됨)과 신뢰성이 떨어지고 있다.
        따라서 지금은 이를 금기시하고 있다. 요즘 메모리를 효율적으로 사용하기 위해서 동적할당도 많이
        제공되기 때문이다.


3. Type(변수의 타입) 

  - 변수들이 취할 수 있는 값의 범위가 정해진다. 
   > 변수가 가질 수 있는 최대값과 최소값이 정해짐
  - 사용가능한 연산자가 정해진다.
  - 유효자리의 길이가 정해진다.
   ex1) int i; 를 선언하므로서 i가 취할 수 있는 값의 범위가 -2147483648부터 2147483647까지 라는 것과
          i가 취할 수 있는 연산자(operation)은 + - * / % 가 된다는 것이 정해진다.
   ex2) float로 계산시보다 더 많은 유효자리가 필요하다면 double를 사용하면된다.


4. Value(값) 
 - assignment에 의해서 변한다.
 - 주소를 나타나낸 L-value와 값을 나타내는 R-value에 의해서 assignment가 일어난다.
  ex) x = 4 ; // x is L-value, 4 is R-value
 - 모든 메모리 셀을 추상적으로 유지하려고 하는 것이라고 할수 있다. 

5. LifeTime(생존 시간)
 - 'Allocation(할당)'부터 'Deallocation(회수)'까지의 시간을 의미 / 즉, 메모리에 할당된 시간
 ⓐ Static
  - 변수가 프로그램 실행전에 메모리에 할당되고 프로그램 종류시까지 지속되는 것
  - 글로벌 변수 / Static변수가 취하는 Lifetime유형이다.
  - 장점 : 직접적으로 주소를 찾아 갈수 있어서 속도가 빨라진다.
   cf) 그 밖의 변수는... 
    컴파일시 자신이 속해있는 내부프로그램(Sub Program)에 대한 상대적 위치만을 가지고 있다.
    ex) f(){int x; int y; ... }
      //x는 f함수의 시작부분으로부터 2byte를 점유 / y는 f함수의 시작부분으로부터 2byte를 지나서 2byte를 점유       > 프로그램 실행시 함수 내에서 y의 위치를 찾아가기위해서 y가 나올때마다 상대적 메모리를 계산해야 함.
  -  단점 : 유연성이 떨어진다(재귀적 표현을 사용하지 못한다.)
 ⓑ Stack - Dynamic
  - 일반적으로 Local변수들이 취하는 Lifetime유형이다.
  - 해당 선언문이 실행시 위치가 결정된다.
   ex) f(){int x; int y; ... }//f()가 호출되면 그때의 f()의 메모리주소로 인해서 함수 내부의 메모리주소가 결정된다.
  - 장점 : 재귀적 표현을 사용가능하다(recursion을 해결)
  - 단점 : 메모리 할당과 회수가 지속적으로 발생하므로 프로그램의 속도가 느려진다.
             같은 내부 프로그램(Sub Program)이 실시될시 이전에 내부 프로그램에서 사용한 값을 기억하지 못함
             각 변수는 주소값을 알기 위해서 덧셈 계산을 실시해야한다. 
 ⓒ Explicit - Heap - Dynamic
  - 메모리
Heap영역에 명확히 할당과 회수를 알려준다.
   ex) (in C++){
                       
int *int_node;
                       ...
                       int_node = new int; // new명령어를 이용해 메모리 할당.
                       ...
                       delete int_node;     // delete명령어를 이용해 메모리 회수.
  - 장점 : 쓸만한 곳에서만 사용한후 버릴수 있다. 메모리활용이 용이하다.
  - 단점 : 비효율적이다. 할당과 회수시 할당과 반납에 대한 예약어를 사용해줘야한다. 
             신뢰성이 떨어진다. 회수된 변수를 사용하거나 할당하지 않은 변수를 사용해도 컴파일 과정에선 
             발견 할수 없다.(실행타임에 발견가능 / 프로그램 실행중 프로그램이 죽어버림)

 ⓓ Implicit - Heap - Dynamic
  - 암암리에 할당과 회수를 자동으로 해준다.
  ex) (in JavaScript)  Assign에 의해서 알아서 할당과 회수를 실시
        highs = [21,24,20,18,26];   highs = 13;;

       


  - 장점 : 유연하다. 사용자가 지정안해도 알아서 회수와 할당을 하여 메모리 공간을 사용한다.
  - 단점 : 회수와 할당을 지속적으로 해서 시간이 많이 소요된다.(같은 타입의 변수라도 할당과 회수실시)
             규모가 큰언어에서는 피하고, 작은 언어에서 제공해준다.(시간적 Cost생각)

6. Scope(영역)
 -  변수가 보이는 범위. 즉, 변수의 사용범위
 ※ Non-local-variable : 사용이 가능하나 그 영역에서 선언을 하지 않은 변수
 - Scope Rule : 영역을 결정하는 규칙
 ⓐ Static Scope
  - 프로그램 실행전에 컴파일러에 의해 영역이 정해진다. (Text(Source code)로 판단) 
  - 참조된 변수를 찾는 과정
   ① 자신이 속한 영역에서 변수를 찾아본다. 변수를 찾지 못한다면 ②의 과정을 실시한다.
   ② 보다 상위 Sub Program에서 변수를 찾는다. 변수를 찾지 못한다면 ②의 과정을 반복해나간다

   - Static Parent : 자신 바로위의 Sub Program 
   - Static Ancestors : Static Parent보다 상위 Program들
    > 즉, 자기 자신, Static Parent, Static Ancestors 순으로 변수를 찾아나간다.
   ex1) (In ALGOR) Program 단위

       


   ex2) (In C++) Block 단위

        


   ex3) (In PHP) Block 단위

        


  - PHP에서의 예와 같이 특정예약어를 통해서 영역 밖의 변수를 가져올수도 있다.
   > Hidden을 걷어내는 방법이 존재한다.
  - 다음의 예로 단점을 생각할 수 있다.

   


   > 프로그램을 설계할때에 변수의 사용Scope마져 설계해야한다. 위와같이 다른 요구(Q)가 추가 되면

      프로그램의 전반적인 것을 수정해야하고, 재설계를 해야한다. 프로그램의 구조를 결정하기 힘들다.
   > 구조적 문제를 해결하기 위해 Global 변수 사용이 많아진다. 
 
ⓑ Dynamic Scope
  - 실행시간에 호출 관계에 의해 영역이 결정된다.
  - 자신에게 없으면 자신을 호출한 상위 프로그램에서 변수를 찾는다.
   ex) Static vs Dynamic Scope

       


  - 장점 : 편리하다. 알아서 사용범위가 지정이 된다.
  - 단점 : 하나의 변수를 보는데 함수의 호출 관계를 봐야하므로 이해하기가 힘들다. 가독성이 낮다.
 

 - Scope룰, Static과 Dynamic방법중에서 대부분 Static Scope방법을 이용한다. 
 - 영역에 의해서 참조환경을 결정할 수 있다.
  ※ 참조환경 : 어느 시점에서 보이는 변수의 List
   > Static : 나 자신과 텍스트상의 조상의 변수를 합친다.
   > Dynamic : 나와 나를 호출 시킨 곳의 상위 관계의 변수를 합친다.


-----------------------------------------------------------------------------------------------------
약 1주일간에 걸처서 작성된 2번째 특징이 끝났습니다,