Presentation is loading. Please wait.

Presentation is loading. Please wait.

제 6장 변수, 바인딩, 식 및 제어문 6.1 변수 6.6 표현식 6.2 바인딩 6.7 조건문 6.3 선언 6.8 반복문

Similar presentations


Presentation on theme: "제 6장 변수, 바인딩, 식 및 제어문 6.1 변수 6.6 표현식 6.2 바인딩 6.7 조건문 6.3 선언 6.8 반복문"— Presentation transcript:

1 제 6장 변수, 바인딩, 식 및 제어문 6.1 변수 6.6 표현식 6.2 바인딩 6.7 조건문 6.3 선언 6.8 반복문
6.4 배정문 6.9 GOTO 문 6.5 상수 및 변수 초기화

2 6.1 변수 정의 이름, 속성(attribute)의 집합, 참조(reference), 값(value)의 4요소로 구성
<D.W.Barron의 변수 표기법> X 이름 속성 실수 참조 정적 바인딩 동적 바인딩 예) X := 의 의미 ① 이름:X ② 속성 : 원주율, 실수 ③ 참조 : 값이 저장된 위치 ④ 값 :

3 6.2 바인딩 바인딩 (binding) 개념 정의 프로그램의 기본 단위에 이 단위가 택할 수 있는
여러 속성 중에서 일부를 선정하여 결정하는 행위 예) const n = 5; 이름 n에 두개의 속성인 상수와 값 5 바인딩 x := 2; 변수 x에 새로운 속성 값 2가 바인딩

4 바인딩 시간 바인딩 발생되는 시간 바인딩 시간의 종류 언어 정의 시간 언어 구현 시간 번역 시간 실행 시간

5 바인딩 시간의 종류 실행 시간 프로그램 실행시간에 발생되는 바인딩 : 동적 바인딩(dynamic binding) 예) 변수값 배정, 변수, 자료구조의 기억장소 할당 모듈의 시작 시간 예) 형식 매개 변수와 실 매개변수의 바인딩 실행 시간의 사용시점 예) 배정문의 값 저장

6 번역 시간 언어를 번역하는 시점에서 발생되는 바인딩 : 정적 바인딩 (static binding) 예) 변수의 형, 자료 구조형, 크기 언어의 구현 시간 구현 할 때 특성의 일부 확정하는 바인딩 예) 정수 자릿수, 실수의 유효숫자 개수

7 언어 정의 시간 언어를 정의할 때 확정되는 바인딩 예) 언어 구문 정의 반복문 자료 구조 연산 종류 혼합형 연산 Y := X + 10 에서 발생되는 바인딩 시간?

8 바인딩 시간의 중요성 언어들 간의 중요하고, 미묘한 차이점은 바인딩 시간의 차이에서 발생 빠른 바인딩은 효율성이 증가하고 늦은 바인딩은 유연성(flexibility)이 증가 바인딩 시간과 언어 구현

9 주요언어에서 식별자의 바인딩시간 번역 시간 바인딩 (정적 바인딩: static binding) 실행 시간 바인딩
컴파일 시간 (프로그램 작성 시간 포함) (1) Fortran, Algol, PL/I, Pascal, Cobol 등 컴파일러 언어 : 대부분의 변수형 확정 (2) 상수값의 기계 내부 표현이 확정됨 번역 시간 바인딩 (정적 바인딩: static binding) (1) Fortran:COMMON 문에 주어진 이름의 상대 주소 확정 (2) Fortran, Algol, PL/I 등: 부프로그램 이름에 관한 상대 주소 확정 Linkage edit 시간 (1) Fortran, Cobol: 모든 변수의 기억 장소 할당 (2) PL/I: 정적 변수로 선언된 변수의 기억 장소 할당 (3) Algol, Pascal: 전역(global) 변수의 기억 장소 할당 (4) Fortran: DATA 문에서 정의된 값을 변수에 배정 적재 시간 (load time) (1) 실매개 변수를 형식 매개 변수에 연결 ① by value: 실매개 변수값을 지역 변수에 배정 ② by reference: 실매개 변수를 형식매개 변수로 사용할 수 있도록 주소를 배정 ③ by name: 사용할 때 주소와 해당 값을 계산할 수 있는 thunk 루틴의 주소 확정 (2) Algol, Pascal: 지역 변수에 대한 기억 장소 할당(활성 레코드가 만들어짐) (3) PL/I: AUTOMATIC 변수에 대한 기억 장소 할당 실행 시간 바인딩 (동적 바인딩: dynamic binding) 호출 시간 (또는 모듈 시작 시간) 실행 시간 사용 시점 (reference) (1) PL/I: BASED 변수 기억장소(ALLOCATE 문, FREE 문) (2) APL, Lisp, Snobol4: 변수들의 자료형 배정, 기억 장소 할당 (3) 모든 프로그래밍 언어: 배정문 등에서 변수값을 배정

