Transcript 배정문

Expressions, Statements
1
선언(Declarations)
• 선언문(Declarations)
- 실행시 사용될 자료의 속성을 언어의 번역기에게 알려주는 프로그램 문장
2
선언(Declarations)(2)
• 자료의 속성
– 자료형, 크기, 이름, 생성 시기, 소멸 시기, 참조하기 위한 첨자 등
예
– Javal의 선언문
int [ ]x = new int[10]
생성, 소멸 시기 : 블록 시작과 종료
자료형 : 1차원 배열
원소수 : 10
첨자 범위 : 0 ~ 9
원소 자료형 : 정수
배열 이름 : X
3
선언문(Declarations) (3)
•
•
선언문의 목적
(1) 주기억 장치 사용과 접근 방법의 효율성
(변수, 배열, 레코드 등의 효율적인 접근 가능)
(2) 주기억 장치 경영의 효율성
(생성과 소멸 시점을 알므로 스택 기반 기억 장소 할당 등을 수행 가능)
(3) 정적 형 검사(static type checking) 가능
– 형고정 연산(type specific operation) : 하드웨어 제공
– 혼합형 연산(mixed operation) : 프로그래밍 언어 제공
– 정적 형검사로 혼합형 연산을 형고정 연산으로 변환
효율성 추구
cf> 혼합형 연산의 동적 형검사
적응성 추구
선언문의 예
float X;
int Y;
...
X +Y
• 번역기 동작(정적 형 검사)
1) 혼합형 연산 발견
2) Y를 실수형으로 변환
3) 실수형 덧셈코드 생성
4
선언문 (4)
• 정적 형 검사 (static type checking)
– 모든 변수의 자료형 선언 요구
– 단점 : 자료 생성, 소멸, 내용 변경 방법에 많은 제약 존재
– 장점 : 실행 시간 효율이 높음
– 정적 형검사 언어 : Java, C, Fortran, Algol, Pascal 등
• 동적 형 검사 (dynamic type checking)
– 선언문 사용 안함
– 장점 : 프로그래밍 단순화, 유연성(flexibility) 높음
– 단점 : 프로그램 실행 시간 지연, 자료 표현상의 효율 저하,
복잡한 기억 장소 경영 기법 요구
– 동적 형검사 언어 : Lisp, APL, Snobol 4
• Algol, Java
- 약간의 효율성을 상실하여 실질적인
큰 적응성을 얻는 선언문 채택
예) 배열 real array x[m1:n1,m2:n2]
• 차원수와 자료형 선언
번역시간 : 효율적인 코드 생성
실행시간 : 첨자 범위 결정
5
배정문(Assignment statement)
배정문(Assignment statement)
- 변수 내용을 변경시키는 기본 연산
6
배정문(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
7
배정문 (3)
 l-value와 r-value
• l-value
– 값이 저장되는 위치(주소, 참조)
• r-value
• 저장되는 값(수식, 변수, 상수, 포인터, 배열원소 등)
• 예
자료형
l-value
r-value
변수
변수의 주소
변수의 값
배열 “A[i]”
i번째 원소 위치
원소 A[i]의 값
상수 “3.5”
없음
값 3.5
포인터 “P”
P가 저장된 위치
P가 지적하는위치
8
배정문 (4)
• 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
y
10
ref ref int z
t
. . .
z
20
x := y + z + 15
이 경우 변수 x에
배정된 값은 45
* 수식 계산에서 최종 r-value 값을 구하는 dereferencing은 자동
9
단순 배정문
• 일반적인 구문
-<목적지_변수> <배정_연산자> <식>
• Fortran, Basic, PL/I, C, C++, Java에서는 배정 연산자에 대하여 동등기호(“=“) 사용
관계 연산자로 사용될 경우 혼돈을 초래
• 예) PL/l의 배정문
A에 관계식 B = C의
불리안 값을 설정.
A=B=C
• C, Java처럼 일부 언어들은 동등 연산자를 위해 “==“등을 사용한다.
• Agol 60은 배정 연산자로 “:=“을 사용한다.
10
다중 목적지 배정문
 다중 목적지 배정문
• 식 값을 한 개 이상의 목적지 변수에 배정을 허용
• 예) PL/I 에서
SUM과 TOTAL 모두에 0을
배정
SUM , TOTAL = 0
•
C, C++, Java에서는 배정 연산자를 여러 번 사용
 조건 목적지 배정문
• C++, Java에서는 배정문에 조건 목적지를
허용count1 = 0;
If (flag)
else count2 = 0;
• 예)
과 동일하다.
flag ? count1 : count2 = 0
11
복합 배정 연산자
 복합 배정 연산자 (compound assignment operator)
