ADA 유형 시스템(유형 호환성 및 파생)

모든 컴퓨터 프로그래밍 언어는 본질적으로 그 집행 환경을 종합적으로 고려하여 그 문제 영역의 대상과 행위에 대한 가장 좋은 설명 규칙을 찾는 데 목적을 둔다.문제 영역에 대한 처리는 어느 정도 추상적인 모델링 과정이라고 할 수 있다.
앞에서 말한 바와 같이 ADA의 유형 시스템은 이 언어에서 가장 복잡한 내용 중의 하나이다.유형 체계는 어느 정도에 한 언어가 문제 영역의 대상에 대한 철학적 태도를 나타냈다.ADA는 강형을 극단으로 몰아넣고 그의 태도를 나타냈다. (이 중에서 강형은 이미 강할 수 있다. 강형은 강할 수 있다. 리플렉션과 같은 메커니즘을 반사할 필요가 없다. 적어도 기본 유형 범위 내에서)
본고는 ADA의 각종 데이터 유형, 그 간의 관계, 그리고 범형에서 이러한 데이터 유형에 대한 설명을 토론하고자 한다.
다음은 ADA의 다양한 유형의 파생 관계도입니다.이 나무 구조를 한 번 가보면 이 디자인 사고방식이 여전히 상당히 합리적이라는 것을 발견할 수 있다.
참고: Access는 포인터와 유사하며, Array는 (쉼표로 다차원으로 구분됨) 수조 구조이고, Record는 복합 구조(모든 C/C++의 struct나class가 표시하는 조합 데이터를 나타낼 수 있음)이며, Task/Protected는 ADA 언어에서 다중 임무를 구축하고 동시에 수행하는 작업 단원이다.
그림 출처:http://en.wikibooks.org/wiki/Ada_Programming/Type_System
데이터 유형 중 비교적 복잡한 부분은 이 상자 안의 수치 유형의 관계로 수조 아래에 표시된 경계의 정의로 수조에 대한 작용을 한다.
ADA의 가장 강력한 부분은 모든 유형이 파생 속성을 가지고 있기 때문에 보통 개발자가 정수 데이터 형식을 만나면 파생된 유형일 가능성이 높다. 대부분의 다른 언어처럼 완전히 확정된 유일한 독립된 유형이 아니다.이런 구체적인 파생 관계는 이 그림처럼 그렇게 간단하지 않다.이런 파생은 개념적으로 하드웨어와 무관하지만 사실상 ADA 언어는 이를 고려하고 이를 하드웨어와 연결시킨다.다음은 이런 유형 체계에 대해 분석하고 논술한다.
Numeric scalar 유형의 기본 정의는 range에서 위아래 경계를 지정하여 실현할 수 있습니다. 다음과 같은 예에서integer1.그러나 ADA 언어의 관점에 따르면 이러한 정의는 사실상 익명 유형(어느 정도는range 1..10)을 정의한 것으로 학리적으로'type of integer 1'이라고 하고subtype 이름인integer 1을 파생시켰다.1.
일반적으로 모든 scalar 유형에는'Base 속성이 있는데 이것은 하나의 유형의'기본 유형'을 가리킨다. 나는 적재 유형이 될 수 있다고 이해한다.개념적인 측면에서 보면 컴파일러가 파견한 호환성(호환성에 대해서는 뒤에서 바로 논의)의 최대 유형으로 대체적으로 이해할 수 있다.시스템과 하드웨어 측면에서 볼 때 이 데이터를 불러오는 단원 (저장 절약 측면에서 볼 때 가장 작은 것) 에 대응하는 유형이다.모든 scalar 유형에는'First와'Last 속성이 있는데 각각 하계와 상계에 대응한다.
procedure main is
  type integer_1 is range 1..10;   -- definition of a scalar type
begin
  put_line(integer_1'Image(integer_1'Last));   -- result: 10
  put_line(integer_1'Base'Image(integer_1'Base'Last));  -- result : 127
  put_line(integer'Image(integer'Last)); -- can be Integer'Base'Image(..); result : 2147483647 (32 bit signed integer)
  put_line(integer'Base'Image(integer'Base'Last));  -- result: 2147483647 (32 bit signed integer)
