Programming Languages

Download Report

Transcript Programming Languages

제5장
변수, 바인딩, 식 및 제어문
 변수(Variables)
 정의
 이름, 속성(attribute)의 집합, 참조(reference), 값(value)의 4요소로 구성(ISO 정의)
 실행시간 저장된 값이 변경될 수 있는 객체(Generally)
 식별자(identifiers)
 제한된 길이의 영문자/숫자로 구성된 변수에서 하나의 요소(component)에 해당됨
 예) X :=3.14159의 의미
① 이름(식별자) : X
② 속성 : 원주율, 실수
변수의 4가지 요소(Component)
③ 참조(주소) : 값이 저장된 위치
④ 값 : 3.14159
이름
속성
참조(위치)
X
실수
값
정적 바인딩
동적 바인딩
3.14159
<D.W. Barron의 변수 표기법>
변수, 바인딩, 식 및 제어문
 Binding 개념
 바인딩 개념
 기본적인 추상화 메커니즘 – 언어 구성자에 이름(name) 또는 식별자를 사용하는 것
 사용된 이름 또는 식별자에 의미를 부여하는 것이 요구됨
 바인딩이란?
 이름에 어떤 속성을 연결하는 과정. 즉, 프로그램의 기본 단위에 이 단위가 택할 수
있는 여러 속성 중에서 일부를 선정하여 결정하는 행위
 바인딩 예
 const n = 5 ;
 var x : integer ;
 x := 2 ;
 이름 n에는 두개의 속성인 상수와 값 5가 바인딩
 이름 x에 변수와 정수라는 두개의 속성이 바인딩
 변수 x에 새로운 속성으로 값 2가 바인딩
 바인딩 시간
 바인딩(속성이 이름에 연결되고 계산되는 과정)이 발생되는 시간
 바인딩 시간의 종류
 언어정의시간, 언어 구현시간, 번역시간, 실행 시간
빠른 바인딩
늦은 바인딩
변수, 바인딩, 식 및 제어문
언어정의
언어구현(컴파일러 작성)
프로그래밍 과정
번역과정
실행과정
 바인딩 시간의 종류
 실행 시간 : 프로그램 실행 시간에 발생되는 바인딩(dynamic binding)
 예) 변수 값 배정, 변수와 자료 구조에 기억 장소 할당 등
① 모듈 프로그램 실행 시작 시간에 발생하는 바인딩
예) 형식 매개 변수와 실 매개 변수간의 바인딩, 지역 변수에 대한 기억 장소 할당
② 프로그램 실행 시 사용 시점에서 수시로 발생하는 바인딩
예) 배정문에 의해 값을 변수에 저장하는 바인딩
 번역 시간 : 언어를 번역하는 시점에서 발생되는 바인딩(static binding)
 번역시간  컴파일 시간, 링크 시간, 로드 시간
 예) 변수의 형, 자료 구조의 형과 크기, 레코드 항목들의 형을 확정
 언어의 구현 시간 : 언어 정의 시 원소들에 특성을 한정하지 않고,
언어를 컴퓨터 상에서 구현할 때 특성의 일부를 확정하는 바인딩
 예) 정수의 자릿수, 실수의 유효숫자 개수, 수의 기계 내에서의 표기법
변수, 바인딩, 식 및 제어문
언어정의
언어구현(컴파일러 작성)
프로그래밍 과정
번역과정
실행과정
 바인딩 시간의 종류(계속)
 언어 정의(Design) 시간 : 언어를 정의할 때 확정되는 바인딩
예) 언어 구문 정의(반복문, 허용되는 자료 구조, 연산 종류 등)
혼합형 연산(덧셈, 곱셈)에서 두 피연산자의 형(N, W) 결정에 관한 사항
예제 4.1) 배정문 Y := X + 10 에서 발생되는 바인딩과 시간
변수 x
: 현재값(실행) 자료형(코딩,번역), 자료형의 종류(설계)  cf) in pascal (번역)
상수 10 : 표현 방법(구현)과 의미(정의)
연산자 + : 성질(번역)과 의미(정의)
배정문 := : 성질(실행)과 의미(정의)
변수, 바인딩, 식 및 제어문
 바인딩 시간의 중요성
 언어들 간의 중요하고, 미묘한 차이점은 바인딩 시간의 차이에서 발생
 예) FORTRAN VS. SNOBOL4 (둘 다 수의 배열 허용)
- 큰 배열에 많은 연산이 포함된 문제는 Fortran이 적당
 대부분 번역 시간 바인딩, 실행시간에 적은 부분만이 바인딩 (실행시간 효율성)