• 필요한 형태를 표현하는 축약 방법
• 축약되어 표현 될 수 있는 배정문의 형태 :
•
예)a=a+b
• C에서의 예
sum += value ;
첫 번째 피 연산자로 목적지
변수가 오는 경우
sum = sum + value; 와 동일
• C, C++, Java는 대부분의 이항 연산자에 대해 복합 배정 연산자를 허용
12
단항 배정 연산자
 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++)”로 평가된다.
13
식으로서의 배정문
 C, C++, java에서 배정문은 목적지에 배정된 값과 동일한 결과 생성
배정문은 식 또는 다른 식에 포함된 피연산자로 사용 할 수 있다.
• 예)
while (( ch = getchar()) != EOF ) { . . . }
*Java의 경우 배정 연산자의 우선순위가 관계연산자의 우선 순위보다 낮기
때문에 배정문이 괄호 안에 표현되어야 한다는 것에 유의
• C는 다중 목적지 배정문의 효과를 허용한다는 것에 유의
예) sum = count = 0 ;
count에 먼저 0을 배정하고
count값이 sum에 배정된다.
14
혼합형 배정문
 혼합형 배정문 – 배정문의 양편 자료형이 서로 다를 때
•
•
•
•
Fortran , C, C++은 묵시적 형 변환 규칙을 혼합형 배정에서 사용한다.
Pascal은 몇 개의 묵시적 형 변환을 허용
– Integer은 real에 배정될 수 있다 (역은 허용되지 않는다.).
Ada와 modula-2는 혼합형 배정을 허용하지 않는다.
Java는 요구된 형 변환이 확장 형 변환인 경우에만 혼합형 배정을 허용
 혼합형 배정문을 허용하는 언어에서 묵시적 형 변환은 우변 식이 평가 된 후
일어난다.
•
예)
int a, b ;
float c ;
...
c=a/b;
c가 float형이기 때문에 나눗셈이
이루어지기 전에 a와 b의 값이
float형으로 묵시적 형 변환된다.
15
5.5 상수 및 변수 초기화
 상수와 초기화(-Constant & Initialization)
• 프로그램이 실행되는 동안 값이 변하지 않는 식별자
• 상수 개념 제공 : Pascal, Ada, Java
16
상수 및 변수 초기화(2)
• 상수 표기법 : 참조 없이 값만을 보유
이름
속성들
값
• 상수 허용 시 고려사항
① 단순 변수 또는 구조 변수(record, array)
② 상수 값 표현 : 수식 가능 여부
③ 상수 값 배정 시간 (정적, 동적 배정 가능?)
④ predefined constant 제공 여부
17
상수와 초기화 예
 Pascal
•
•
•
•
•
const 사용
숫자, 스트링, 열거형 값 등 허용 (스칼라 형)
true, false, maxint 등 제공
const pi = 3.14159;
변수 초기화 제공 안함
 Algol68
• 배정 연산자와 상수 선언 연산자의 구별(:=, =)
real root2 := 1.4142135
변수 선언과 초기화
real root2 = 1.4142135
상수 선언
18
상수와 초기화 예 (2)
19
상수와 초기화 예 (3)
 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 ); 상수
선언
20
상수와 초기화 예 (4)
 C언어
•
•
•
•
#define문으로 기호 상수를 선언하였으나, ANSI C 표준에서 상수 선언 도입
예)
const float pi = 3.1415926 ;
초기값 선언은 배열까지도 가능
예)
int a [2][3] = {{1, 2, 3}, {4, 5, 6}} ;
동일한 선언이다.
int a [2][3] = {1, 2, 3, 4, 5, 6} ;
int a [ ][ ] = {{1, 2, 3}, {4, 5, 6}} ;
21
상수와 초기화 예 (5)
 Java
• 예약어로 const는 확보하였으나, 기억 장소 속성으로 상수를 선언
• 예)
static final float pi = 3.1415926 ;
• 초기값 선언 (C언어와 비슷)
– 변수 선언에서 초기값 부여 가능 .
– 예) int I = 100 ;
• 배열 선언
– 객체로 취급하므로 생성문 new 사용이 요구
– 예)
첫 선언 : 정수 배열 ia선언과 생성만을 의미.
int [ ] ia = new int [3] ;
두 번째 선언 : new가 없어도 정수 배열 ib 선언
int ib = { 1, 2, 3 } ;
및 생성과 초기값이 주어진다.
22
표현식(Expression)
 표현식(Expression)
