Programming Languages

Download Report

Transcript Programming Languages

car
제6장
a
(a b c)
자료형
cons
cdr
(a b c)
(b c)
Contents of Address Register
Contents of Decrement Register
 자료형과 형 선언(Data Types & Type Declarations)
 자료형
 구성원이 되는 객체들의 집합 + 연산(생성, 작성, 소멸, 수정, 분해)
 예) Lisp  Symbolic-수식(원자[기호, 숫자], 리스트로 구성)
- CAR, CDR, CONS 등 연산 지원
예) 명령형 언어  기본 자료형 : 정수, 실수, 문자, 논리 등
 자료형의 중요 범주(6장의 관심 쟁점)
 내장 자료형과 이들의 표현법, 사용 가능한 연산에 관한 사항
 사용자 정의 자료형에 관한 형 선언에 관한 사항
Fortran 77
기본자료형 종류들
INTEGER
REAL
LOGICAL
CHARACTER
DOUBLE
COMPLEX
Algol 60
integer
real
boolean
Pascal
Ada
integer
real
boolean
char
integer
float
boolean
character
natural
duration
priority
자료형
기타 고려 사항
 자료형 기법(typing mechanism)?, 필요한 이유?
 자료형을 정의하고, 변수를 특정 자료형으로 선언하는 설비 (선언문에서 제공)
 기존 언어에서 제공  Fortran : 빈약, 최근 언어 : 다양
 변수 자료형 선언
① 정적인 자료형 검사, ② 명세부를 구현부와 분리  추상 자료형
③ 프로그램 신뢰성 증가, ④ 프로그램 판독성
 자료형 쟁점 사항
약자료형 (losed type)
 자료형 정보의 바인딩 시점(번역시간 또는 실행시간)
강 자료형(strongly type)  신뢰성, 유지보수성, 판독성 증가
 두 자료의 적법성(compatibility, 양립), 동치 관계 결정할 수 있는 기법 제공
 자료형의 매개변수화와 매개변수의 평가 시점
• Help
 자료형 구성원(객체, 요소, 값)  영역(domain) 구성함
 자료형 영역이 상수 값들인 경우  스칼라 형 또는 단순형 -> 기본 자료형
 사용자가 작성한 구성원  리터럴(literal, ex, {true, false} -> 논리형 )
자료형
 열거 자료형(Enumerated Data Types)
 열거 자료형
 사용되는 자료집합을 리스트 형태(순서 정의)로 정의
 열거형 연산  동등관계, 순서 관계, 배정연산 허용, 리터럴에 대응되는 상수지원
 열거형 정의 설비는 새로운 자료형 정의, 선언, 사용될 리터럴 선언 차원에서 프로그래밍
언어의 능력을 향상시키는 방법
 예) Pascal의 열거형 사용 예
type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
var x, y, z:months;
…
x :=Jan ;
<순서 관련 연산자>
y :=Jun ;
• pred(x) : x 이전에 정의된 값
• succ(x) : x 다음에 정의된 값
if x = y then z := Nov else z := Dec ;
• ord(x)
: x가 정의된 위치
 순서 관련 연산
 pred(Jun)  May, pred(Jan)  undefined, succ(Jun)  Jul, succ(Dec)  undefined
자료형
 열거형 문제점
 다중 정의(Multiple definition)
 동일한 상수를 두 열거형의 리터럴 값으로 사용 : 형 대조 시 문제
 Pascal : 不許容, Ada : 許容
 Ada의 예
type months is (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
type summermonths is (Jun, Jul, Aug);
X : months;
Y : summermonths;
 month’ORD(Jul) 또는 summermonths’ORD(Jul) 로 구분
 부분 영역형
 이미 정의된 자료형에서 일부 구간을 정의해 사용
 범위 : (하한~상한) 정의
 원래 자료형의 연산을 부분 영역형에서 사용 가능
 원래 자료형과 부분 영역형의 적법성 여부 (Pascal은 구현 의존)
자료형
 예 : Pascal
type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
type summermonths = Jun..Aug;
 summermonths 형의 변수는 Jun, Jul, Aug 저장 가능
 months 형과 summermonths 형의 혼합 연산  구현 의존적
 type winters = Dec..Feb;  months의 부분영역형으로 불가능
자료형
 기본 자료형(The Basic Data Types)
 수치형(Numeric)
 기본 자료형으로 실수, 정수형은 구현 시 기계에 의존적
 기계어로 직접 구현(빠른 연산 속도)되지만 호환성 문제 발생
 호환성 문제 해결 위해 Ada : 수치값을 명시적 제한
 기 정의된 상수(MAX_INT, MIN_INT) 도입
 short integer, long integer : 사용자가 허용 범위와 사양을 선언 가능
 실수 : 유효숫자 자리수, 값의 범위, 실수 사이의 증분치 등을 선언 가능
 예) type COEF is digits 10 range -1.0..1.0;