end main;

유형의 파생은 두 가지 경로가 있는데,subtype 하위 형식과 new 새 형식이 있습니다.
subtype의 의도는 파생된 클래스와 완전히 호환되는 유형을 만드는 것입니다.이러한 유형은'Base 유형과 같은 호환 유형 패밀리에 속합니다.'Base 유형은 베이스 유형(또는 지지 유형)으로 논리적 개념에서 볼 때 이 유형족 중 가장 큰 경계를 가진 유형이다.하드웨어와 시스템 측면에서 말하자면 그것에 분배된 데이터 저장과 관련이 있다.Enumeration 유형의 경우'Base'는 가장 먼저 정의된 경계에 의해 결정됩니다.Enumeration의 파생은 연속 서브셋을 취하는 것이어야 합니다.
예를 들어 위에서 말한 내부 정수 유형의 파생성은 아마도 이와 같을 것이다.이렇게 하면 이것들은 모두 서로 호환되는 것이고, 사용자는 이것을 type으로 정의한 것을 본떠서 그것들과 호환되지 않는다.
type Integer is range -2147483648..2147483647;
subtype Natural is Integer range 0..Integer'Last;
subtype Positive is Integer range 1..Integer'Last;

새 type은 구족의subtype 실례를 바탕으로 새로운 유형족의subtype을 제시하는데 그 경계는 경계 정의에서 정해집니다.이 새로운 유형족의 기저 규모는 구족과 일치한다.new type은 다음과 같은 두 가지 특징을 가지고 있습니다.
1. 그의 첫 번째subtype의 경계 정의는 반드시subtype의 경계를 바탕으로 하는 서브집합이어야 한다.
2. 이것과 호환되는subtype은 부모 형식에 정의된 기본 동작을 사용할 수 있습니다.여기서 이른바 기본 조작이란 부류와 함께 있는 패키지에 정의되어 있으며, 그 자체가 new type을 볼 수 없습니다.동시에 실행할 때 경계에 문제가 생기지 않도록 프로그래머가 스스로 보증해야 한다.
정의에서 출발하여 본질적으로 사용하는 ADA 유형은subtype이다.type은 새로운 호환족을 만드는 첫 번째 파생류다.type의 is 다음에 있는 내용은 이 호환족의 유형 설명 정보를 구성하는 데 사용되며, 이 첫 번째subtype의 경계 정보를 구성하는 데 사용됩니다. 이것은 익명 형식입니다. (변수의 사칭 다음에 지정한 익명 형식처럼 이 유형이 만든 변수는 다른 유형과 호환되지 않습니다.)
ADA는 subtype에 대해 다음과 같은 유형의 분류를 가지고 있습니다.
규정(Definite)과 미정(Indefinite)이 규정한 것은 경계 정보가 명확하기 때문에 하나의 데이터 실체를 구성하는 데 사용할 수 있고 하나의 값에 의존할 필요가 없다는 것을 말한다.미정은 부치에 의존해야 한다.일반적으로 일부 함수 매개 변수는 서로 다른 경계의 실례에 대응하기 위해 미정 형식을 사용해야 한다.
제한 (constrained) 과 무제한 (unconstrained) 이 있습니다.
제한이 있는 것은 정의에서 이미 데이터의 경계를 정한 것을 가리킨다(반드시 규정된 유형이어야 한다).무제한이란 무제한사를 가리키며, '참고 함유' 이며, 일반적으로 '미정' 유형이다. 물론 기본 파라미터가 있다면, 그것은 '규정된' 것이다
명시적 변환
a := SomeType(b); -- SomeType is compatible with th e subtype of a
proc(SomeType(b)); -- SomeType is compatible with the subtype of the parameter to proc

무거운 짐
호환되는 형식은 함수 재부팅을 구분할 수 없습니다. (그것들은 '같은' 형식과 같습니다.
비호환 클래스 간에 상수가 혼동되는 경우 다음 형식으로 유형을 지정해야 합니다.
proc(SomeType'(b));

[참고 자료]
[1] Ada Programming Type System from wikibooks http://en.wikibooks.org/wiki/Ada_Programming/Type_System

좋은 웹페이지 즐겨찾기