10 6.3 선언 정의 실행시 사용될 자료의 속성을 언어의 번역기에게 알려주는 프로그램 문장 자료 속성
자료형, 크기, 이름, 생성 시기, 소멸 시기, 참조하기 위한 첨자 등

11 예 ALGOL의 선언문 integer array x[2:10] Java 의 선언문 Int[] x = new int[9]
생성, 소멸 시기 : 블록 시작과 종료 자료형 : 1차원 배열 원소수 : 9 첨자 범위 : 2 ~ 10 원소 자료형 : 정수 배열 이름 : X ALGOL의 선언문 integer array x[2:10] Java 의 선언문 Int[] x = new int[9]

12 선언문의 목적 효율적 주기억 장치 사용과 접근 가능 자료 속성 한정 변수, 배열, 레코드 등의 효율적인 접근 : 최적화 주기억 장치의 사용량 감소 실행 시간 감소 효율적 주기억 장치 경영 가능 실행시 보다 효율적 기억 장소 할당 예) ALGOL : stack 인터프리터 언어 : heap allocation Java : stack + heap

13 정적 형 검사 (static type checking) 가능
형 고정 연산 (type specific operation) : 하드웨어 제공 혼합형 연산 (mixed operation) : 프로그래밍 언어 제공 정적 형 검사로 혼합형 연산을 형 고정 연산으로 변환 : 효율성 추구 선언문의 예 real x; integer y; x + y;

14 정적 형 검사 (static type checking)
모든 변수의 자료형 선언 요구 장점 : 실행 시간 효율성 높음 단점 : 자료 생성, 소멸, 내용 변경에 많은 제약 정적 형 검사 언어 : FORTRAN, ALGOL, PL/I 등 동적 형 검사 (dynamic type checking) 선언문 사용 안함 장점 : 프로그래밍 단순화, 적응성 (flexibility) 높음 단점 : 실행 시간 지연, 자료 표현상 효율 저하 복잡한 기억 장소 경영 동적 형 검사 언어 : LISP, APL, SNOBOL4

15 ALGOL 약간의 효율성 상실하여 실질적 큰 적응성 얻는 선언문 채택 예) ALGOL 68 [1:n] int a; [1:m] int b; 번역 시간 : 효율적 코드 생성 실행 시간 : 첨자 범위 결정 Default 선언은 선언문 간주 (묵시적 선언문) FORTRAN의 정수형, 실수형, 선언문

16 6.4 배정문 프로그래밍 언어 배정문 구문 C, Java, Fortran Algol, Pascal APL Basic Cobol
A = B A := B A B LET A = B MOVE B TO A

17 l-values와 r-values 배정 연산자의 왼쪽(l-value)과 오른쪽 (r-value)을 의미 예) A := B l-value r-value 값이 저장되는 위치 저장되는 값 (주소, 참조) (수식,변수, 상수 등)

18 l-value와 r-value 예 자료형 변수 배열 “A[i]” 상수 “3.5” 포인터 “P” r-value 변수의 값
값 3.5 P가 지적하는위치 l-value 변수의 주소 i번째 원소 위치 없음 P가 저장된 위치

19 Bliss Algol 68 변수 이름 : 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은 자동 y t 20 z

