Programming Languages - cybertec.cheju.ac.kr:::::::::

Download Report

Transcript Programming Languages - cybertec.cheju.ac.kr:::::::::

제6장
변수, 수식 및 제어문
 변수(Variables)
 정의
 이름, 속성(attribute)의 집합, 참조(reference), 값(value)의 4요소로 구성
 식별자(identifiers)
 제한된 길이의 영문자/숫자로 구성된 변수의 한 요소(component)
 예) X :=3.14159의 의미
① 이름 : X
② 속성 : 원주율, 실수
③ 참조 : 값이 저장된 위치
④ 값 : 3.14159
이름
속성
X
실수
정적 바인딩
참조
3.14159
값
동적 바인딩
<D.W. Barron의 변수 표기법>
변수, 수식 및 제어문
 선언문(Declarations)
 정의
 실행시 사용될 자료의 속성을 언어의 번역기에게 알려 주는 프로그램 문장
 자료의 속성
 제한된 자료형, 크기, 이름, 생성 시기, 소멸 시기, 참조하기 위한 첨자 등
생성, 소멸 시기 : 블록 시작과 종료
자료형 : 1차원 배열
원소의 수 : 9
첨자 범위 : 2 ~ 10
원소 자료형 : 정수
배열 이름 : X
예
 Algol의 선언문
integer array x[2:10]
변수, 수식 및 제어문
 목적
 효율적인 주기억 장치 사용과 접근
 변수, 배열, 레코드 등의 효율적인 접근 가능
 효율적인 주기억 장치 경영
 생성과 소멸 시점을 알 수 있으므로 스택 기반 기억장소 할당 등 수행 가능
 정적 형 검사(static type checking) 가능
 형 고정 연산(type specific operation) : 하드웨어 제공
 혼합형 연산(mixed operation) : 프로그래밍 언어 제공
 정적 형 검사로 혼합형 연산을 형 고정 연산으로 변환  효율성 추구
cf) 혼합형 연산의 동적 형 검사  적응성 추구
 선언문의 예
real X;
integer Y;
...
X+Y
번역기 동작(정적 형 검사)
1) 혼합형 연산 발견
2) Y를 실수형으로 변환
3) 실수형 덧셈코드 생성
변수, 수식 및 제어문
 정적 형 검사 (static type checking)
 모든 변수의 자료형 선언 요구
 단점 : 자료 생성, 소멸, 내용 변경 방법에 많은 제약 존재
 장점 : 실행 시간 효율이 높음
 정적 형 검사 언어 : Fortran, Algol, PL/I, Cobol, Pascal 등
 동적 형 검사 (dynamic type checking)
 선언문 사용 안함
 장점 : 프로그래밍 단순화, 적응성(flexibility) 높음
 단점 : 프로그램 실행 시간 지연, 자료 표현상의 효율 저하,
복잡한 기억장소 경영 기법 요구
 동적 형 검사 언어 : Lisp, APL, Snobol 4
 Algol, PL/I, Ada
 약간의 효율성을 상실하면서도 실질적인 큰 적응성을 얻는 선언문을 채택
 예 : 배열 real array x[m1:n1,m2:n2]
 default 선언은 선언문으로 간주됨
예 : Fortran의 정수형, 실수형 선언문
차원수와 자료형 선언
번역시간 : 효율적인 코드 생성
실행시간 : 첨자 범위 결정
변수, 수식 및 제어문
 배정문(Assignment statements)
 정의
 변수 내용을 변경시키는 기본 연산 문장
 각종 배정 연산자
 제한된 자료형 각종 배정 연산자
 Algol, Pascal
A :=B
 APL
AB
 Basic
LET A =B
 Cobol
MOVE B TO A.
 Fortran, PL/I
A =B
 l-values와 r-values
 배정 연산자의 왼쪽(l-value)과 오른쪽(r-value)을 의미
 예:
A := B
l-value
r-value
변수, 수식 및 제어문
 l-value와 r-value
 l-value 값이 저장되는 위치(주소, 참조)
 r-value 저장되는 값(수식, 변수, 상수, 포인터, 배열원소 등)