- 배열의 크기나 자료형이 실행 시 변화되는 자료형의 처리는 Snobol4가 적당
 실행 중 자료가 입력되는 순간에 바인딩 발생(자료 처리의 적응성)
 빠른 바인딩은 효율성이 증가하고 늦은 바인딩은 적응성(유연성)이 증가
 바인딩 시간과 언어 구현




언어 정의 시 바인딩 시간이 명세화 됨.
그러나, 반드시 지켜지지 않음( 언어 구현에 따라 늦출 수도 있음)
따라서, 이미 정의된 언어의 특징들은 가능한 한 빠른 바인딩을 해야 함
정의된 언어는 적응성이 확정되었으므로 효율성만 증가시킬 수 있기 때문
변수, 바인딩, 식 및 제어문
 주요 언어에서의 식별자 바인딩 시간
컴파일 시간
(1) Fortran, Algol, PL/I, Pascal, Cobol 등 컴파일러 언어
: 대부분의 변수형 확정
(프로그램 작성 시간 포함)
(2) 상수값의 기계 내부 표현이 확정됨
번역 시간(정적)
바인딩
(static binding)
Linkage edit 시간
적재 시간 (load time)
실행 시간(동적)
바인딩
(dynamic binding)
호출 시간
(또는 모듈 시작 시간)
실행 시간 사용 시점
(reference)
(1) Fortran:COMMON 문에 주어진 이름의 상대 주소 확정
(2) Fortran, Algol, PL/I 등: 부프로그램 이름의 상대주소 확정
(1)
(2)
(3)
(4)
Fortran, Cobol: 모든 변수의 기억 장소 할당
PL/I: 정적 변수로 선언된 변수의 기억 장소 할당
Algol, Pascal: 전역(global) 변수의 기억 장소 할당
Fortran: DATA 문에서 정의된 값을 변수에 배정
(1) 실매개 변수를 형식 매개 변수에 연결
① by value: 실매개 변수값을 지역 변수에 배정
② by reference: 실매개 변수를 형식매개 변수로 사용할 수
있도록 주소를 배정
③ by name: 사용할 때 주소와 해당 값을 계산할 수 있는
thunk 루틴의 주소 확정
(2) Algol, Pascal:지역 변수에 대한 기억장소 할당(활성 레코드가
만들어짐)
(3) PL/I: AUTOMATIC 변수에 대한 기억장소 할당
(1) PL/I: BASED 변수 기억장소(ALLOCATE 문, FREE 문)
(2) APL, Lisp, Snobol4: 변수들의 자료형 배정, 기억 장소 할당
(3) 모든 프로그래밍 언어: 배정문 등에서 변수값을 배정
변수, 바인딩, 식 및 제어문
 선언(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를 실수형으로 변환 (W)
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의 정수형(I~N), 실수형 선언문(I~N 이외)
변수, 바인딩, 식 및 제어문
 배정문(Assignment statements)
 정의
 변수 내용을 변경시키는 기본 연산 문장
 각종 배정 연산자





Algol, Pascal
APL
Basic
Cobol
Fortran, PL/I
A :=B
AB
LET A =B
MOVE B TO A.
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
y
10
t
ref ref int z
z
20
....
x := y + z + 15 (* 이 경우 변수 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의 경우)
변수, 바인딩, 식 및 제어문
b=4일때
a
 Argument 평가 순서
1
1
1)
2)
<해석 방법>
1) b←1, a[b] ← b : b ←1 먼저?
2) a[b] ← b, b←1 : b 먼저?
 배정 연산 순위
 1. a[b←1]←b
 2. A[x]←P(x)
x (인덱스)의 위치가 달라진다?
<x가 p(x)에서 변환될 경우>
- 배열 A[x]와 함수 P(x) 중 누가 먼저 평가되나?
- Pascal, Algol60
A[x]의 l-value 먼저 구함
 3. N1, N2, …, Nk := e1, e2, …, ek
a,b,c = x1+x2, y1+y2, z1+z2;
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) 제거가 관건
 Cf) 식에 사용된 함수가 변수 값을 변경한다….. 참조 투명성 결여
 연산 순위 : 연산자 순위 기반, 괄호 사용, 결합 법칙 제공
 언어에서 제공되는 연산자 순위는 언어에 따라 차이가 남
 순위는 implicit (default) or explicit (괄호사용) 가능
 결합 법칙 : 동 순위 사이에서 발생되며 일반적으로 left-to-right 법칙을 따름
 연산 순위는 BNF로 제공하기도 함
 수식의 연산 순위를 표현하기 위해서는 추상 구문 트리를(AST) 사용
변수, 바인딩, 식 및 제어문
 연산자 우선 순위 (Precedence)
 몇몇 연산자들의 상대적 우선 순위는 표준화 되어 있음
 각종 언어에서 연산자 순위는 아래 표에서와 같이 서로 다름