type MONEY is delta 0.01 range 0.0 .. 1.0;
 COEF : 유효숫자 10자리 값, 범위는 -1.0~1.0
 MONEY : 101개의 숫자(0.0, 0.01, 0.02, ..., 1.0)
 수치 자료형 T의 속성 사용 허용 : 개수(T’DIGIT), 최소값(T’SMALL),
최대값(T’LARGE)
자료형
 다형성(polymorphism) 제공 (Ada, C++ 등)
 동일 속성의 연산자가 피연산자 형에 따라 다른 것으로 간주되는 개념
 예) + : 정수형 덧셈, 실수형 덧셈, 행렬 덧셈 등
 혼합형 연산 해결
  피연산자와 연산 결과에 대한 자료형을 표로 제공
 예) Algol 68 (widening이 기본)
+
integer
real
double
real** double***
integer integer
real
double*
real real**
double double*** double* double
* : (실수형  배정도형)후 연산
** : (정수형  실수형) 후 연산
*** : ** , * 변환 후 연산
  연산 결과의 자료형을 미리 결정하여 해당 연산을 수행
 피연산자가 연산 결과의 자료형과 다르면 결과형으로 변환하여 연산
 예) (Fortran문장)
 P = Q + REAL(I / J)
P=Q+I/J
 P = Q + REAL(I) / REAL(J)
해석
자료형
 cast(Algol 68)
 자료형의 명시적인 변환 구문
 예) real val 수식 : 수식 값을 실수형으로 변환
 확장(widening)과 축소(narrowing)
 확장 : 수식 형 변환 시 메모리가 증가하는 방향으로 변환
 예) 정수  실수, 실수  배정도형 실수
 축소 : 수식 형 변환 시 메모리가 감소하는 방향으로 변환 (정보 손실)
 예) 실수  정수, 정수  문자
자료형
 논리형 (Boolean)
 값의 영역이 두 개의 객체(참과 거짓)로 구성
 논리형 연산(and, or, not, imp, equiv)
 x and y = if x then y else false
 x or y
= if x then true else y
 not x = if x then false else true
 x imp y = if x then y else true
 x equiv y = if x then y else not y
 논리형 상수 표현
 Algol60 - true, false (수 값과 혼합 연산 금지)
 Pascal, Ada - 정의된 열거형 (false, true), false < true 또는 true < false
 PL/I - 비트열 모두 “0“ 이면 FALSE(0), 아니면 TRUE(1)
• 수 값과 혼합 연산 가능 : “187 + TRUE” 도 의미 있음
• A < B < C  (A < B) < C 의미 (예, 9 < 8 < 7  결과는 TRUE )
1<C
자료형
 문자형(Character, String)
 60년대 중반 요구
 문자열 자료형, 문자열 관계 연산 요구
 Hollerith 문자열 (초창기 수치중심 언어인 Fortran, Algol 60에서 사용)
 주로 출력용으로 쓰임
 문자열을 정수 변수에 배정하여 사용
 예) 14H HONG KIL DONG
 PL/I : 매우 다양한 문자 처리 기능 제공
DCL A CHAR(10);
• A - 길이 10인 문자열
DCL B CHAR(80) VARYING;
• B - 최대 길이 80인 문자열
DCL C PIC 'AAXX99’;
• C - 영문자(2)+임의 문자(2)+숫자(2)인 문자열
 PL/I에서 제공하는 문자열 연산들
 (infix연산자), INDEX, LENGTH, SUBSTR, TRANSLATE, VERIFY  prefix연산자
자료형
 PL/I에서의 문자열 처리 예
 가정 : DCL A CHAR(15) , (B , C , D) CHAR (20) VARYING;
 연결 연산 (| )
A='WHAT,’ | '?' | 'ME' | '?' | 'WORRY?';  A에 ‘WHAT,?ME?WORRY?' 저장
 길이 연산
