슬라이드 제목 없음

Download Report

Transcript 슬라이드 제목 없음

프로그래밍 언어론
제7장
문장
• 구조화 제어문
• 지정문
• 조건문
• 반복문
• GOTO 문
• 비결정적문
1
7.2 지정문(Assignment statement)
지정문(Assignment statement)
-변수 내용을 변경시키는 명령형 언어(imperative language)의 기본 연산
지정문에 관한 연구 주제
 첫 번째 주제는 =, :=, ← 등의 지정문에서 사용되는 심볼의 선택.
 두 번째 주제는 지정문의 평가 순서와 부작용(side effect).
 세 번째 주제는 의미 구조(semantics).
- 명령형 언어는 지정문을 이용하려 변수의 상태를 변화시킴으로써 기본적인
효과를 달성하는 반면 함수형(적용형) 언어는 함수를 재귀적으로 적용하거나
결합함으로써 기본적인 효과를 달성
2
지정문(Assignment statement)(2)
• 각종 지정 연산자
–
–
–
–
–
C, Java, Fortran
Algol, Pascal
APL
Basic
Cobol
A=B
A := B
A
B
LET A = B
MOVE B TO
A
• l-values와 r-values
– 지정 연산자의 왼쪽(l-value)과 오른쪽(r-value)을 의미
– 예)
A := B
r-value
l-value
3
단순 지정문
• 일반적인 구문
-<목적지_변수> <지정_연산자> <식>
• Fortran, Basic, PL/I, C, C++, Java에서는 지정 연산자에 대하여 동등 기호(“=“) 사용
관계 연산자로 사용될 경우 혼돈을 초래
• 예) PL/l의 지정문
A에 관계식 B = C의
불리안 값을 설정.
A=B=C
• C, Java처럼 일부 언어들은 동등 연산자를 위해 “==“등을 사용한다.
• Agol 60은 지정 연산자로 “:=“을 사용한다.
4
다중 지정문
 다중 지정문
• 한 개 이상의 변수에 지정을 허용
• 예) PL/I 에서
SUM과 TOTAL 모두에 0을
지정
SUM , TOTAL = 0
•
C, C++, Java에서는 지정 연산자를 여러 번 사용
 조건 지정문
• C++, Java에서는 지정문에 조건 연산자를
허용count1 = 0;
If (flag)
else count2 = 0;
• 예)
과 동일하다.
flag ? count1 : count2 = 0
5
복합 지정 연산자
 복합 지정 연산자 (compound assignment operator)
• 필요한 형태를 표현하는 축약 방법
• 축약되어 표현 될 수 있는 지정문의 형태 :
•
예)a=a+b
• C에서의 예
sum += value ;
첫 번째 피 연산자로 목적지
변수가 오는 경우
sum = sum + value; 와 동일
• C, C++, Java는 대부분의 이항 연산자에 대해 복합 지정 연산자를 허용
6
단항 지정 연산자
 C , C++, Java - 증가, 감소 연산을 지정과 결합한 단항 지정 연산자를 허용
 증가 연산을 위한 ++ 연산자와 감소 연산을 위한 -- 연산자 사용
 전위 연산자 (prefix operator) :
• 예)
sum = ++ count ;
count값을 1만큼 증가 후 sum에 지정
count = count +1;
sum = count; 와 동일
 후위 연산자 (postfix operator) :
• 예)
sum = count ++ ;
count값을 sum에 지정한 후 count 증가
sum = count;
count = count +1; 와 동일
 단항 연산자와의 우선순위 : 오른쪽에서 왼쪽의 순서
• 예) - count ++;
count 증가 후 음수화,
즉 “-(count++)”로 평가된다.
7
식으로서의 지정문
 C, C++, java에서 지정문은 목적지에 배정된 값과 동일한 결과 생성
지정문은 식 또는 다른 식에 포함된 피연산자로 사용 할 수 있음
• 예)
while (( ch = getchar()) != EOF ) { . . . }
*Java의 경우 지정 연산자의 우선순위가 관계연산자의 우선 순위보다 낮기
때문에 지정문이 괄호 안에 표현되어야 한다는 것에 유의
• C는 다중 지정문의 효과를 낼 수 있다는 것에 유의
예) sum = count = 0 ;
count에 먼저 0을 지정하고
count값이 sum에 지정된다.
8
혼합형 지정문
 혼합형 지정문 – 지정문의 양쪽 데이터 형이 서로 다를 때
