58
제 6 제 제제 , 제제제 , 제 제 제제제 6.1 변변 6.2 변변변 6.3 변변 6.5 변변 변 변변 변변변 6.6 변변변 6.7 변변변 6.8 변변변 6.9 GOTO 변 6.4 변변변

제 6 장 변수 , 바인딩 , 식 및 제어문

Embed Size (px)

DESCRIPTION

제 6 장 변수 , 바인딩 , 식 및 제어문. 6.1 변수. 6.6 표현식. 6.2 바인딩. 6.7 조건문. 6.3 선언. 6.8 반복문. 6.4 배정문. 6.9 GOTO 문. 6.5 상수 및 변수 초기화. 참조. 이름. 속성. 실수. X. 값. 3.14159. 정적 바인딩. 동적 바인딩. . 6.1 변수. 정의. 이름 , 속성 (attribute) 의 집합 , 참조 (reference), - PowerPoint PPT Presentation

Citation preview

제 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)예 ) 변수의 형 , 자료 구조형 , 크기

언어의 구현 시간

구현 할 때 특성의 일부 확정하는 바인딩예 ) 정수 자릿수 , 실수의 유효숫자 개수

언어 정의 시간

언어를 정의할 때 확정되는 바인딩예 ) 언어 구문 정의

반복문자료 구조연산 종류혼합형 연산

Y := X + 10 에서 발생되는 바인딩 시간 ?

바인딩 시간의 중요성

언어들 간의 중요하고 , 미묘한 차이점은 바인딩 시간의 차이에서 발생

빠른 바인딩은 효율성이 증가하고 늦은 바인딩은유연성 (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)

정의

6.3 선언

실행시 사용될 자료의 속성을 언어의 번역기에게 알려주는 프로그램 문장

자료 속성자료형 , 크기 , 이름 , 생성 시기 , 소멸 시기 ,

참조하기 위한 첨자 등

예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) 증가

단순 배정문

< 목적지 _ 변수 > < 배정 _ 연산자 > < 식>

A = B = C

다중 목적지 배정문

SUM, TOTAL = 0

조건 목적지 배정문

flag ? count1 : count2 = 0

If (flag) count1; else count2 = 0;

구문 정의

조건목적지 배정문 -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

식으로서의 배정문while ((ch = getchar()) != EOF ) {…}

혼합형 배정문

int a, b;

float c;

c = 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 ; 변수 선언과 초기화

구조형 자료형의 초기화

Java

static final float pi = 3.14;

Int [] ia = new int [3];

Int ib [] = { 1,2,3 };

수식 (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 문 구문

GOTO 문

6.9 GOTO 문

레이블 제어 모든 문장을 지칭기계어 특성 그대로 표현 ( 효율적 실행 보장 )

사용 편리 (타 제어문 없이 모든 알고리즘 표현 가능 )

레이블 사용에 따른 분류

레이블을 태그로만 사용 ( 번역시 )

레이블 기계어 코드의 분기 위치로 번역(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 문 제거 - 다양한 순서 제어문 요구( 택일문 , 반복문 , 되부름 등 )

Structured Programming ( 구조적 프로그래밍 )

계층 구조 강조( 복합문 , 조건문 , 반복문 )

계층 구조와 프로그램 본문 일치

모듈화

비 구조화된 프로그램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.

구조화된 프로그램PROCEDURE DIVISION.PROGRAM-SUMMARY.

OPEN INPUT EMPL-FILEOUT PRINT-FILE.

PERFORM PRINT-HEADINGS.PERFORM READ-EMPL-RECORD.…CLOSE EMPL-FILE

PRINT-FILE.STOP-RUN.

PRINT-HEADINGS.WRITE PRINT-LINE FROM HEADER1

AFTER ADVANCING PAGE.…

PROCESS-A-RECORD.IF MALEMOVE SALARY-IN TO MEN-SAL-OUT....