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
AB
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.