• 목적 : 계산될 값을 기술한 문장
• 피연산자(상수, 변수, 함수 등)와 연산자로 구성
23
표현식(Expression)(2)
•
참조 투명성 (referential transparency) : 수식 평가는 환경 변화 없이 값만을 생성
참조 투명성을 보장하기 위해 부작용(side-effect) 제거가 관건
•
연산 순위 : 연산자 순위(implicit), 괄호 사용(explicit), 결합 법칙 제공
•
언어에서 제공되는 연산자 순위는 언어에 따라 차이가 남
•
괄호-+는 언어 제공의 연산 순위를 변화시키고자 할때 사용
•
결합법칙은 동 순위 사이에서 발생되며 일반적으로 left-to-right 법칙을 따름
•
언어의 연산 순위는 BNF로 제공하기도 함
•
수식의 연산 순위를 표현하기 위해서는 추상 구문 트리를 사용
24
표현식(Expression) (3)
 연산자 순위
• 몇몇 연산자들의 상대적 우선 순위는 표준화 되어 있음
• 각종 언어에서 연산자 순위는 아래 표에서와 같이 서로 다름
25
표현식(Expression) (4)
Fortran
PL/1
**
*, /
+, .EQ., .NE., .LT., .LE., .GT., .GE.
.NOT.
.AND.
.OR.
**, unary +, unary -, ¬
*, /
+, -
∥
=, <=, >=, >, <
¬=, ¬<, ¬>
ALGOL60
↑
×, /, ÷
+, -
<,≤,=, ≥, >, ≠
¬
∧
∨
⊃
≡
ADA
PASCAL
not
*, /, div, mod, and
+, -, or
=, <>, <=, >=, <, > , in
**
×, /, mod, rem
+, -, not(unary)
+, -, &
=, /=, <, <=, >, >=
and, or, xor
26
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> ::= **
27
ADA의 임의 수식 parse tree 예
수식 : not A ** B * C / D > - E + F and G mod H >= I
exp = <expression>
rel = <relation>
s.e = <simple expression>
t = <term>
f = <factor>
p = <primary>
v = <variable>
exp
rel
rel
s.e
s.e
s.e
s.e
t
f
not
t
t
t
t
f
f
f
f
f
f
f
p
p
p
p
p
p
p
p
p
v
v
v
v
v
v
v
v
v
A
**
B
*
C
/
D
>
-
E
+
F
and
G
mod
H
>=
I
28
논리 조건
 적용순서(applicative order)
평가 순서는 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 사용
29
조건문(Conditional Statements)
 조건문
• FORTRAN
IF (BCOND) L1 , L2
IF (BCOND) <STMT>
IF (ACOND) L1 , L2 , L3
GOTO문 요구
판독성 저하
30
조건문(Conditional Statements)(2)
• Algol60
택일문 처리,
dangling else
if cond then S1 else S2
Fortran 77에서는 dangling else의 해결로 ENDIF 사용
31
조건문(Conditional Statements)(3)
• 중첨 if문 개선
표 5.5 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
32
조건문(Conditional Statements) (4)
• 다수의 endif 사용을 줄이고 판독성을 증가시키기 위해 새 구문 형태 도입
예) Algol 68의 elif (최초 시도), Ada의 elsif
• Ada의 elsif 사용한 표5.6 개선 예
if C1 then S1
elsif C2 then S2
elsif C3 then S3
...........
elsif Cn then Sn
else Sn+1
endif;
33
조건문(Conditional Statements) (5)
 CASE 문
- if-then-else를 확장한 택일문
34
조건문(Conditional Statements) (6)
• 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 실행
열거형 도입
<case label list>는 <expr>의 상수
35
조건문(Conditional Statements) (7)
• 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절 도입
– 열거형과 부분범위(range)형
– 예
case thismonth is
when Feb|Apr|Jun..Aug ⇒ birthday := 4;
when Sep ⇒ birthday := 1;
when others ⇒ birthday := 0;
endcase;
36
조건문(Conditional Statements) (8)
 case 문 고려 사항
(1) 선택자 수식(selector expression)으로 허용된 자료형은 무엇인가?
(2) case 레이블에 허용되는 자료형은 무엇인가?
(3) case문의 내부 또는 외부로부터 case 레이블로 분기될 수 있는가?
(4) 레이블간의 상호 배제를 요구하는가?
(5) 수식으로부터 발생되는 모든 경우들을 처리해야 하는가?
37
조건문(Conditional Statements) (9)
 C와 Java에서는 case문이 switch문으로 제공.