20 배정문 A:= expr 에 대한 구현 l-value 중심 배정 ( Fortran, C 등 컴파일러 언어가 사용) “수식 e를 계산하고, A의 속성으로 변환 후 배정” 효율적인 기억장소 경영 - 정적 형 검사 - 빠른 접근 - 효율성 증가 r-value중심 배정 (APL 등 인터프리터 언어가 사용) “수식 e를 계산하고, A의 속성을 e의 계산 결과와 동일한 속성으로 변환 후 배정하는 기법” 동적 형검사 불필요한 변환 없음 적응성(flexibility) 증가

21 단순 배정문 <목적지_변수> <배정_연산자> <식> A = B = C 다중 목적지 배정문 SUM, TOTAL = 0

22 조건 목적지 배정문 flag ? count1 : count2 = 0 If (flag) count1; else count2 = 0;

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

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

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

26 복합 배정 연산자 a = a + b 단항 배정 연산자 sum = ++ count; count = count + 1;
sum = count++; sum = count; count = count + 1; count++; count = count +1; - count ++

27 식으로서의 배정문 while ((ch = getchar()) != EOF ) {…} 혼합형 배정문 int a, b; float c; c = a/b;

28 6.5 상수 및 변수 초기화 상수와 초기화(Constant & Initialization)
프로그램이 실행되는 동안 값이 변하지 않는 식별자 상수 개념 제공 : Pascal, Ada, Fortran 상수 허용 시 고려사항 ① 단순 변수 또는 구조 변수(record, array) ② 상수 값 표현 : 수식 가능 여부 ③ 상수 값 배정 시간 (정적, 동적 배정 가능?) ④ predefined constant 제공 여부

29 배정 연산자와 상수 선언 연산자의 구별(:=, =)
Pascal const 사용 숫자, 스트림, 열거형 값 등 허용 (스칼라 형) true, false, maxint 등 제공 const pi = ; 변수 초기화 제공 안함 Algol68 배정 연산자와 상수 선언 연산자의 구별(:=, =) real root2 := 변수 선언과 초기화 real root2 = 상수 선언

30 constant (모든 자료형에 사용 가능)
Ada constant (모든 자료형에 사용 가능) X:constant INTEGER :=17; 상수 선언 Y:INTEGER :=17; 변수 선언과 초기화 구조형 자료형의 초기화 type NATURAL is N; type ROSTER is array (NATURAL) of INTEGER; LINEUP:ROSTER ( ); 배열 선언 LINEUP:= ( => 1 , => -l ); 배열 배정문 LINEUP: ROSTER ( ) := ( => 1 , 100 => -l ); 배열 선언과 초기화 LINEUP: constant ROSTER ( ) := ( => 1 , => -l ); 상수 선언

31 Java static final float pi = 3.14; Int [] ia = new int [3]; Int ib [] = { 1,2,3 };

32 6.6 표현식 수식 (Expression) 목적 : 계산될 값을 기술한 문장
피 연산자(상수, 변수, 함수 등)와 연산자로 구성 참조 투명성(referenctial transparency) : 수식 평가는 환경 변화 없이 값만을 생성 참조 투명성을 보장하기 위해 부작용 제거가 관건

33 연산 순위 : 연산자 순위(implicit),
괄호 사용(explicit), 결합 법칙 제공 언어에서 제공되는 연산자 순위는 언어에 따라 차이가 남 괄호는 언어 제공의 연산 순위를 변화 시키고자 할 때 사용 결합 법칙은 동 순위 사이에서 발생되며 일반적으로 left-to-right 법칙을 따름 언어의 연산 순위는 BNF로 제공하기도 함 수식의 연산 순위를 표현하기 위해서는 추상 구문 트리를 사용

34 연산자들의 상대적 우선 순위는 표준화되어 있음
연산자 순위 연산자들의 상대적 우선 순위는 표준화되어 있음 각종 언어에서 연산자 순위는 아래 표에서와 같이 서로 다름 Fortran ** *, / +, - .EQ., .NE., .LT., .LE., .GT., .GE. .NOT. .AND. .OR. PL/1 **, unary +, unary -, ¬ *, / +, - =, <=, >=, >, < ¬=, ¬<, ¬> ALGOL60 ×, /, ÷ +, - <,≤,=, ≥, >, ≠ ADA ** ×, /, mod, rem +, -, not(unary) +, -, & =, /=, <, <=, >, >= and, or, xor PASCAL not *, /, div, mod, and +, -, or =, <>, <=, >=, <, > , in