LENGTH(A)  길이 15 반환
 부분 문자열 연산 (SUBSTR은 l-value, r-value 존재)
SUBSTR(A, 7, 2)  'ME' 반환 (r-value 로 사용)
SUBSTR(A, 7, 2) = 'US'  A에 'WHAT,?US?WORRY?' 저장 (l-value 로 사용)
 INDEX(A, B)  A에서 문자열 B의 시작위치 반환(없으면 0을 반환)
 VERIFY(A, B) : A에 있으나 B에는 없는 첫 문자 위치 반환
VERIFY(GSTRING , 'ABCDEFGHIJKLMNOPQRSTYVWXYZ')
 영문자가 아닌 위치 반환
 TRANSLATE(A , B , C) : A에서 C의 모든 문자를 찾아 B의 문자로 변환
TRANSLATE(A , '-' , '?')  A를 'WHAT,-ME-WORRY-’ 로 변환
자료형
 Pascal (PL/I의 문자열 처리 기능이 고비용이라는 이유로 제거)
 char 자료형 만 존재
 문자열 : 문자형 1차원 배열  문자열 처리의 내장 함수 없음
 ord(c) : 정합 순서에서 c의 순서값, chr(x) : x번째 문자 반환 함수 제공
 Snobol 문자열
 64년 Farber, Griswold, Polonsky : 기계 독립적(Machine independent) 구현
 문자열 연산 사용 예
 연결 연산 - 공백
Y = 'UP’
X = 'HURRY’
Z=X Y
 문자 연결 연산('HURRYUP')
 널 문자 배정
X=
 패턴 매칭(Pattern matching)
 [label] subject pattern [:goto ]
/* 레이블은 첫 열에서 시작 */
예) AXIOM = 'SNOBOL IS A NIFTY LANGUAGE'
AXIOM 'NIFTY' : S(FOUND) F(NOTFOUND)
 ‘NIFTY’를 발견하면 레이블 FOUND로 제어 이동
자료형
 패턴 매칭(Pattern matching) <계속>
 [label] subject pattern = object [ :goto]
/* 삽입, 소거, 변경 가능 */
예) LOOP AXIOM 'SNOBOL' = 'APL' : S(LOOP)
 모든 ‘SNOBOL’을 ‘APL’로 변환하는 문장
LOOP AXIOM ' ' = : S(LOOP)  AXIOM에서 모든 공백을 제거
 택일 패턴
 PAT= 'RED' | 'GREEN'  변수 PAT에 ‘RED’와 ‘GREEN’ 라는 패턴 배정
예) SAMPLE = 'ONE SHOULD NOT EAT GREEN APPLES'
SAMPLE PAT : S(LABEL)  ‘GREEN’이 매칭되어 LABEL로 분기
 택일과 연결 연산
 FANCY = ('R' | 'B') ('EDS' | 'ED')
 패턴으로 사용되는 경우 (REDS, RED, BEDS, BED) 순서로 검사
 조건 배정문(conditional assignment)
 SAMPLE FANCY.ITEM : S(FOUND) F(NOTFOUND)
 성공 시 찾은 문자열이 변수 ITEM에 배정
(이 경우, REDS, RED, BEDS, BED 중 하나)
자료형
 포인터 자료형(Pointer Data Types)
 포인터와 포인터 변수
 포인터 : 객체에 대한 참조
 포인터 변수 : 객체를 참조하기 위한 주소를 값으로 취하는 식별자
 필요성
① 실행시간까지 크기(개수)를 알 수 없는 자료 (동적 기억 장소 할당)
② 다중 관계(multiple relationship)
 문제점
① 다수의 포인터가 동일 객체 지시  이명
② 포인팅 되지 않은 객체 존재  현수참조(dangling reference)
③ 포인터 변수 : r-value(값이 아니라 객체를 가리킴), l-value인가?
- 구분 가능한 표현이 요구됨
* dangling reference  Pascal, PL/I 발생 가능, Algol 68 발생 불가
객체수명 >= 포인터 변수 수명
자료형
포인터 사용 예
↑node 출현이 node가 정의되기 전에 나타나는 현상
 Pascal
 레코드 자료형 객체만을 포인팅하는 것으로 제한, forward reference만 가능
type nodeptr =↑node;  자료형 nodeptr은 node를 포인팅하는 포인터 자료형으로 선언
node = record
number:real;
next:nodeptr
end
var x, y : nodeptr;
 x, y : nodeptr 형의 포인터 변수