switch (<정식>) {
case <상식1> : <문장 1>
case <상식2> : <문장 2>
…
case <상식n> : <문장 n>
default : <문장>
}
38
반복문(Iterative Statements)
 반복문
• 반복 수행 - 컴퓨터 중요 특성, 초기언어부터 사용
39
반복문(Iterative Statements)(2)
• 종류
① 가장 간결한 형태 (괄호 사용 개념)
– loop-repeat 문 (구현 예)
– 탈출 방법(조건/무조건 분기문 이용)
goto(비구조적) -> exit(제한적 goto)
– Bliss-10 (다양한 exit 제공)
<loop-until 예>
loop
if not <조건> then exit
<statement>
repeat
- exit, exitblock, exitcase, exitcommand,
exitselect, exitloop, exitset 사용
– Bliss II (label을 사용하므로써 중첩된 scope을 한번에 탈출 가능)
- exit<label> : label은 scope 이름
반복문 몸체, 복합문, case 문 등
40
반복문 (2)
② while 문
- 시작 부분에서 반복 조건 검사 (0번 이상 반복 가능)
- C 나 Java의 경우
형태)
While ( <조건식>)
<문장>
실행 순서)
①
while ( <조건식> )
③
②참
④거짓
< 문장 >
41
반복문 (3)
③ repeat-until 문
- 마지막 부분에서 반복조건 검사 (1번 이상 반복 가능)
- 형태)
repeat
<statement>
until <bcond>
-C와 Java에서는 do- while문으로 제공
-형태)
do
<문장>
while (<조건식>)
Until문과 조건이 반대로
작용한다.
42
반복문 (4)
④ 반복 제어 변수 사용 반복문 (화려한 역사를 갖음)
예) Fortran의 DO문, Pascal, C, Ada, Algol 등등의 for문
43
반복문 (5)
• for 문에서 고려할 점
–
–
–
–
–
–
–
–
반복 변수가 택할 수 있는 값들의 자료형은?
초기값, 최종값, 증분값에 수식의 허용여부와 수식 결과의 자료형은?
반복시 최종값과 증분값은 얼마나 자주 평가되는가?
반복 변수와 최종값은 언제 비교되나?
반복문 내에서 배정문으로 반복 변수가 변경될 수 있나?
반복문 종료후 반복 변수가 갖는 값은?
반복문 내외로 제어 이동이 허용되나?
반복 변수의 영역(scope)은?
44
반복문 (6)
• 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 문 내부로 제어 이동시 결과 미정의
45
반복문 (7)
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
46
반복문 (8)
 C와 Java의 for문
•
형태)
for (<식1> : <식2> : <식3>)
<문장>
•
<식1> : 반복 변수의 초기화 식
<식2> : 조건식
<식3> : 제어변수의 값을 수정하는 식
실행 순서)
①
②
⑤
for ( <식1> ; <식2> ; <식3> )
④
③참
⑥거짓
< 문장>
47
GOTO 문
 GOTO 문
• 레이블 제어 모든 문장을 지칭
• 기계어 특성 그대로 표현 (효율적 실행 보장)
• 사용 편리 (타 제어문 없이 모든 알고리즘 표현 가능)
48
GOTO 문(2)
 레이블 사용에 따른 분류
1) 레이블을 태그로만 사용 (번역시)
레이블
기계어 코드의 분기 위치로 번역(Fortran, Basic)
2) 레이블을 제한된 자료 항목으로 간주 (레이블 값을 읽거나 계산하지 못함)
레이블 변수, 레이블 배열, 레이블 매개변수, 비지역 레이블 참조등
Algol(비지역 레이블, 형식 매개변수 참조)
3) 일반 자료 항목으로 간주(Snobol4, APL)
…
read X
...
goto X
...
49
GOTO 문 (3)
50
GOTO 문 (4)
 GOTO문의 장단점
•
장점
– GOTO문 제어구조를 하드웨어가 제공
– GOTO문 제어구조의 완벽한 범용성
(모든 알고리즘 표현 가능, 타 순서 제어문은 편의 제공일뿐)
•
단점
– 프로그램 질 저하 유도
– 판독성 저하(비구조적)
– 프로그램 유지보수의 난해성
•
goto문의 잔존 여부 : 논란의 대상
•
Fortran, Basic의 if문은 goto문임
•
pure LISP, Bliss : goto문 사용 금지
•
Pascal : 제한적 사용
•
goto문 제거 - 다양한 순서 제어문 요구 (택일문, 반복문, 되부름 등)
51