예:
자료형
l-value
r-value
변수
변수의 주소
변수의 값
배열 “A[i]”
i번째 원소 위치
원소 A[i]의 값
상수 “3.5”
없음
값 3.5
포인터 “P”
P가 저장된 위치
P가 지적하는위치
변수, 수식 및 제어문
 Bliss
 변수 이름 : l-value 뿐임
 r-value는 변수 앞에 점(.) 사용
 A ← .B + .C B, C의 r-value를 더하여 변수 A (A의 l-value)에 저장
 A← B
B의 l-value (B의 주소)를 변수 A에 저장
 Algol 68
 선언문에서 “ref” 사용하여 l-value 표현
 예 : ref int x
(* 변수 x를 integer 선언 *)
int y
(* y는 integer 상수로 선언 *)
ref ref real z
(* 변수 z는 real값이 들어 있는 위치에 대한 포인터 *)
 예 : ref int x, y
ref ref int z
....
x := y + z + 15
y
10
t
z
20
(* 이 경우 변수 x에 배정된 값은 45 *)
* 수식 계산에서 최종 r-value 값을 구하는 dereferencing은 자동 처리
변수, 수식 및 제어문
 배정문 A := expr에 대한 구현
1) l-value 중심 배정 (Fortran, C 등 컴파일러 언어가 사용)
 “수식 expr을 계산하고, A의 속성으로 변환 후 배정”
 효율적인 기억장소 경영
 정적 형 검사
 빠른 접근
 효율성 증가
1) r-value 중심 배정 (APL 등 인터프리터 언어가 사용)
 “수식 expr을 계산하고, A의 속성을 expr의 계산 결과와 동일한 속성으로
변환 후 배정하는 기법 속성으로 변환 후 배정”
 동적 형 검사
 불필요한 변환 없음
 적응성(flexibility) 증가
변수, 수식 및 제어문
 배정 연산에 관한 사항
 이명(alias)
 2개 이상의 변수가 동일한 기억 장소를 참조할 때에 이들 변수 사이의 관계
X
Y
<이명(Aliasing)의 개념>
 X는 Y에 이명(aliasing) - (역도 성립 : Y는 X에 이명)
 Fortran의 EQUIVALENCE, Cobol의 REDEFINES, C의 union (기억장소 공유)
* 기억 장소 공유가 프로그램의 심각한 오류 발생, 최적화에 방해
 Euclid : 주요 설계 목적으로 aliasing 제거 노력, 완벽하지 못함
 C : 포인터 변수를 이용한 alias 발생
 alias가 매개변수에 의하여 발생되기도 함 (call by reference의 경우)
변수, 수식 및 제어문
 Argument 평가 순서
 배정 연산 순위
 1. a[b←1]←b
 2. A[x]←P(x)
<해석 방법>
1) b←1, a[b] ← b
2) a[b] ← b, b←1
<x가 p(x)에서 변환될 경우>
- A[x]와 P(x) 중 누가 먼저 평가되나?
- Pascal, Algol60
A[x]의 l-value 먼저 구함
 3. N1, N2, …, Nk := e1, e2, …, ek
p, q := q, p (서로 값이 교환될까?)
 4. B[I], b[j] := p, q
- l-value와 r-value 중 누가 먼저 평가되나?
(일반적으로 l-value가 먼저 평가됨)
- l-value / r-value 내에서 평가 순서는?
( i = j 일 때 결과는?)
 dereferencing : 대부분의 경우 자동, Bliss 언어와 같은 예외도 있음
변수, 수식 및 제어문
 상수와 초기화(Constant & Initialization)
 상수와 초기화
 프로그램이 실행되는 동안 값이 변하지 않는 식별자
 상수 개념 제공 : Pascal, Ada, Fortran 77
 상수 선언 허용 시 고려사항
 단순 변수 또는 구조 변수(record, array)
 상수 값 표현 : 수식 가능 여부
 상수 값 배정 시간 (정적, 동적 배정 가능?)
 predefined constant 제공 여부
변수, 수식 및 제어문
 상수와 초기화의 예
 Pascal
 const 사용
 숫자, 스트링, 열거형 값 등 허용 (스칼라 형)
 true, false, maxint 등 제공
 const pi = 3.14159;
 변수 초기화 제공 안함
 Algol68
 배정 연산자와 상수 선언 연산자의 구별(:=, =)
 real root2 := 1.414213 변수 선언과 초기화
 real root2 = 1.414213