…
new(x);
 new(x) : node 형의 객체가 생성되고 x가 포인팅 함
…
dispose(x)
 dispose(x) : x에 배정된 객체 소멸
객체의 수명
 x : node형 객체를 가리키는 nodeptr형의 포인터 변수
x↑: node 형 객체 (변수명이 없는 익명 변수)
x↑.number : x가 가리키는 객체의 실수부분
x↑.next : x가 가리키는 객체의 포인터 부분
 연산 - 배정연산, 동등연산, 역참조(dereference)
 모든 포인터 변수에 속하는 포인터 상수 – nil (빈 포인터)
 변수 수명(life time) - 생성(new( ))부터 소멸(dispose( ))까지
자료형
포인터 사용 예
 Ada (pascal과 비교하여)
type NODE
type NODEPTR is access NODE
type NODE is record
NUMBER : REAL;
NEXT : NODEPTR;
end
 객체 생성 및 값 배정 (Pascal과 비교)
var P, Q:NODEPTR;
...
new(P);
P↑. NUMBER := 3 . 54;
P↑. NEXT := nil;
선언 / 초기화
var P, Q:NODEPTR := new NODE(3.54, nil);
 필드 접근과 복사 (Ada에서의 field 지정)
P.NEXT := Q.NEXT;
P.NUMBER := Q.NUMBER;
P.all := Q.all;
자료형
 Pascal과 Ada의 포인터 변수 비교
언어 포인터 배정
값 배정
필드 지정
생성
Pascal
p := q
p := q
p.필드명
new(p)
Ada
p := q
p.all := q.all
p.필드명
p:=new(자료형)[:=초기값]
 구조 자료형(Structured Data Types)
 구조 자료형
 여러 자료를 묶어 하나의 단위로 처리하는 자료형
 array - homogeneous data 모임
 record - heterogeneous data 모임
자료형
 배열(Array)
 이름, 차원, 원소형, 첨자 집합의 형과 범위로 구성
 첨자 : 일반적으로 연속적인 정수형 집합
 참고) Pascal : 스칼라 형 사용(실수형 불가)
 각 차원 : 하한(lb) ≤ 상한(ub)  크기(ub - lb + 1)
 예)
- Fortran, PL/I, Ada : A(5, 3, 7)
- Algol60, Algol68, Pascal : A[5, 3, 7]
/*함수 호출과 구별 */
 배열 첨자의 경계값 : 배열에서 상한/하한 값 표현
 • Fortran : 상수(정적)
• Algol : 정수 수식(동적)
• Pascal : 상수 (배경 : 프로시저가 임의의 크기 배열을 받아들일 수 없다)
- 배열 형 정의에서 기인 : 크기가 다른 형이면 다른 자료형
type asize10 = array[1..10] of integer;
asize20 = array[1..20] of integer;
 asize10, asize20은 서로 다른 형으로 인식
: 크기가 다른 배열들을 매개 변수로 전달 시,
 2개 이상의 자료형 배열을 받아들일 수 없음
 가능한 방법  최대 크기 배열 사용 [적응배열]-(배열 정의를 포함한 프로시저)
자료형
 FORTRAN
 DIMENSION A(100), B(10, 10)
A(100)
 1차원(100개), A(1), A(2), ..., A(100)
B(10,10)  2차원(100개), B(1,1), B(2,1),… B(10, 10)
 배열 첨자에 상수 사용(비 상수 사용 경우는 형식 매개변수 사용 시)
SUBROUTINE SORT(A , N)  A는 배열 이름, N은 배열 크기(정적)
DIMENSION A(N)
 Pascal (배열 첨자에 상수명 사용)
const numberofdays = 30;
var day : array[1.. numberofdays] of real;
 고정 크기의 배열 , 판독성, 유지보수 편리성 제공
 Ada (동적 배열 허용)
type SEQUENCE is array(INTEGER range <>) of FLOAT;
type SEQREF is access SEQUENCE;
정수수식 가능
P:SEQREF;
...
P := new SEQUENCE(1 .. 1000); or SEQUENCE(M .. N);
자료형
 동적 배열(dynamic array) 허용 언어
 Ada, PL/I, Algol60, Simula 등  Heap에 할당 후 포인터에 배정
 배열 명세표(descriptor)
 배열 이름, 원소형, 크기, 시작주소, 차원수, 각 차원의 상,하한값 등의 배열정보