35 ADA의 수식에 대한 EBNF <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> ::= **

36 수식 : not A ** B * C / D > - E + F and G mod H >= I
ADA의 임의 수식 parse tree 예 수식 : not A ** B * C / D > - E + F and G mod H >= I

37 적용순서 (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의 뒷부분을 연산하지 않기 위해 새로운 연산자 단회로 도입

38 : 부울 수식에서 일부 피연산자만으로 평가하는 기법
단회로(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 사용

39 6.7 조건문 조건문 (Conditional Statements) FORTRAN Alogol
IF (BCOND) L1 , L IF (BCOND) <STMT> IF (ACOND) L1 , L2 , L3 GOTO문 요구 판독성 저하 Alogol if cond then S1 else S2 Fortran 77에서는 dangling else의 해결로 ENDIF 사용 택일문 처리, dangling else

40 다수의 endif 사용을 줄이고 판독성을 증가시키기 위해 새 구문 형태 도입
if C1 then S1 else if C2 then S2 else if Cn then Sn else Sn+1 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;

41 CASE 문 If-then-else를 확장한 택일문 Algol-w (Hoare, With) Pascal
Algol-w(Hoare, Wirth) case <integer expression > of begin S1;S2;. . .;Sn end <integer expression > : (1 ~ n) 정수 임의 i 이면 Si 실행 열거형 도입 <case label list>는 <expr>의 상수 Pascal case < expr > of <case label list>:<stmt> ... end

42 Pascal case문 사용 예 case thismonth of
다음 문장이 정의되었다고 가정 type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); var thismonth : months; case thismonth of Feb, Apr, Jun, Jul, Aug : birthday := 4; Sep : birthday := 1; Jan, Mar, May, Oct, Nov, Dec :birthday := 0; end;

43 Ada others절 도입 열거형과 부분 범위(range) 형 예 case thismonth is
when Feb|Apr|Jun..Aug ⇒ birthday := 4; when Sep ⇒ birthday := 1; when others ⇒ birthday := 0; endcase;

44 CASE 문 고려 사항 선택자 수식으로 허용된 자료형은 무엇인가? case 레이블에 허용되는 자료형은 무엇인가? case 문의 내부 또는 외부로부터 case 레이블로 분기될 수 있는가? 레이블간의 상호배제가 요구하는가? 레이블간의 상호 배제가 요구되지 않은 경우, 실행을 중복하는가? 수식으로부터 발생되는 모든 경우들을 처리해야 하는가?

45 6.8 반복문 반복문 (Iterative Statements) 반복 수행 - 컴퓨터 중요 특성, 초기언어부터 사용
<loop-until 예> loop if not <조건> then exit <statement> repeat

46 종류 ① 가장 간결한 형태 (괄호 사용 개념) loop-repeat 문 (구현 예) 탈출 방법(조건/무조건 분기문 이용) goto(비구조적) -> exit(제한적 goto) Bliss-10 (다양한 exit 제공) - exit, exitblock, exitcase, exitcommand, exitselect, exitloop, exitset 사용 Bliss II (label을 사용하므로써 중첩된 scope을 한번에 탈출 가능) - exit<label> : label은 scope 이름 반복문 몸체, 복합문, case 문 등

47 ② while 문 - 시작 부분에서 반복 조건 검사 (0번 이상 반복 가능) ③ repeat-until 문
- 마지막 부분에서 반복조건 검사 (1번 이상 반복 가능) while <bcond> do <statement> end loop if not <bcond> then exit repeat <loop-repeat로 표현> repeat <statement> until <bcond> loop if not <bcond> then exit <loop-repeat로 표현>

48 ④ 반복 제어 변수 사용 반복문 (화려한 역사를 갖음)
예) Fortran의 DO문, Pascal, C, Ada, Algol 등등의 for 문 for 문에서 고려할 점 - 반복 변수가 택할 수 있는 값들의 자료형은? - 초기값, 최종값, 증분값에 수식의 허용여부와 수식 결과의 자료형은? - 반복시 최종값과 증분값은 얼마나 자주 평가되는가? - 반복 변수와 최종값은 언제 비교되나? - 반복문 내에서 배정문으로 반복 변수가 변경될 수 있나? - 반복문 종료후 반복 변수가 갖는 값은? - 반복문 내외로 제어 이동이 허용되나? - 반복 변수의 영역(scope)은?