상수 선언
변수, 수식 및 제어문
 상수와 초기화의 예(계속)
 Ada
 constant (모든 자료형에 사용 가능)
 X:constant INTEGER :=17;
상수 선언
 Y:INTEGER :=17;
변수 선언과 초기화
 구조적 자료형의 초기화
 type NATURAL is 1..N;
 type ROSTER is array (NATURAL) of INTEGER;
 LINEUP:ROSTER (1..100);
배열 선언
 LINEUP := (1..50=>1, 51..100=>-l);
배열 배정문
 LINEUP:ROSTER (1..100) := (1..50=>1 , 51..100=>-l); 배열 선언&초기화
 LINEUP:constant ROSTER (1..100) := (1..50=>1, 51..100=>-l); 상수 선언
 Fortran
 DATA문 (변수 초기값 설정)
 PARAMETER문 (상수 선언, Fortran77 이후 언어)
변수, 수식 및 제어문
 수식(Expression)
 수식
 목적 : 계산될 값을 기술한 문장
 구성 : 피연산자(상수, 변수, 함수 등)와 연산자로 구성
 참조 투명성(referential transparency) : 수식 평가는 환경 변화없이 값만을 생성
 참조 투명성을 보장하기 위해 副作用(side-effect) 제거가 관건
 연산 순위 : 연산자 순위(implicit), 괄호 사용(explicit), 결합 법칙 제공
 언어에서 제공되는 연산자 순위는 언어에 따라 차이가 남
 결합 법칙 : 동 순위 사이에서 발생되며 일반적으로 left-to-right 법칙을 따름
 언어의 연산 순위는 BNF로 제공하기도 함
 수식의 연산 순위를 표현하기 위해서는 추상 구문 트리를 사용
변수, 수식 및 제어문
 연산자 우선 순위
 몇몇 연산자들의 상대적 우선 순위는 표준화 되어 있음
 각종 언어에서 연산자 순위는 아래 표에서와 같이 서로 다름
Fortran
PL/1
ALGOL60
**
*, /
+, .EQ., .NE., .LT., .LE., .GT., .GE.
.NOT.
.AND.
.OR.
**, unary +, unary -, ¬
*, /
+, -
∥
=, <=, >=, >, <
¬=, ¬<, ¬>
↑
×, /, ÷
+, -
<,≤,=, ≥, >, ≠
¬
∧
∨
⊃
≡
ADA
PASCAL
not
*, /, div, mod, and
+, -, or
=, <>, <=, >=, <, > , in
**
×, /, mod, rem
+, -, not(unary)
+, -, &
=, /=, <, <=, >, >=
and, or, xor
변수, 수식 및 제어문
 ADA의 수식에 대한 EBNF
<expression> ::= <relation> { and <relation> } | <relation> { or <relation> }
| <relation> { xor <relation> }
<relation> ::= <simple_expression> [ <relational_op> <simple_expression> ]
<simple_expression> ::= [ <unary_op> ] <term> { <add_op> <term> }
<term> ::= <factor> { <mul_op> <factor> }
<factor> ::= <primary> [ <exponen_op> <primary> ]
<primary> ::= <literal> | <aggregate> | <name> | <allocator> |
<function_call> | <qualified_expression> | ( <expression> )
<relational_op> ::= = | /= | < | <= | > | >=
<add_op> ::= + | - | &
<unary_op> ::= + | - | not
<mul_op> ::= * | / | mod | rem
<exponen_op> ::= **
변수, 수식 및 제어문
 ADA의 임의 수식에 대한 Parse Tree 예
수식 : not A ** B * C / D > - E + F and G mod H >= I
exp
exp = <expression>
rel = <relation>
s.e = <simple_expression>
t = <term>
f = <factor>
p = <primary>
v = <variable>
rel
rel
s.e
s.e
t
f
not
s.e
s.e
t
t
t
t
f
f
f
f
f
f
p
p
p
p
p
p
p
p
v
v
v
v
v
v
v
v
A
**
B
*
C
/
D
>
-
E
+
F
and
G
mod
H
f
p
v
>=
I
변수, 수식 및 제어문
 논리 조건
 적용 순서(applicative order)
 operand1 op operand2
 평가 순서는 operand1, operand2를 계산한 후, 연산자 op를 적용