를 저장하는 테이블
 모든 배열은 차원에 관계없이 1차원 기억장소에 저장되기 때문에 필요
 배열 저장 순서( A(1:2, 1:3)에 대해)
• 행 우선(row major) : 대부분 언어  A(1,1), A(1,2), A(1,3), A(2,1), A(2,2), A(2,3)
• 열 우선(column major) : Fortran  A(1,1), A(2,1), A(1,2), A(2,2), A(1,3), A(2,3)
자료형
 배열 명세표 사용 예
배열명
원소형
원소 길이
시작주소
차원수
첨자 하한
첨자 상한
real A(-2:2)
A
real
one location
α
1
-2
2
α
α+1
α+2
α+3
α+4
1차원 배열의 명세표
13.
21.
3.4
5.5
14.3
A(-2)
A(-1)
A(0)
A(1)
A(2)
배열명
원소형
원소 길이
시작주소
차원수
첨자 하한
첨자 상한
첨자 하한
첨자 상한
2차원 배열의 명세표
integer B(0:2,1:2)
B
integer
β
one location
β+1
β
β+2
2
β+3
0
β+4
2
β+5
1
2
13
21
3
5
14
25
B(0,1)
B(0,2)
B(1,1)
B(1,2)
B(2,1)
B(2,2)
A(3:10) 일때 A(7)의 위치 : base + (7-3) *2
자료형
base(20)
A(3)
A(7)
 배열 저장 위치
 base : 배열 시작 주소, s : 원소 크기, lbi, ubi : 상수
 1차원 A(lb1:ub1)에 대해
 loc(A(i)) = base + (i - lb1) * s = base - lb1 * s + i *s
 2차원 A(lb1:ub1, lb2:ub2)에 대해
 loc(B(i, j)) = base + (i - lb1) * (ub2 - lb2 + 1) * s + (j - lb2) * s
= base - s * lb1 * (ub2 - lb2 + 1) - s * lb2 + j * s + i * s * (ub2 - lb2 +1)
 Pascal
 배열 첨자 : 상수명 또는 실수형 제외한 스칼라형 (정수형, 열거형)
var temperature:array[months] of real;
i : months;
...
temperature :=(15.5, 12, 10.4, 29, 45, 65.5, 78, 84, 82, 61, 42, 22.5);
temperature[May] := 25.5;
for i :=Jan to Dec do x := x + temperature[i];
자료형
 Algol68
 [1:3] ref [ ] real w  3개의 실수 배열을 참조하는 항목을 갖는 실수형 배열 w 선언
<선언문>
<배정문>
[1:a] real x
[1:b] real y
[1:c] real z
w[1] :=x
w[2] :=y
w[3] :=z
<결과>
w
x
y
1
a
b
z
 이 경우, W[2][3]  y[3] 임
c
자료형
 배열 부분 선택 (w(1:3, 1:5)에 대해)
 slice : 배열의 연속된 일부분
 slice 표기 예
 PL/I
: w(3,*), w(*,5)  3행의 모든 열, 모든 행의 5번째 열
 Algol68 : w[3, ], w[ ,5], w[3,5] = w[ ,5][3], w[3,2:4] = w[3,2], w[3,3], w[3,4]
 APL
: w[3; ], w[ ;5]
 배열 연산
 Fortran, Algol60  배열 원소에 대한 연산만 가능
 APL, PL/I, Algol68  배열 배정 연산(A←B, A=B, A:=B)
 PL/I
: DCL A(10,10), B(10)  배열 복사 (B = A(i , *))
 배열 초기화(Ada)
type MAT is array(INTEGER range 1..2, INTEGER range 1..2) of INTEGER;
A : MAT :=((10, 20), (30, 40));  행 우선 초기화
A : MAT := (1 => (1 => 1, others => 0), 2 => (2 => 1, others => 0));
 단위 행렬
자료형
 배열 자료형의 고려사항들
 배열 이름과 배열 원소에 대한 구문
 원소 값에 대하여 어떤 자료형이 사용되는가?
 첨자로 어떤 자료형을 사용할 수 있는가?
 배열 크기의 바인딩 시간 ?
 배열 이름에 대한 주소 결정이 얼마나 복잡하게 되어 있는가?
 어떤 형태의 slicing을 제공하는가?
 배열을 초기화 시키기 위한 어떤 종류의 문장이 허용되는가?
 배열에 대한 내장된 연산은 어떤 종류가 허용되는가?