•
•
•
•
Fortran , C, C++은 묵시적 형 변환 규칙을 혼합형 지정문에서 사용한다.
Pascal은 몇 개의 묵시적 형 변환을 허용
– integer는 real에 배정될 수 있다 (역은 허용되지 않는다.).
Ada와 modula-2는 혼합형 지정을 허용하지 않는다.
Java는 요구된 형 변환이 확장 형 변환인 경우에만 혼합형 지정을 허용
 Case 1) 묵시적 형 변환은 우변 식이 평가된 후에 일어난다.
 Case 2) 묵시적 형 변환은 우변의 모든 피연산자를 평가하기 전에 일어난다.
•
예)
int a, b ;
float c ;
...
c=a/b;
c가 float형이기 때문에 나눗셈이
이루어지기 전에 a와 b의 값이
float형으로 묵시적 형 변환된다.
9
7.3 조건문(Conditional Statements)
 조건문
• FORTRAN
IF (BCOND) L1 , L2
IF (BCOND) <STMT>
IF (ACOND) L1 , L2 , L3
GOTO문 요구
판독성 저하
10
조건문(Conditional Statements)(2)
선택문 처리,
dangling else
• Dangling else 문제는 if 문의 then 절(clause) 내의 if 문이 어떻게 취급되
는가에 관한 문제로, if 보다 else가 더 적을 때 발생
•
Algol 60에서는 if c1 then if c2 then A else B이 금지, 다음은 허용
if c1 then
begin if c2 then A
end
else B
• Algol 68에서는 모든 if 는 fi에 의해 종결
if C1 then
if C2 then A fi
else B fi
• PL/I과 Pascal은 가장 내부의 if와 함께 해석
if C1 then (if C2 then A; else B;)
 다양한 의미를 위해서 null ELSE 문이 필요
if C1 then if C2 then A; else;
else B;
• Fortran 77에서는 dangling else의 해결을 위해 ENDIF 사용
11
조건문(Conditional Statements)(3)
• 중첩 if 문
nested if 문 구조
if C1 then S1
else if C2 then S2
else if C3 then S3
................
else if Cn then Sn
else Sn+1
end if
........
end if
end if
end if
12
조건문(Conditional Statements) (4)
• 다수의 endif 사용을 줄이고 판독성을 증가시키기 위해 새 구문 형태 도입
예) Algol 68의 elif (최초 시도), Ada의 elsif
• Ada의 elsif 사용 예
if C1 then S1
elsif C2 then S2
elsif C3 then S3
...........
elsif Cn then Sn
else Sn+1
end if;
13
조건문(Conditional Statements) (5)
 CASE 문
- if-then-else를 확장한 선택문
• Algol-w (Hoare, Wirth)
case <integer expression > of
begin
S1;S2;. . .;Sn
end
• Pascal
case < expr > of
<case label list>:<stmt>
...
<case label list>:<stmt>
end
<integer expression > : (1 ~ n) 정수
임의 i 이면 Si 실행
< expr >: 정수, 불리안, 문자,열거형 도입
<case label list>는 <expr>의 상수
14
조건문(Conditional Statements) (6)
• 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;
• Ada
– others절 도입 (변형된 Pascal에서 도입)
– 열거형과 부분 범위(range)형
– 예
case thismonth is
when Feb|Apr|Jun..Aug ⇒ birthday := 4;
when Sep ⇒ birthday := 1;
when others ⇒ birthday := 0;
endcase;
15
조건문(Conditional Statements) (7)
 case 문 연구 주제
(1) 레이블을 선택하는 식의 형
 선택자 식(selector expression)으로 허용된 데이터 형은 무엇인가?
(2) 레이블의 형
 case 레이블에 허용되는 데이터 형은 무엇인가?
(3) 레이블로의 분기 가능성
 case문의 내부 또는 외부로부터 case 레이블로 분기될 수 있는가?
(4) 레이블이 상호 배타적이어야 할 필요성
 레이블간의 상호 배제를 요구하는가?