단, 논리 연산에서는 이 적용 순서를 바꿀 수 있는 특성이 있음
 예 : x ≠ 0 or y / x < 1
 x가 0이 아니면 무조건 참
x ≠ 0 and y / x < 1  x가 0이면 무조건 거짓, x 값이 0일 때는 값이
거짓으로 결과가 존재하나, 위의 적용 순서를
따르면 y / x에서 overflow 발생
* 이 두 경우에서 or와 and의 뒷부분을 연산하지 않기 위해 새로운
연산자 단회로 도입
 단회로(short circuit)
 부울 수식에서 일부 피연산자만으로 평가하는 기법
 예 : x cand y = if x then y else false
x cor y = if x then true else y
 ADA - and then, or else 사용
변수, 수식 및 제어문
 조건문(Condition Statements)
 FORTRAN : GOTO문 요구 판독성 저하
 IF (BCOND) L1 , L2
IF (BCOND) <STMT>
IF (ACOND) L1 , L2 , L3
 Algol 60 : 택일문 처리, dangling else 발생
 if condition then S1 else S2
 Fortran 77에서는 dangling else의 해결로 ENDIF 사용
표 6.5 중첩 if문 구조
if C1 then S1
else if C2 then S2
........
else if Cn then Sn
else Sn+1
........
end if
end if
변수, 수식 및 제어문
 다중 if의 새로운 구문 형태
 다수의 endif 사용을 줄이고 판독성을 증가시키기 위해 새 구문 형태 도입
 예) Algol 68의 elif(최초 시도), Ada의 elsif
Ada의 elsif 사용한 표 6.5 개선 예
if C1 then S1
elsif C2 then S2
elsif C3 then S3
...........
elsif Cn then Sn
else Sn+1
endif;
변수, 수식 및 제어문
 CASE 문
 if-then-else를 확장한 택일문
 Algol-w(Hoare, Wirth)
case <integer expression > of
begin
S1;S2;. . .;Sn
end
 Pascal
case <expression> of
<case label list>:<stmt>
...
<case label list>:<stmt>
end
<integer expression > :
(1 ~ n) 정수, 임의 i 이면 Si 실행
열거형 도입
<case label list>는 <expression>의 상수
변수, 수식 및 제어문
 Ada
 other절 도입
 열거형과 부분범위(range)형
case thismonth is
when Feb|Apr|Jun..Aug => birthday := 4;
when Sep => birthday := 1;
when others => birthday := 0;
endcase;
 case문 고려 사항






선택자 수식(selector expression)으로 허용된 자료형은 무엇인가?
case 레이블에 허용되는 자료형은 무엇인가?
case문의 내부 또는 외부로부터 case 레이블로 분기될 수 있는가?
레이블간의 상호 배제를 요구하는가?
레이블간의 상호 배제가 요구되지 않은 경우, 실행을 중복하는가?
수식으로부터 발생되는 모든 경우들을 처리해야 하는가?
변수, 수식 및 제어문
 반복문(Iterative Statements)
 반복문
 반복 수행 - 컴퓨터 중요 특성, 초기언어부터 사용
 종류
<loop-until 예>
① 가장 간결한 형태 (괄호 사용 개념)
loop
 loop-repeat 문 (구현 예)
if not <조건> then exit
<statement>
 탈출 방법(조건/무조건 분기문 이용)
repeat
goto(비구조적)  exit(제한적 goto)
 Bliss-10 (다양한 exit 제공)
exit, exitblock, exitcase, exitcommand, exitselect, exitloop, exitse
 Bliss II (label을 사용하므로써 중첩된 scope을 한번에 탈출 가능)
exit <label> : <label>은 scope 이름
반복문 몸체, 복합문, case 문 등
변수, 수식 및 제어문
② while 문
 시작 부분에서 반복 조건 검사 (0번 이상 반복 가능)
<loop-repeat로 표현>
while <bcond> do
<statement>
end
loop
if not <bcond> then exit
<statement>
repeat
③ repeat-until 문
 마지막 부분에서 반복조건 검사 (1번 이상 반복 가능)