자료형
 레코드(Record)
 이질형 요소(heterogeneous element)들의 모임인 자료형 구성
 예) Pascal
type stock = record
name:array[1..30] of char;
 stock : 5개 필드로 구성된 레코드형
price:array[1..365] of real;
 필드
dividend:real;
① price, volumn : 숫자형 배열
volume:array[1..365] of integer;
② name : 문자형 배열
exchange:(nyse, amex, nasdaq)
③ dividend : 실수형
end;
④ exchange :
열거형(nyse, amex, nasdaq)
var newstock, ibm:stock;
 레코드 내의 필드 참조 방식
 newstock, ibm : 레코드형(stock) 변수
 필드(변수명) : 함수적 표현방법(Knuth)
 name(ibm), price(ibm)[25], dividend(ibm), volumn(ibm)[25], exchange(ibm)
 변수명.필드 (Pascal, Ada)
 ibm.name, ibm.price[25], ibm.dividend, ibm.volumn[25], ibm.exchange
 필드 of 변수명 (Algol68)  name of ibm, price[25] of ibm
자료형
 구조 자료형의 역사
 COBOL에서 시작(structure)
 PL/I, Pascal(record)  가변부(variant part : case … of문) 추가(Page 178, 181)
 레코드 내의 필드 참조 방식 : ( . )
 레코드 초기화 (Algo-w, Algol 68, Ada)
var ibm, csc:stock;
ibm :=make-stock('IBM', 0..0, 5.25, 0..0, nyse );
csc :=make-stock('Computer Science Corp.', 0..0, 0, 0..0, nyse);
 With문 초기화 (Pascal)
 변수명을 생략하는 필드 지정 구문
newstock.name :="dec";
newstock.dividend :=36;
newstock.exchange :=amex;
with newstock do
begin
name :="dec";
dividend :=36;
exchange :=amex;
end;
자료형
 Ada 레코드 사용 예
type stock = record
name:array[1..30] of char;
type FLIGHT;
type LISTOFFLIGHTS is access FLIGHT;
type FLIGHT is record
FLIGHTNO : INTEGER range 0..100;
SOURCE : STRING;
DESTINATION : STRING;
RETURNFLIGHT : LISTOFFLIGHTS;
end record;
X, Y : LISTOFFLIGHTS;
...
X.RETURNFLIGHTS := Y;
 X.RETURNFLIGHTS :
FLIGHT형을 가리키는 포인터
(여기서는 Y를 가리킴)
 확장 사용 가능
X.RETURNFLIGHTS.FLIGHTNO
X.RETURNFLIGHTS.SOURCE
자료형
link
P
q
downlin
k
link
 가변부 (Variant Part)
 판별자를 이용한 필드들의 택일 변환 기술
 Ada, Pascal  가변부를 위해 case문 사용
 예) Pascal
type listptr =↑listnode ;
type listnode = record
link:listptr ;
case tag:boolean of
false : (data : char) ;
true : (downlink : listptr)
end
var p, q : listptr ;
 판별자 tag 값에 따라 필드 결정
1) tag = false이면 data 필드 생성
2) tag = true이면 downlink 필드 생성
 다음의 문장 사용 가능
p↑.tag := true;
p↑.downlink := q;
p↑.tag := false;
writeln(p↑.data) // 현재 값 출력
q값이 동일 비트의 문자로 간주
 Pascal과 같은 가변부의 사용은 심각한 오류 발생 유도
 판별자 값만 바뀌고 내용이 변화되지 않은 상태에서 접근하는 경우
자료형
 가변부 (Variant Part)
<계속>
 예) EUCLID
 매개변수화 선언 : 실행 중 판별자 값이 변할 때, 발생되는 오류 제거
var x:listnode(true)
var y:listnode(false)
var z:listnode(any)
 위의 예제에서 z := y는 가능, y := z 불가
 해결법
 case discreminating w = z on tag of
 x는 tag 값이 true
y는 tag 값이 false
true => x := w; end
z은 tag 값이 true와 false
false => y := w; end
z := y; 가능
end case
 tag 초기화 후 배정 불가능
 Ada : 매개변수화 선언에 any 허용 않됨