(5) 레이블 중 하나가 반드시 선택되어야 할 필요성
 식으로부터 발생되는 모든 경우들을 처리해야 하는가?
 Pascal의 경우는 ?(pp. 207-208)
16
조건문(Conditional Statements) (9)
 C와 Java에서는 case문이 switch문으로 제공.
switch (<식>) {
case <상수식1> : <문장 1>
case <상수식2> : <문장 2>
…
case <상수식n> : <문장 n>
default : <문장n+1>
}
 C와 Java의 경우는(연구 주제) ?
17
조건문(Conditional Statements) (10)
 switch 문의 번역
•
조건 구조(conditionals)를 이용
if (상수식1 == 식) then S1
else if (상수식2 == 식) then S2 ...
•
case의 범위가 매우 크지 않으면, 각 case에 대해 표를 생성
case1
case2
...
casen
loc1
loc2
locn
여기에서 loci는 casei에 관한 코드의 위치. 코드로의 분기가 빠르게 진행.
•
많은 수의 case들을 위해, 각 case에 대한 해쉬 테이블(hash table)이 생성
18
7.4 반복문(Iterative Statements)
 반복문
• 반복 수행 - 컴퓨터 고안 목적, 프로그래밍 중요 특성, 초기 언어부터 사용
• 종류
① 가장 간결한 형태는 괄호 사용이지만,
<loop-repeat 예>
– 가독성을 위해 loop-repeat 문 (구현 예)
loop
– 탈출 방법(조건/무조건 분기문 이용)
if not <조건> then exit
<statement>
goto(비구조적) -> exit(제한적 goto)
repeat
– Bliss-10 (다양한 exit 제공)
- exit, exitblock, exitcase, exitcommand,
exitselect, exitloop, exitset 사용
– Bliss II (label을 사용하여 중첩된 scope을 한번에 탈출 가능)
- exit<label> : label은 scope 이름
반복문 몸체, 복합문, case 문 등
19
반복문 (2)
② while 문
- 시작 부분에서 반복 조건 검사 (0번 이상 반복 가능)
- C 나 Java의 경우
형태)
While ( <조건식>)
<문장>
실행 순서)
①
while ( <조건식> )
③
②참
④거짓
< 문장 >
20
반복문 (3)
③ repeat-until 문
- 마지막 부분에서 반복 조건 검사 (1번 이상 반복 가능)
- 형태)
repeat
<statement>
until <bcond>
-C와 Java에서 do- while문으로 제공
-형태)
do
<문장>
while (<조건식>)
until문과 조건이 반대로
작용한다.
21
반복문 (4)
④ FOR 문: 루프 제어 변수 사용 반복문
예) Fortran의 DO문, Pascal, C, Ada, Algol 등의 for 문
•
for <변수> := <초기값> to <최종값> step <변위값> do <문>
• for 문의 연구 주제
–
–
–
–
–
–
–
–
<변수>가 택할 수 있는 값들의 데이터 형은?
<초기값>, <최종값>, <변위값>에 수식의 허용 여부와 수식 결과의 데이터 형은?
반복시 <최종값>과 <변위값>은 얼마나 자주 평가되는가?
<변수>와 <최종값>은 언제 비교되나?
<문> 내에서 지정문으로 <변수>가 변경될 수 있나?
반복문 종료 후 <변수>가 갖는 값은?
반복문 내외로 제어 이동이 허용되나?
<변수>의 영역(scope)은?
22
반복문 (5)
• Algol 60 (Alogol60 보고서 내용)
–
–
–
–
<변수>와 <최종값> 먼저 비교
for <var> :=<init> step <incr> until <final>
<초기값>, <최종값>, <변위값(임의 수식)>
데이터 형 : 실수형, 정수형, 혼합형 연산 허용 do <stmt>
<최종값>, <변위값>은 비교시 매번 재평가
– 보고서의 설명 예
for v := a step b until c do < stmt>
v := a
L1 : if (v - c) * sign(b) > 0 then goto out ;
<stmt>
v := v + b
goto L1;
out :
– 반복문 정상 종료시 <변수> 값 정의되지 않음
– < stmt> 에서 goto문 탈출시 <변수> 값 유지
– for 문 내부로 제어 이동시 결과 미정의
23
반복문 (6)
Pascal
–
–
–
–
–
–
<변수>의 <초기값>, <최종값>은 동일 데이터 형(스칼라형, 실수형 제외)
<초기값>, <최종값>은 시작전 한번만 계산
<변수>와 <최종값> 비교 먼저
Pascal의 for문 구문
종료후 <변수>의 값 미정의
반복문 <변수> 열거형 사용
for <var> :=<init> to <final> do <stmt>
<변위값> : to, downto
또는
Fortran II의 DO문 (최초의 반복문)
for <var> :=<init> downto <final> do <stmt>
– DO 문 몸체가 적어도 한번 수행
– <초기값>, <변위값>, <최종값> : 정수형 상수나 변수
– 반복문 수행 후 <변수>의 값 언급 없음
Algol 68의 for문
– Exp1, Exp2, Exp3 : 정수 수식, 한 번만 평가
(Algol 60은 임의 수식, 매번 평가)
– <변수> 영역 : 몸체부 국한
(Ada도 동일)
Algol 68의 for문 구문
[ for <vble> ][ from <Exp1>][ by <Exp2>][ to <Exp3>]
[while <Exp4>] do <S> od
24
반복문 (7)
 C와 Java의 for 문