Fortran
PL/1
ALGOL60
** (exponentiation)
*, /
+, .EQ., .NE., .LT., .LE., .GT., .GE.
.NOT.
.AND.
.OR.
**, unary +, unary -, ¬(not)
*, /
+, -
∥
=, <=, >=, >, <
¬=, ¬<, ¬>
↑(exp.)
×, /, ÷
+, -
<,≤,=, ≥, >, ≠
¬ (not)
∧ (and)
∨ (or)
⊃ (implies)
≡ (equivalent)
ADA
PASCAL
not
*, /, div, mod, and
+, -, or
=, <>, <=, >=, <, > , in (set)
**(exp.)
×, /, 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

: BCOND가 참이면 L1, 그렇지 않으면 L2로 분기
버전 업 후 대치 : IF (BCOND) <STMT> : <stmt>는 단일문만 허용( goto 사용 빌미)
 IF (ACOND) L1 , L2 , L3 : ACOND가 음수, 0, 양수에 따라 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
endif
endif
endif
변수, 바인딩, 식 및 제어문
 다중 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 실행
<expression > :
임의의 자료형 허용
열거형 도입
<case label list>는 <expression>의 상수
Default case 부재
GOTO를 이용한 case 레이블로 분기 방지
변수, 바인딩, 식 및 제어문
 Ada
 other절 도입
 expression은 열거형과 부분범위(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-repeat 문 (구현 예)
 탈출 방법
- 조건/무조건 분기문 이용
- 제한적 goto(exit)사용
<loop-until 예>
loop
if not <조건> then exit
<statement>
repeat
 Bliss-10 (다양한 exit 제공)
- exit, exitblock, exitcase, exitcommand, exitselect, exitloop, exitset
- goto문 제거로 인해 다양한 exit 문이 발생되었다는 인식은 잘못된 것임
단지, goto문은 비 구조적인 문제를 야기하는 요인으로 인식해야 함
 Bliss II (label을 사용하므로써 중첩된 scope을 한번에 탈출 가능)
exit <label> : <label>은 반복문 몸체, 복합문, case 문 등의 scope 이름
변수, 바인딩, 식 및 제어문
② 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
변수, 바인딩, 식 및 제어문
④ for : 반복 제어 변수 사용 반복문 (화려한 역사를 갖음)
 예) Pascal, C, Ada, Algol의 for문
 예) FORTRAN의 DO문
 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 30 I = 2, K
Z=RAN(iseed)
30 F(I)=Z*(FMAX-FMIN)+FMIN
 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도 동일)
변수, 바인딩, 식 및 제어문
 Java, C에서의 for문의 구성
 expr들의 실행 순서
①
②
⑤
for ( <expr1>; <expr2>; <expr3> )
⑥
③
<stmt>
④
변수, 바인딩, 식 및 제어문
 GOTO문
 GOTO 문
 레이블(Label)을 사용하는 제어의 모든 문장을 지칭
 직접적 순서 제어, 기계어 특성 표현, 효율적 실행 보장, 사용 편리, 타 제어문 없이 모든
알고리즘 표현 가능
 레이블 사용에 따른 분류
1) 번역시간 레이블을 태그로만 사용
- 번역 시 레이블을 기계어 코드의 분기 위치로 번역(Fortran, Basic)
2) 실행시간 레이블을 제한된 자료 항목으로 간주
- 레이블 값을 읽거나 계산할 수 없음
- 레이블 변수, 레이블 배열, 비지역 레이블 참조, 레이블 매개변수 등 사용 가능
- Algol은 비지역 레이블, 형식 매개변수 참조 등으로 인해 1)처럼 수행하지 못함
3) 실행시간 일반 자료 항목으로 간주(Snobol4, APL)
- 실행시간에 레이블을 읽거나 계산할 수 있도록 허용
- 실행시간 레이블 이름과 코드 테이블이 필요
….
READ X
….
GOTO X
변수, 바인딩, 식 및 제어문
 GOTO문의 장단점
 장점
 GOTO문 제어구조를 하드웨어가 제공
 GOTO문 제어구조의 완벽한 범용성
(모든 알고리즘 표현 가능, 他 순서 제어문은 편의 제공일 뿐)
 단점
 프로그램 질 저하 유도
 판독성 저하(비구조적)
 프로그램 유지보수의 난해성
 GOTO문의 잔존 여부 : 論亂의 대상




Fortran, Basic의 산술 if문은 GOTO문 개념이 논리 IF문보다 더 많이 포함
pure LISP, Bliss : GOTO문 사용 금지
Pascal : 제한적 사용
Java : GOTO 예약어가 있지만 지원하지 않음
 GOTO문 제거는 다양한 순서 제어문을 요구 (택일문, 반복문, 되부름 등)
Programming Languages
- The end of Chapter 5 -
To Be Continue ...