2010-12-20 6 views
7

정확히 어떤 이름 동등한지를 파악할 수 없습니다. 나는 꽤 구조적이라고 생각한다.구조 동등성 대 이름 동등성

Type TI=integer 
Type TTI=TI 

a=integer 
b=TTI 
f= ref float 
g= ref float 

A와 B 둘 구조와 이름 동등한, F와 G가 A와 B는 이름 상응하는 이유를 단지 구조 equivalent.I 이해하지 못하는 동안 만 F : 교수님이 준 예는이했다 그리고 g는 그렇지 않다.

답변

2

a와 b는 이름이 같은 이유입니다. f와 g가 같지 않아 이름에 해당하지 않습니다.

3

컴파일러가 유형을 나타내는 데 사용할 수있는 내부 데이터 구조를 고려하면 이름 등가 개념이 가장 적합합니다. 유형이 데이터 구조에 대한 포인터로 표현된다고 가정하십시오. 또한 간단한 포인터 비교 (예 : 이름 동등성)로 유형 등가성 검사를 구현한다고 가정합니다. integerfloat과 같은 기본 유형은 유한 한 수의 글로벌 환경에서만 저장됩니다. 또한 integerinteger을 비교하면이 글로벌 환경 덕분에 동일한 구조를 가리키기 때문에 동일한 것으로 보장됩니다. ref 때문에

는 I 무한히 많은 종류를 생성하는 데 사용할 수있다하는 형 생성자 아닌 원자 타입이다 (예를 들어 ref float, ref ref float 등). 따라서 우리는 지구 환경에 모든 것을 저장할 수 없습니다. 컴파일러가 이러한 유형을 관리하기 위해 채택 할 수있는 쉬운 전략 중 하나는 유형 생성자를 만날 때마다 새로운 구조를 할당하고 그 유형에 대해 새로운 데이터 구조를 할당합니다. 따라서 ref float의 인스턴스는 하나의 새로운 데이터 구조를 생성하고 다른 인스턴스 인 ref float은 완전히 새로운 데이터 구조를 생성합니다. 포인터 비교가 실패하므로 이름이 같지 않습니다.

퍼즐에 한 가지 더 많은 부분이 있습니다. 이것은 할당 연산자의 의미를 나타내는 것입니다. 이 형식 별칭은 컴파일러에서 간단한 포인터 복사본이므로 A=B을 쓰면 A은 항상 B과 같은 이름입니다. 그러나 다시 말하면 F AF A의 다른 인스턴스와 같은 이름이 아닙니다!

3

다음 두 정의를 고려하십시오. 위의 예에서

type student = record 
    name, address : string 
    age : integer 

type school = record 
    name, address : string 
    age : integer 

x : student; 
y : school; 

는, 변수 X 및 Y는 이름 당량 미만 다른 유형이 고려 될 것이다 : X는 행 1에서 선언 된 형태를 사용한다; y는 4 행에서 선언 된 타입을 사용한다. 이름 동등성은 프로그래머가 두 개의 타입 정의를 작성하려고 할 때, 아마도 그 정의가 다른 타입을 나타낼 것이라는 가정에 기반한다. (예를 들어 귀하가 제공 한 예가 확실하지 않습니다.)

참조 : 프로그래밍 언어 화용 론, M.L. Scott

1

이름 유형 동등성에서 두 변수는 동일한 선언 또는 동일한 유형 이름을 사용하는 선언에 정의 된 경우 동일한 유형을 갖습니다. 따라서 예제의 변수 'f''g'은 동일한 값입니다. 그러나 변수 'a''b'은 서로 다른 유형 이름을 가지고 있기 때문에 동일하지 않습니다. 또한 구조체 유형 동등성 하에서 동일한 변수 구조를 가진 두 변수의 유형이 같습니다.따라서 변수 'a''b'은 동등한 것이고 변수 들인 'f''g'은 동일한 이름을 가진 유형이 동일한 구조를 가지고 있기 때문에 동일합니다.

참조 : Sebesta, 프로그래밍 언어 개념, 10th ed.

19

타입 평등

예 (C =에 의해 표시됨) 할당과 같은 기본적인 동작의 의미는 언어 정의에 지정된다. 따라서, 예를 들면, 현재 오브젝트 y

x = y; 

같은 문장의 의미는 가변 x위한 메모리 위치로 복사된다.

그러나 할당과 같은 작업을 번역기에서 허용하려면 일반적으로 두 피연산자의 유형이 동일해야합니다 (또는 다른 특정 방식으로 호환 가능해야 함).

따라서 언어 번역자는 두 가지 유형이 동일한 지 여부를 결정해야하는 경우가 있습니다. 이제 우리는 두 가지 유형이 "동등"(또는 동급)이라고 말하는 것이 무엇인지 고려합니다.

두 종류가 동일하게 간주됩니다 여부를 결정하는 두 개의 표준 방법이 있습니다 : 이름 등가구조 등가가.

등가 이름이 가장 간단합니다. 두 유형은 동일한 이름을 사용하는 경우에만 동일합니다. 따라서

typedef struct { 
      int data[100]; 
      int count; 
      } Stack; 

    typedef struct { 
      int data[100]; 
      int count; 
      } Set; 

    Stack x, y; 
    Set r, s; 

하는 이름 당량 언어에서 사용되는 경우, 예를 들면, 코드 (사용 C 구문)는 다음 xy들은 동일한 타입 일 수 있고 rs는 똑같은 것이 것 유형은 x 또는 yr 또는 s 유형과 동일하지 않습니다. (즉, 번역기에 의해 허용되지 않는다)이 문 등

x = y; 
    r = s; 

로서 유효하다고 의미하지만 문은

x = r; 

유효하지 않을 것이다.

구조적 등가 사용

:, 두 종류의 경우와 동일하고, 단, 그들은 다른 방식으로 해석 될 수있는 동일한 "구조"을 갖는다.
두 유형의 각 구성 요소 이름과 유형이 동일해야하며 유형 정의에서 같은 순서로 나열되어야합니다.
덜 엄격한 요구 사항은 구성 요소 유형이 두 유형에서 동일하고 동일한 순서 여야하지만 구성 요소의 이름이 다를 수 있다는 것입니다.

다시 번역기는

x = r; 

같은 문장을 받아들이는 것을 의미 구조적 등가StackSet이 등가로 간주되는 두 종류를 사용하여, 상기 예에서 찾고 (참고 C 아무튼 ' 구조상의 동등성을 지원하고 위의 지정에 대해 오류를 줄 것입니다.)

+0

매우 유용한 정보이지만 링크가 깨졌습니다. 고칠 수 있습니까? 감사. – LearningMath

+0

죄송합니다. 해당 링크는 더 이상 유효하지 않습니다. – JerryGoyal

관련 문제