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

[프로그래밍 언어론] Type Compatibility

Cloud Travel 2011. 11. 1. 14:34
* Type Compatibility = Type Equivalence = 타입 호환성
 - 같은 선언문에 있거나, 같은 타입이름을 갖는 것
  ex) int a, b, c; // 같은 선언문에 있다.
        int a;  int b; // 같은 타입이름을 갖는다. 
 - Compatibility 방식에는 이름을 가지고 하는 것과 구조를 가지고 하는 것 두 가지로 나뉜다.

* Name Type Compatibility
 - 반드시 정규 파라메터와 실제 파라메터의 타입 이름이 같아야 한다.
   (formal parameters = actual parameters) 
 - 구현하기가 쉽다.
 - 매우 제한적이다.  
  ex) type indextype = 1...100; //indextype을 새로 정의, 이것은 integer 1~100만을 가지는 부분타입이다. 
        ...
        count:integer;  index:indextype;
        ...
        count := index; // error!! 서로 담고 있는 타입은 integer이지만, 서로 타입 이름이 다르므로 호환X
                              // 제한적 요소가 많다.

* Struct Type Compatibility
 - 두 개의 변수의 타입이 같은 구조일때 호환이 가능하다.
 - Name Type보다 더 유연하지만 구현하기가 힘들다.
 ※ 구현시 고려 사항에 대한 예제
  ex) struct t1{ int a; int b; }; struct t2{int c; int d;};
        // 구조적으로 보면 t1과 t2는 호환이 되어야 한다.
        // 그러나 t1과 t2가 사용용도가 확연히 다를경우 호환이 되면 원치 않는 결과 값이 나올 수 있다. 
  ex) integer A[1...10], B[-5...4];
        // 구조적으로 보면 A와 B는 10개자리 int형 배열이다. 하지만 subscript의 숫자의 모양이 다르다.
        // 이럴 경우 호환이 가능해야하는 것인가?
        // A[1], B[1]의 subscript는 같지만, A[1]은 A의 첫번째 요소이고,B[1]은 B의 6번째 요소이다.
  ex) ENUM E1 = {A,B,C,D}; ENUM E2 = {E,F,G,H};
        // E1과 E2는 서로 취할 수 있는 값이 다르다. 하지만 컴퓨터는 원소의 값을 숫자로 변형하여 저장하여,
        // E1의 A와 E2의 E는 같은 1의 값을 갖는다. 구조적으로도 E1과 E2는 동일한데, 이 경우는 어떻게하는가? 

* 각 언어별 Type Compatibility 방법
 - Pascal : 거의 구조를 보고 사용하지만, Formal parameter일때는 이름을 본다.
 - C / C++ : record에 대해서만 name을 비교하고, 나머지는 구조를 비교하여 호환한다.
 - Ada : 구조를 살펴보지만, 신뢰성을 보장하기 위해서 제한된 형태로 name을 살펴본다.
          : Derived 예약어를 사용하여 구분을 해준다. 
  ex) Derived types : type celsius is new float;
                              type faren is new float;    
        celsius t1;
        faren t2;
        t1 = t2;   // Error! Derived 예약어를 사용하면 타입의 이름을 비교한다. 
  ex) subtype SMALLINT is INTEGER range 0 ... 99
        INTEGER a1; SMALLINT a2;
        a1 = a2; // 가능하다! Derived이외에는 구조를 살펴본다.
                    // 위에서 SMALLINT의 타입을 부모인 INTEGER를 취한다.
                    // Ada에서는 평소 부모의 타입이름을 가져다 쓴다. 

>> 여러가지 유형을 놓고 에러가 발생하는 경우를 찾는 문제에 대한 발견 및 해결 기술이 필요하다. 

예제 ) A, B = array(1...10); 
         A = B;
          // 이 경우에는 type이름이 없으므로  비교가 불가능하다. 호환성 제공을 해주지 않는다.
          // 해결법으로는 Type를 제공해주는 방법이 있다.
          Type LIST_10 is array(1,,,10) of INTEGER
          LIST_10 A, B, C;