•
형태)
for (<식1> : <식2> : <식3>)
<문장>
•
<식1> : 반복 변수의 초기화 식
<식2> : 조건식
<식3> : 제어변수의 값을 수정하는 식
실행 순서)
①
②
⑤
for ( <식1> ; <식2> ; <식3> )
④
③참
⑥거짓
< 문장>
25
반복문 (8)
 FORTRAN 90
•
반복문의 형식
DO 루프제어
블록
END DO
•
루프제어가 생략되면 무한 반복, 반복에서 벗어나기 위해 반드시 EXIT 문을
이용
•
다른 언어의 for 문과 같은 고정된 횟수의 반복문
DO <레이블> <변수> = <초기값>, <최종값>, <증분값>
•
•
<변수>는 단순한 정수 변수. <초기값>은 반복의 초기값을, <최종값>은
마지막값을 지정한다. <최종값>에 도달하면 반복은 끝남. <증분값>은 매
반복시에 <초기값>에 더해질 값으로, 생략되면 1의 의미.
<변수>는 반복의 수행동안 변경될 수 없고, <초기값>과 <최종값>은 반복의
시작에서 한 번만 평가된다.
26
7.5 GOTO 문
 GOTO문의 장단점
•
장점
– GOTO문 제어구조를 하드웨어가 제공
– 소규모의 프로그램에서는 간단하고 이해하기 쉬움
– 어셈블리어나 기존의 언어에 익숙한 사람들에게 친숙한 구조
– GOTO문 제어 구조의 완벽한 범용성
(모든 알고리즘 표현 가능)
•
단점
– 계층적인 프로그램(그룹화) 작성이 방해 받아 프로그램 질 저하 유도
– 프로그램의 문장 순서와 실행 순서가 달라져서 판독성 저하(비구조적)
– 프로그램 유지보수의 어려움
•
goto문의 잔존 여부 : 논란의 대상
•
Fortran, Basic의 if문은 goto문임
•
pure LISP, Bliss : goto문 사용 금지
•
Pascal : 제한적 사용
•
goto문 제거 - 다양한 제어문 요구
27
GOTO 문 (2)
 Exit와 Break 문
•
반복문에서 break 문이 사용되면 현재 break 문을 감싸고 있는 반복문의
루프를 빠져 나오게 한다. 만약 반복문이 여러 개 중첩되어 있다면 break 문은
현재 자신을 포함하고 있는 반복문만을 빠져 나오고 반복문 밖의 다음
명령문으로 제어를 이동한다.
•
continue 문도 continue 문 이후의 모든 명령문을 실행하지 않고 제어를
반복문의 시작 위치로 이동시킨다. 즉, break는 반복문의 블록을 완전히
종료하게 하지만 continue 문은 반복의 시작 위치로 제어를 이동시킨다는
것이다.
•
Ada의 exit 문은 end-loop 다음의 문으로 제어를 바로 이동하게 된다. 만일
루프에 X란 레이블이 붙으면, 루프내의 임의의 장소에서 exit X; 라고 기술할
수 있다.
 Java의 break 문과 continue 문(pp. 220-221) ?
28