49 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 문 내부로 제어 이동시 결과 미정의 for <var> :=<init> step <incr> until <final> do <stmt>

50 Pascal 변수의 초기, 최종값은 동일 자료형(스칼라형, 실수형 제외) 초기, 최종값은 시작전 한번만 계산
변수와 최종값 비교 먼저 종료후 반복 변수의 값 미정의 반복문 변수 열거형 사용 증분값 : to, downto Pascal의 for문 구문 for <var> :=<init> to <final> do <stmt> 또는 for <var> :=<init> downto <final> do <stmt>

51 Fortran II의 DO문 (최초의 반복문)
초기값, 증분값, 최종값 : 정수형 상수나 변수 반복문 수행후 반복 변수의 값 무 언급 Algol 68의 for문 E1, E2, E3 : 정수 수식, 한번만 평가 (Algol 60은 임의 수식, 매번 평가) 반복 변수 영역 : 몸체부 국한 (Ada도 동일) Algol 68의 for문 구문 [ for <var> ][ from <E1>][ by <E2>][ to <E3>] [while <E4>] do <S> od

52 6.9 GOTO 문 GOTO 문 레이블 제어 모든 문장을 지칭 기계어 특성 그대로 표현 (효율적 실행 보장)
사용 편리 (타 제어문 없이 모든 알고리즘 표현 가능)

53 Algol (비지역 레이블, 형식 매개변수 참조)
레이블 사용에 따른 분류 레이블을 태그로만 사용 (번역시) 레이블 기계어 코드의 분기 위치로 번역 (Fortran, Basic) 레이블을 제한된 자료 항목으로 간주 (레이블 값을 읽거나 계산하지 못함) 레이블 변수, 배열, 매개변수, 비지역 참조등 Algol (비지역 레이블, 형식 매개변수 참조) 일반 자료 항목으로 간주 (Snobol4, APL) READ X ... GOTO X

54 GOTO 문의 장단점 장점 GOTO문 제어구조를 하드웨어가 제공 GOTO문 제어구조의 완벽한 범용성 (모든 알고리즘 표현 가능, 타 순서 제어문은 편의 제공 일뿐) 단점 프로그램 질 저하 유도 판독성 저하 (비 구조적) 프로그램 유지 보수의 난해성

55 Goto문의 잔존상 여부 : 논란의 대상 Fortranm Basic의 if문은 goto 문임 Pure LISP, Bliss : goto 문 사용 금지 Pascal : 제한적 사용 Goto문 제거 - 다양한 순서 제어문 요구 (택일문, 반복문, 되부름 등)

56 Structured Programming (구조적 프로그래밍)
계층 구조 강조 (복합문, 조건문, 반복문) 계층 구조와 프로그램 본문 일치 모듈화

57 비 구조화된 프로그램 PROCEDURE DIVISION. PROGRAM-SUMMARY. OPEN INPUT EMPL-FILE
OUT PRINT-FILE. PRINT-HEADINGS. WRITE PRINT-LINE FROM HEADER1 AFTER ADVANCING PAGE. PROCESS-A-RECORD. IF MALE MOVE SALARY-IN TO MEN-SAL-OUT. PRINT-SUMMARY. MOVE ‘ TOTAL’ TO NAME-OUT CLOSE EMPL-FILE PRINT-FILE. STOP RUN.

58 구조화된 프로그램 PROCEDURE DIVISION. PROGRAM-SUMMARY. OPEN INPUT EMPL-FILE
OUT 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 MALE MOVE SALARY-IN TO MEN-SAL-OUT. ...


Download ppt "제 6장 변수, 바인딩, 식 및 제어문 6.1 변수 6.6 표현식 6.2 바인딩 6.7 조건문 6.3 선언 6.8 반복문"

Similar presentations


Ads by Google