Download - 제 6 장 변수 , 바인딩 , 식 및 제어문
제 6 장 변수 , 바인딩 , 식 및 제어문
6.1 변수
6.2 바인딩
6.3 선언
6.5 상수 및 변수 초기화
6.6 표현식
6.7 조건문
6.8 반복문
6.9 GOTO 문6.4 배정문
정의
6.1 변수
이름 , 속성 (attribute) 의 집합 , 참조 (reference),
값 (value) 의 4 요소로 구성
<D.W.Barron<D.W.Barron 의 변수 표기법의 변수 표기법 >>
값
3.14159
X
이름 속성
실수
참조
정적 바인딩 동적 바인딩
예 ) X :=3.14159 의 의미 ① 이름: X ② 속성 : 원주율 , 실수 ③ 참조 : 값이 저장된 위치 ④ 값 : 3.14159
바인딩 (binding) 개념
6.2 바인딩
예 )
프로그램의 기본 단위에 이 단위가 택할 수 있는여러 속성 중에서 일부를 선정하여 결정하는 행위
const n = 5;이름 n 에 두개의 속성인 상수와 값 5 바인딩x := 2;변수 x 에 새로운 속성 값 2 가 바인딩
정의
바인딩 시간의 종류
실행 시간
프로그램 실행시간에 발생되는 바인딩 : 동적 바인딩 (dynamic binding)예 ) 변수값 배정 , 변수 , 자료구조의 기억장소 할당
모듈의 시작 시간예 ) 형식 매개 변수와 실 매개변수의 바인딩실행 시간의 사용시점예 ) 배정문의 값 저장
번역 시간
언어를 번역하는 시점에서 발생되는 바인딩: 정적 바인딩 (static binding)예 ) 변수의 형 , 자료 구조형 , 크기
언어의 구현 시간
구현 할 때 특성의 일부 확정하는 바인딩예 ) 정수 자릿수 , 실수의 유효숫자 개수
바인딩 시간의 중요성
언어들 간의 중요하고 , 미묘한 차이점은 바인딩 시간의 차이에서 발생
빠른 바인딩은 효율성이 증가하고 늦은 바인딩은유연성 (flexibility) 이 증가
바인딩 시간과 언어 구현
주요언어에서 식별자의 바인딩시간
번역 시간 바인딩( 정적 바인딩: static binding)
컴파일 시간( 프로그램 작성 시간 포함 )
Linkage edit 시간
적재 시간 (load time)
(1) Fortran, Algol, PL/I, Pascal, Cobol 등 컴파일러 언어 : 대부분의 변수형 확정(2) 상수값의 기계 내부 표현이 확정됨
(1) Fortran : COMMON 문에 주어진 이름의 상대 주소 확정(2) Fortran, Algol, PL/I 등: 부프로그램 이름에 관한 상대 주소 확정
(1) Fortran, Cobol : 모든 변수의 기억 장소 할당(2) PL/I : 정적 변수로 선언된 변수의 기억 장소 할당(3) Algol, Pascal : 전역 (global) 변수의 기억 장소 할당(4) Fortran : DATA 문에서 정의된 값을 변수에 배정
실행 시간 바인딩( 동적 바인딩:dynamic binding)
호출 시간( 또는 모듈 시작 시간 )
(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) 모든 프로그래밍 언어: 배정문 등에서 변수값을 배정
실행 시간 사용 시점(reference)
예ALGOL 의 선언문integer array x[2:10]
Java 의 선언문Int[] x = new int[9]
생성 , 소멸 시기 : 블록 시작과 종료자료형 : 1 차원 배열원소수 : 9첨자 범위 : 2 ~ 10원소 자료형 : 정수배열 이름 : X
생성 , 소멸 시기 : 블록 시작과 종료자료형 : 1 차원 배열원소수 : 9첨자 범위 : 2 ~ 10원소 자료형 : 정수배열 이름 : X
선언문의 목적
효율적 주기억 장치 사용과 접근 가능자료 속성 한정변수 , 배열 , 레코드 등의 효율적인 접근 :
최적화주기억 장치의 사용량 감소실행 시간 감소
효율적 주기억 장치 경영 가능
실행시 보다 효율적 기억 장소 할당예 ) ALGOL : stack 인터프리터 언어 : heap allocation Java : stack + heap
정적 형 검사 (static type checking) 가능
형 고정 연산 (type specific operation) : 하드웨어 제공
혼합형 연산 (mixed operation): 프로그래밍 언어 제공
정적 형 검사로 혼합형 연산을 형 고정 연산으로변환 : 효율성 추구
선언문의 예 real x; integer y; … x + y;
정적 형 검사 (static type checking)
모든 변수의 자료형 선언 요구장점 : 실행 시간 효율성 높음단점 : 자료 생성 , 소멸 , 내용 변경에 많은 제약정적 형 검사 언어 : FORTRAN, ALGOL, PL/I 등
동적 형 검사 (dynamic type checking)
선언문 사용 안함장점 : 프로그래밍 단순화 , 적응성 (flexibility) 높음단점 : 실행 시간 지연 , 자료 표현상 효율 저하복잡한 기억 장소 경영동적 형 검사 언어 : LISP, APL, SNOBOL4
ALGOL
약간의 효율성 상실하여 실질적 큰 적응성 얻는선언문 채택
예 ) ALGOL 68 [1:n] int a; [1:m] int b;
번역 시간 : 효율적 코드 생성실행 시간 : 첨자 범위 결정
Default 선언은 선언문 간주 ( 묵시적 선언문 )
FORTRAN 의 정수형 , 실수형 , 선언문
6.4 배정문
프로그래밍 언어 배정문 구문
C, Java, Fortran
Algol, Pascal
APL
Basic
Cobol
A = B
A := B
A B
LET A = B
MOVE B TO A
A := B
l-value r-value
값이 저장되는 위치 저장되는 값 ( 주소 , 참조 ) ( 수식 , 변수 , 상수 등 )
l-values 와 r-values
배정 연산자의 왼쪽 (l-value) 과 오른쪽 (r-value) 을의미예 )
l-value 와 r-value 예
자료형
변수
배열 “ A[i]”
상수 “ 3.5”
포인터 “ P”
r-value
변수의 값
원소 A[i] 의 값값 3.5
P 가 지적하는위치
l-value
변수의 주소
i 번째 원소 위치
없음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 표현 e.g.) ref int x (* 변수 x 를 integer 선언 *) int y (* y 는 integer 상수로 선언 *) ref ref real z (* 변수 z 는 real 값이 들어있는 위치에
대한 포인터 *) e.g.) ref int x, y
ref ref int z . . . x := y + z + 15 이 경우 변수 x 에 배정된 값은 45 * 수식 계산에서 최종 r-value 값을 구하는 dereferencing 은 자동
z t
20
y 10
배정문 A:= expr 에 대한 구현l-value 중심 배정 ( Fortran, C 등 컴파일러 언어가 사용 )
“ 수식 e 를 계산하고 , A 의 속성으로 변환 후 배정”효율적인 기억장소 경영 - 정적 형 검사 - 빠른 접근 - 효율성 증가
r-value 중심 배정 (APL 등 인터프리터 언어가 사용 )“ 수식 e 를 계산하고 , A 의 속성을 e 의 계산 결과와 동일한 속성으로 변환 후 배정하는 기법”
동적 형검사불필요한 변환 없음적응성 (flexibility) 증가
구문 정의
조건목적지 배정문 -C-
#include <stdio.h>
int main(void){
int flag = 0;int count1,count2;
flag?(count1 = 1): (count2 = 0);
printf("count1 = %d\n",count1); printf("count2 = %d\n",count2);
}
구문 정의
조건목적지 배정문 -C++-
#include <iostream>using namespace std;
int main(void){ bool flag = false; int count1, count2;
flag?count1=1:count2=0;
cout<<"count1 = "<<count1<<endl; cout<<"count2 = "<<count2<<endl;
}
구문 정의
조건목적지 배정문 -Java-
public class Test { public static void main(String[] args) {
boolean flag = false; int count1 = 0; int count2 = 0; int a;
a = flag ? (count1 =2) : (count2 = 1);
System.out.println("count1 = " + count1); System.out.println("count2 = " + count2);
System.out.println(flag ? (count1 =1) : (count2 = 0));
}}
단항 배정 연산자
sum = ++ count; count = count + 1;
sum = count;
sum = count++; sum = count;
count = count + 1;
count++; count = count +1;
- count ++
복합 배정 연산자
a = a + b
상수와 초기화 (Constant & Initialization)
6.5 상수 및 변수 초기화
프로그램이 실행되는 동안 값이 변하지 않는 식별자상수 개념 제공 : Pascal, Ada, Fortran상수 허용 시 고려사항
① 단순 변수 또는 구조 변수 (record, array)② 상수 값 표현 : 수식 가능 여부③ 상수 값 배정 시간 ( 정적 , 동적 배정 가능 ?)④ predefined constant 제공 여부
Pascal
const 사용숫자 , 스트림 , 열거형 값 등 허용 ( 스칼라 형 )true, false, maxint 등 제공const pi = 3.14159;변수 초기화 제공 안함
Algol68
배정 연산자와 상수 선언 연산자의 구별 (:=, =)real root2 := 1.414213 변수 선언과 초기화real root2 = 1.414213 상수 선언
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 ) ; 상수 선언
Ada
constant ( 모든 자료형에 사용 가능 ) X : constant INTEGER :=17 ; 상수 선언 Y : INTEGER :=17 ; 변수 선언과 초기화
구조형 자료형의 초기화
수식 (Expression)
6.6 표현식
목적 : 계산될 값을 기술한 문장피 연산자 ( 상수 , 변수 , 함수 등 ) 와 연산자로 구성참조 투명성 (referenctial transparency)
: 수식 평가는 환경 변화 없이 값만을 생성참조 투명성을 보장하기 위해 부작용 제거가 관건
연산 순위 : 연산자 순위 (implicit), 괄호 사용 (explicit), 결합 법칙 제공
언어에서 제공되는 연산자 순위는 언어에 따라 차이가 남괄호는 언어 제공의 연산 순위를 변화 시키고자 할 때 사용결합 법칙은 동 순위 사이에서 발생되며 일반적으로left-to-right 법칙을 따름언어의 연산 순위는 BNF 로 제공하기도 함
수식의 연산 순위를 표현하기 위해서는 추상 구문트리를 사용
연산자 순위연산자들의 상대적 우선 순위는 표준화되어 있음각종 언어에서 연산자 순위는 아래 표에서와 같이서로 다름
Fortran***, /+, -
.EQ., .NE., .LT., .LE., .GT., .GE..NOT..AND..OR.
Fortran***, /+, -
.EQ., .NE., .LT., .LE., .GT., .GE..NOT..AND..OR.
ALGOL60↑
×, /, ÷+ , -
< ,≤, = , ≥, > , ≠¬∧∨⊃≡
ALGOL60↑
×, /, ÷+ , -
< ,≤, = , ≥, > , ≠¬∧∨⊃≡
PL/1**, unary +, unary -, ¬
*, /+ , -
∥= , <=, >=, > , <
¬ =, ¬ <, ¬ >
PL/1**, unary +, unary -, ¬
*, /+ , -
∥= , <=, >=, > , <
¬ =, ¬ <, ¬ >
PASCALnot
*, /, div, mod, and+ , - , or
=, <>, <=, >=, <, > , in
PASCALnot
*, /, div, mod, and+ , - , or
=, <>, <=, >=, <, > , in
ADA**
×, /, mod, rem+ , - , not(unary)
+, -, &=, /=, <, <=, >, >=
and, or, xor
ADA**
×, /, mod, rem+ , - , not(unary)
+, -, &=, /=, <, <=, >, >=
and, or, xor
<expression> ::= <relation>{and<relation>} | <relation>{or<relation>} | <relation>{xor<relation>}
<relation> ::= <simpleexpression> [ <relationalop> <simpleexpression> ]<simpleexpression> ::= [ <unaryop> ] <term> { <addop> <term> }<term> ::= <factor> { <mulop> <factor> }<factor> ::= <primary>[<exponenop><primary.]<primary> ::= <literal> | <aggregate> | <name> | <allocator> |
<functioncall> | <qualifiedexpression> | (<expression>)<relationalop> ::= = | /= | < | <= | > | >=<addop> ::= +| - | &<unaryop> ::= + | - | not<mulop> ::= * | / | mod | rem<exponenop> ::= **
<expression> ::= <relation>{and<relation>} | <relation>{or<relation>} | <relation>{xor<relation>}
<relation> ::= <simpleexpression> [ <relationalop> <simpleexpression> ]<simpleexpression> ::= [ <unaryop> ] <term> { <addop> <term> }<term> ::= <factor> { <mulop> <factor> }<factor> ::= <primary>[<exponenop><primary.]<primary> ::= <literal> | <aggregate> | <name> | <allocator> |
<functioncall> | <qualifiedexpression> | (<expression>)<relationalop> ::= = | /= | < | <= | > | >=<addop> ::= +| - | &<unaryop> ::= + | - | not<mulop> ::= * | / | mod | rem<exponenop> ::= **
ADA 의 수식에 대한 EBNF
ADA 의 임의 수식 parse tree 예
수식 : not A ** B * C / D > - E + F and G mod H >= I
rel
s.e s.e
f
p
v
I
tt
f
p
v
G
f
p
v
Hmod >=
f
p
v
A
p
v
B**
f
p
v
C
f
p
v
D* /
t
s.e
not >
f
p
v
E
t
f
p
v
F
t
s.e
- +
rel
exp
and
exp = <expression>rel = <relation>s.e = <simple expression>t = <term>f = <factor>p = <primary>v = <variable>
적용순서 (applicative order)
operand1 op operand2 평가 순서는 operand1, operand2 를 계산한 후 연산자 op 를 적용 단 , 논리 연산에서는 이 적용 순서를 바꿀 수 있는 특성이 있음
예 ) (1) x ≠ 0 or y / x < 1 (2) x ≠ 0 and y / x < 1
(1) 의 경우 : x 가 0이 아니면 무조건 참 (2) 의 경우 : x 가 0이면 무조건 거짓 , 더구나 x 값이 0일때는
값이 거짓으로 결과가 존재하나 , 위의 적용 순서를 따르면 y / x 에서 overflow 발생
이 두 경우에서 or 와 and 의 뒷부분을 연산하지 않기 위해 새로운 연산자 단회로 도입
operand1 op operand2 평가 순서는 operand1, operand2 를 계산한 후 연산자 op 를 적용 단 , 논리 연산에서는 이 적용 순서를 바꿀 수 있는 특성이 있음
예 ) (1) x ≠ 0 or y / x < 1 (2) x ≠ 0 and y / x < 1
(1) 의 경우 : x 가 0이 아니면 무조건 참 (2) 의 경우 : 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 사용
x cand y = if x then y else false x cor y = if x then true else y
ADA - and then, or else 사용
조건문 (Conditional Statements)
6.7 조건문
FORTRAN
Alogol
IF (BCOND) L1 , L2 IF (BCOND) <STMT>IF (ACOND) L1 , L2 , L3IF (BCOND) L1 , L2 IF (BCOND) <STMT>IF (ACOND) L1 , L2 , L3 GOTO 문 요구
판독성 저하 GOTO 문 요구 판독성 저하
if cond then S1 else S2
Fortran 77 에서는 dangling else 의 해결로 ENDIF 사용
if cond then S1 else S2
Fortran 77 에서는 dangling else 의 해결로 ENDIF 사용 택일문 처리 , dangling else
택일문 처리 , dangling else
중첩 if 문 개선 if C1 then S1 else if C2 then S2 ........ else if Cn then Sn else Sn+1 ........ end if end if
if C1 then S1 else if C2 then S2 ........ else if Cn then Sn else Sn+1 ........ end if end if
다수의 endif 사용을 줄이고 판독성을 증가시키기위해 새 구문 형태 도입예 ) Algol 68 의 elif( 최초 시도 ), Ada 의 elsif
if C1 then S1 elsif C2 then S2 elsif C3 then S3 . . . . . . . . . . . elsif Cn then Sn else Sn+1
endif ;
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 > ofbegin S1 ; S2 ; . . . ; Snend
Algol-w (Hoare, With)
<integer expression > : (1 ~ n) 정수 임의 i 이면 Si 실행
Pascal
case < expr > of <case label list> : <stmt> ... <case label list> : <stmt>
end
열거형 도입<case label list> 는 <expr> 의 상수
Pascal case 문 사용 예
case thismonth of Feb, Apr, Jun, Jul, Aug : birthday := 4; Sep : birthday := 1;
Jan, Mar, May, Oct, Nov, Dec :birthday := 0; end;
다음 문장이 정의되었다고 가정 type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); var thismonth : months;
다음 문장이 정의되었다고 가정 type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); var thismonth : months;
Ada
others절 도입
열거형과 부분 범위 (range) 형
예
case thismonth is when Feb| Apr| Jun..Aug ⇒ birthday := 4; when Sep ⇒ birthday := 1; when others ⇒ birthday := 0; endcase;
CASE 문 고려 사항
선택자 수식으로 허용된 자료형은 무엇인가 ?
case 레이블에 허용되는 자료형은 무엇인가 ?
case 문의 내부 또는 외부로부터 case 레이블로분기될 수 있는가 ?
레이블간의 상호배제가 요구하는가 ?
레이블간의 상호 배제가 요구되지 않은 경우 ,
실행을 중복하는가 ?
수식으로부터 발생되는 모든 경우들을 처리해야 하는가 ?
반복문 (Iterative Statements)
6.8 반복문
반복 수행 - 컴퓨터 중요 특성 , 초기언어부터 사용
<loop-until 예 >
loop if not < 조건 > then exit <statement>repeat
<loop-until 예 >
loop if not < 조건 > then exit <statement>repeat
종류
① 가장 간결한 형태 ( 괄호 사용 개념 )loop-repeat 문 ( 구현 예 )탈출 방법 ( 조건 /무조건 분기문 이용 ) goto(비구조적 ) -> exit( 제한적 goto)Bliss-10 ( 다양한 exit 제공 ) - exit, exitblock, exitcase, exitcommand, exitselect, exitloop, exitset 사용Bliss II (label 을 사용하므로써 중첩된 scope 을
한번에 탈출 가능 ) - exit<label> : label 은 scope 이름 반복문 몸체 , 복합문 , case 문 등
② while 문 - 시작 부분에서 반복 조건 검사 (0 번 이상 반복 가능 )
③ repeat-until 문 - 마지막 부분에서 반복조건 검사 (1 번 이상 반복 가능 )
while <bcond> do <statement>end
while <bcond> do <statement>end
loop if not <bcond> then exit <statement>repeat
loop if not <bcond> then exit <statement>repeat
<loop-repeat 로 표현>
repeat <statement>until <bcond>
repeat <statement>until <bcond>
loop <statement> if not <bcond> then exitrepeat
loop <statement> if not <bcond> then exitrepeat
<loop-repeat 로 표현 >
④ 반복 제어 변수 사용 반복문 ( 화려한 역사를 갖음 ) 예 ) Fortran 의 DO 문 , Pascal, C, Ada, Algol 등등의
for 문for 문에서 고려할 점
- 반복 변수가 택할 수 있는 값들의 자료형은 ? - 초기값 , 최종값 , 증분값에 수식의 허용여부와 수식 결과의 자료형은 ? - 반복시 최종값과 증분값은 얼마나 자주 평가되는가 ? - 반복 변수와 최종값은 언제 비교되나 ? - 반복문 내에서 배정문으로 반복 변수가 변경될 수 있나 ? - 반복문 종료후 반복 변수가 갖는 값은 ? - 반복문 내외로 제어 이동이 허용되나 ? - 반복 변수의 영역 (scope) 은 ?
- 반복 변수가 택할 수 있는 값들의 자료형은 ? - 초기값 , 최종값 , 증분값에 수식의 허용여부와 수식 결과의 자료형은 ? - 반복시 최종값과 증분값은 얼마나 자주 평가되는가 ? - 반복 변수와 최종값은 언제 비교되나 ? - 반복문 내에서 배정문으로 반복 변수가 변경될 수 있나 ? - 반복문 종료후 반복 변수가 갖는 값은 ? - 반복문 내외로 제어 이동이 허용되나 ? - 반복 변수의 영역 (scope) 은 ?
Algol60 (Algol60 보고서 내용 )
- 반복 변수와 최종값 먼저 비교- 초기값 , 최종값 , 증분값 ( 임의 수식 )- 자료형 : 실수형 , 정수형 , 혼합형 연산 허용- 최종값 , 증분값은 비교시 매번 재평가- 보고서의 설명 예 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 문 내부로 제어 이동시 결과 미정의
- 반복 변수와 최종값 먼저 비교- 초기값 , 최종값 , 증분값 ( 임의 수식 )- 자료형 : 실수형 , 정수형 , 혼합형 연산 허용- 최종값 , 증분값은 비교시 매번 재평가- 보고서의 설명 예 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 문 내부로 제어 이동시 결과 미정의
for <var> :=<init> step <incr> until <final>
do <stmt>
for <var> :=<init> step <incr> until <final>
do <stmt>
Pascal
변수의 초기 , 최종값은 동일 자료형 ( 스칼라형 , 실수형 제외 )
초기 , 최종값은 시작전 한번만 계산변수와 최종값 비교 먼저종료후 반복 변수의 값 미정의반복문 변수 열거형 사용증분값 : to, downto
변수의 초기 , 최종값은 동일 자료형 ( 스칼라형 , 실수형 제외 )
초기 , 최종값은 시작전 한번만 계산변수와 최종값 비교 먼저종료후 반복 변수의 값 미정의반복문 변수 열거형 사용증분값 : to, downto
for <var> :=<init> to <final> do <stmt>
또는for <var> :=<init> downto <final> do <stmt>
for <var> :=<init> to <final> do <stmt>
또는for <var> :=<init> downto <final> do <stmt>
Pascal 의 for 문 구문
Fortran II 의 DO 문 ( 최초의 반복문 )
DO 문 몸체가 적어도 한번 수행초기값 , 증분값 , 최종값 : 정수형 상수나 변수반복문 수행후 반복 변수의 값 무 언급
DO 문 몸체가 적어도 한번 수행초기값 , 증분값 , 최종값 : 정수형 상수나 변수반복문 수행후 반복 변수의 값 무 언급
Algol 68 의 for 문
E1, E2, E3 : 정수 수식 , 한번만 평가 (Algol 60 은 임의 수식 , 매번 평가 )반복 변수 영역 : 몸체부 국한 (Ada 도 동일 )
E1, E2, E3 : 정수 수식 , 한번만 평가 (Algol 60 은 임의 수식 , 매번 평가 )반복 변수 영역 : 몸체부 국한 (Ada 도 동일 )
[ for <var> ][ from <E1>][ by <E2>][ to <E3>]
[while <E4>] do <S> od
[ for <var> ][ from <E1>][ by <E2>][ to <E3>]
[while <E4>] do <S> od
Algol 68 의 for 문 구문
레이블 사용에 따른 분류
레이블을 태그로만 사용 ( 번역시 )
레이블 기계어 코드의 분기 위치로 번역(Fortran, Basic)
레이블을 제한된 자료 항목으로 간주( 레이블 값을 읽거나 계산하지 못함 )
일반 자료 항목으로 간주 (Snobol4, APL)
레이블 변수 , 배열 , 매개변수 , 비지역 참조등Algol (비지역 레이블 , 형식 매개변수 참조 )
READ X ... GOTO X ...
READ X ... GOTO X ...
GOTO 문의 장단점장점
GOTO 문 제어구조를 하드웨어가 제공
GOTO 문 제어구조의 완벽한 범용성( 모든 알고리즘 표현 가능 , 타 순서 제어문은 편의 제공 일뿐 )
단점프로그램 질 저하 유도판독성 저하 ( 비 구조적 )
프로그램 유지 보수의 난해성
Goto 문의 잔존상 여부 : 논란의 대상
Pure LISP, Bliss : goto 문 사용 금지
Fortranm Basic 의 if 문은 goto 문임
Pascal : 제한적 사용Goto 문 제거 - 다양한 순서 제어문 요구( 택일문 , 반복문 , 되부름 등 )
비 구조화된 프로그램PROCEDURE DIVISION.PROGRAM-SUMMARY.
OPEN INPUT EMPL-FILEOUT PRINT-FILE.
PRINT-HEADINGS.WRITE PRINT-LINE FROM HEADER1
AFTER ADVANCING PAGE.……
PROCESS-A-RECORD.IF MALEMOVE SALARY-IN TO MEN-SAL-OUT.…
PRINT-SUMMARY.MOVE ‘ TOTAL’ TO NAME-OUT…CLOSE EMPL-FILE
PRINT-FILE.STOP RUN.