<loop-repeat로 표현>
repeat
<statement>
until <bcond>
loop
<statement>
if not <bcond> then exit
repeat
변수, 수식 및 제어문
④ 반복 제어 변수 사용 반복문 (화려한 역사를 갖음)
 예) Fortran의 DO문, Pascal, C, Ada, Algol 등등의 for문
 for 문에서 고려할 점
 반복 변수가 택할 수 있는 값들의 자료형은?
 초기값, 최종값, 증분값에 수식의 허용여부와 수식 결과의 자료형은?
 반복시 최종값과 증분값은 얼마나 자주 평가되는가?
 반복 변수와 최종값은 언제 비교되나?
 반복문 내에서 배정문으로 반복 변수가 변경될 수 있나?
 반복문 종료후 반복 변수가 갖는 값은?
 반복문 내외로 제어 이동이 허용되나?
 반복 변수의 영역(scope)은?
변수, 수식 및 제어문
 Algol60 (Alogol60 보고서 내용)





for <var> :=<init> step <incr> until <final>
반복 변수와 최종값 먼저 비교
do <stmt>
초기값, 최종값, 증분값(임의 수식)
자료형 : 실수형, 정수형, 혼합형 연산 허용
최종값, 증분값은 비교시 매번 재평가
보고서의 설명 예
a step b until c

v := a
L1 : if (v - c) * sign(b) > 0 then goto exit ;
<statements>
v := v + b
goto L1;
exit :
 반복문 정상 종료시 반복 변수 값 정의되지 않음
 goto문 탈출시 반복 변수 값 유지
 for 문 내부로 제어 이동시 결과 미정의
변수, 수식 및 제어문
 Pascal






변수의 초기, 최종값은 동일 자료형(스칼라형, 실수형 제외)
초기, 최종값은 시작전 한번만 계산
변수와 최종값 비교 먼저
Pascal의 for문
종료후 반복 변수의 값 미정의
for <var> :=<init> to <final> do <stmt>
반복문 변수 열거형 사용
또는 for <var> :=<init> downto <final> do <stmt>
증분값 : to, downto
 Fortran II의 DO 문 (최초의 반복문)
 DO 문 몸체가 적어도 한번 수행
 초기값, 증분값, 최종값 : 정수형 상수나 변수
 반복문 수행후 반복 변수의 값에 대해서는 언급 없음
 Algol68의 For 문
Algol 68의 for문
[for <var>] [from <E1>] [by <E2>] [to <E3>]
 E1, E2, E3 : 정수 수식, 한번만 평가
[while <E4>] do <Stmt> od
(Algol 60은 임의 수식, 매번 평가)
 반복 변수 영역 : 몸체부 국한 (Ada도 동일)
변수, 수식 및 제어문
 GOTO문
 GOTO 문
 레이블 제어 모든 문장을 지칭
 기계어 특성 그대로 표현 (효율적 실행 보장)
 사용 편리 (타 제어문 없이 모든 알고리즘 표현 가능)
 레이블 사용에 따른 분류
1) 레이블을 태그로만 사용 (번역시)
레이블  기계어 코드의 분기 위치로 번역(Fortran, Basic)
2) 레이블을 제한된 자료 항목으로 간주 (레이블 값을 읽거나 계산하지 못함)
레이블 변수, 레이블 배열, 레이블 매개변수, 비지역 레이블 참조 등
Algol(비지역 레이블, 형식 매개변수 참조)
3) 일반 자료 항목으로 간주(Snobol4, APL)
...
READ X
...
GOTO X
...
변수, 수식 및 제어문
 GOTO문의 장단점
 장점
 GOTO문 제어구조를 하드웨어가 제공
 GOTO문 제어구조의 완벽한 범용성
(모든 알고리즘 표현 가능, 他 순서 제어문은 편의 제공일뿐)
 단점
 프로그램 질 저하 유도
 판독성 저하(비구조적)
 프로그램 유지보수의 난해성
 GOTO문의 잔존 여부 : 論亂의 대상
 Fortran, Basic의 if문은 GOTO문
 pure LISP, Bliss : GOTO문 사용 금지
 Pascal : 제한적 사용
 GOTO문 제거  다양한 순서 제어문 요구 (택일문, 반복문, 되부름 등)
Programming Languages
- The end of Chapter 6 -
To Be Continue ...
Copyright, 1999 © H. Y. Kwak, Cheju National University.