자료형
 자료형 변환(Type Coercion, Conversion)
 자료형은 Static & Dynamic type checking 중 하나
 사용자(프로그래머)는 혼합형 연산을 사용하려 함
 자료형 변환
 묵시적 변환(수식 평가나 배정 시 발생)
 Fortran 등 초기 언어에서 시작(혼합형 연산) (예, R = I )
 PL/1 : 내장된 모든 자료형에 대한 묵시적 변환 제공 (예, Algol 68, 테이블)
 명시적 변환(cast)
 종류
 축소변환(narrowing) : 축소되는 크기로 변환(절단, 반올림 발생)
예) 정수형  문자형, 실수형  정수형 등
 확대변환(widening) : 확대되는 크기로 변환
예) 문자형  정수형, 정수형  실수형 등
자료형
 스칼라형 : 형 변환이 용이하기 때문에 대부분 언어에서 지원함
 구조형, 사용자 정의형 : 거의 불가능
 Pascal
 정수형에서 실수형, 부분영역들 사이에서만 N and W가능
var r:real;
i:integer;
...
i := r; 
불가능
 배정 연산에서 narrowing 불허
 단, 부분 영역형에서만 narrowing 허용
 실행시간에 형 검사 요구
 i = r 문장에 대해
i := round(r); 또는 i := trunc(r); 로 표현
 실수를 정수형로 확대 배정 허용의 미해결 문제점 존재
 정수형의 크기가 실수형의 가수 크기보다 클 때 허용
123.456  1.23456E2
123456 (가수부)
자료형
 자료형 동치(Type Equivalence)
 Algol68, Algol-W, Pascal
 주요 공헌 내용  자료형 기능 (사용자 정의 자료형, 강력한 자료형 요구 등)
 문제점(동치, 적법성)들을 내포
 자료형 적법성(양립성)(type compatibility)
 객체의 형이 특정 문맥에서 정당한지 결정하는 의미적인 규칙(semantic rules)
 일반적인 규칙
 이름 동치(name equivalence)
 함께 선언되거나 또는 동일 식별자 이름으로 선언되면 동일형으로 간주
 구조 동치(structural equivalence)
 구성요소가 모든 측면에서 같으면 동일형으로 간주
 선언 동치(declaration equivalence)
 이름 동치에서 함께 선언된 것만을 동일형으로 간주
자료형
 자료형 동치의 예
 예 1)
type T = array [1 .. 100] of integer;
var x, y : array [1 .. 100] of integer;
z : array [1 .. 100] of integer;
w : T;
 예 2)
type T2 = ...;
type T1 = T2
 규칙 ① x, y 동치. w는 x나 z와 다른 형
 규칙 ② x, y, z, w 모두 동치
 규칙  x, y 동치
 규칙 ① T1, T2는 다른 형
 규칙 ② T1, T2는 동치
 예 3)
type T1 = array[1 . . 100] of real;  규칙 ② T1, T2는 다른 형
 서로 다른 구조임
T2 = array[1 . . 10, 1 . . 10] of real;
자료형
 동치 규칙에 대한 장단점 존재
 이름 동치 : 단순 명료, 자료형 이름 정의 강요
 구조적 동치
 순서만 다르고 모든 것이 같은 열거형은 동치형인가 ?
 구조적으로는 같으나 개념이 다른 경우
 예)
type month = 1 .. 12;
dozen = 1 .. 12;  서로 다른 개념
....
var A:record x , y:real end;
B:record u , v:real end;  같은 구조이지만 다른 필드 이름
1) Pascal 6000 compiler release 1 : 이름 동치
2) Pascal 6000 compiler release 2 : 구조적 동치
3) Pascal 6000 compiler release 3 : 선언 동치
자료형
 선언 동치(declaration equivalence)
 함께 선언된 자료형끼리만 동치
 예)
type stock = record
name : array[1 .. 30] of char;
dividend : real;
price : array[1 .. 365] of real;
end;
var industrial, utility : stock;
transportation : stock;
1) 선언 동치하에서
industrial과 utility는 양립 가능
industrial과 utility는 transportation와 다른 자료형
2) 구조 동치나 이름 동치 : 세 변수 모두 동치
Programming Languages
-
자료형과 형 선언
열거, 기본, 포인터 자료형
구조적 자료형(배열, 레코드)
자료형 변환
자료형 동치
- The end of Chapter 6 –
To Be Continue ...