1 / 51

Expressions, Statements

Expressions, Statements. 선언 (Declarations). 선언문 (Declarations) - 실행시 사용될 자료의 속성을 언어의 번역기에게 알려주는 프로그램 문장. 선언 (Declarations)(2). 자료의 속성 자료형 , 크기 , 이름 , 생성 시기 , 소멸 시기 , 참조하기 위한 첨자 등 예 Javal 의 선언문 int [ ]x = new int[10]. 생성 , 소멸 시기 : 블록 시작과 종료 자료형 : 1 차원 배열 원소수 : 10

niles
Download Presentation

Expressions, Statements

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Expressions, Statements

  2. 선언(Declarations) • 선언문(Declarations) • - 실행시 사용될 자료의 속성을 언어의 번역기에게 알려주는 프로그램 문장

  3. 선언(Declarations)(2) • 자료의 속성 • 자료형, 크기, 이름, 생성 시기, 소멸 시기, 참조하기 위한 첨자 등 예 • Javal의 선언문 int [ ]x = new int[10] 생성, 소멸 시기 : 블록 시작과 종료 자료형 : 1차원 배열 원소수 : 10 첨자 범위 : 0 ~ 9 원소 자료형 : 정수 배열 이름 : X

  4. 선언문(Declarations) (3) • 선언문의 목적 (1) 주기억 장치 사용과 접근 방법의 효율성 (변수, 배열, 레코드 등의 효율적인 접근 가능) (2) 주기억 장치 경영의 효율성 (생성과 소멸 시점을 알므로 스택 기반 기억 장소 할당 등을 수행 가능) (3) 정적 형 검사(static type checking) 가능 • 형고정 연산(type specific operation) : 하드웨어 제공 • 혼합형 연산(mixed operation) : 프로그래밍 언어 제공 • 정적 형검사로 혼합형 연산을 형고정 연산으로 변환 효율성 추구 cf> 혼합형 연산의 동적 형검사 적응성 추구 • 선언문의 예 float X; int Y; ... X + Y • 번역기 동작(정적 형 검사) • 1) 혼합형 연산 발견 • 2) Y를 실수형으로 변환 • 3) 실수형 덧셈코드 생성

  5. 선언문 (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] • 차원수와 자료형 선언 • 번역시간 : 효율적인 코드 생성 • 실행시간 : 첨자 범위 결정

  6. 배정문(Assignment statement) • 배정문(Assignment statement) • - 변수 내용을 변경시키는 기본 연산

  7. r-value l-value 배정문(Assignment statement)(2) • 각종 배정 연산자 • C, Java, Fortran A = B • Algol, Pascal A := B • APL A B • Basic LET A = B • Cobol MOVE B TO A • l-values와 r-values • 배정 연산자의 왼쪽(l-value)과 오른쪽(r-value)을 의미 • 예) A := B

  8. 배정문 (3) • l-value와 r-value • l-value • 값이 저장되는 위치(주소, 참조) • r-value • 저장되는 값(수식, 변수, 상수, 포인터, 배열원소 등) • 예

  9. 배정문 (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 • ref ref int z • . . . • x := y + z + 15 • 이 경우 변수 x에 • 배정된 값은 45 • * 수식 계산에서 최종 r-value 값을 구하는 dereferencing은 자동 y 10 t 20 z

  10. 단순 배정문 • 일반적인 구문 • <목적지_변수> <배정_연산자> <식> • Fortran, Basic, PL/I, C, C++, Java에서는 배정 연산자에 대하여 동등기호(“=“) 사용 • 관계 연산자로 사용될 경우 혼돈을 초래 • 예) PL/l의 배정문 • A = B = C • C, Java처럼 일부 언어들은 동등 연산자를 위해 “==“등을 사용한다. • Agol 60은 배정 연산자로 “:=“을 사용한다. A에 관계식 B = C의 불리안 값을 설정.

  11. SUM과 TOTAL 모두에 0을 배정 If (flag) count1 = 0; else count2 = 0; 과 동일하다. 다중 목적지 배정문 • 다중 목적지 배정문 • 식 값을 한 개 이상의 목적지 변수에 배정을 허용 • 예) PL/I 에서 SUM , TOTAL = 0 • C, C++, Java에서는 배정 연산자를 여러 번 사용 • 조건 목적지 배정문 • C++, Java에서는 배정문에 조건 목적지를 허용 • 예) flag ? count1 : count2 = 0

  12. 복합 배정 연산자 • 복합 배정 연산자 (compound assignment operator) • 필요한 형태를 표현하는 축약 방법 • 축약되어 표현 될 수 있는 배정문의 형태 : • 예 ) a = a + b • C에서의 예 sum += value ; • C, C++, Java는 대부분의 이항 연산자에 대해 복합 배정 연산자를 허용 첫 번째 피 연산자로 목적지 변수가 오는 경우 sum = sum + value; 와 동일

  13. 단항 배정 연산자 • C , C++, Java - 증가, 감소 연산을 배정과 결합한 단항 배정 연산자를 허용 • 증가 연산을 위한 ++ 연산자와 감소 연산을 위한 -- 연산자 사용 • 전위 연산자 (prefix operator) : • 예) sum = ++ count ; • 후위 연산자 (postfix operator) : • 예) sum = count ++ ; • 단항 연산자와의 우선순위 : 오른쪽에서 왼쪽의 순서 • 예) - count ++; count값을 1만큼 증가후 sum에 배정 count = count +1; sum = count; 와 동일 count값을 sum에 배정한 후 count 증가 sum = count; count = count +1; 와 동일 count 증가후 음수화, 즉 “-(count++)”로 평가된다.

  14. 식으로서의 배정문 • C, C++, java에서 배정문은 목적지에 배정된 값과 동일한 결과 생성 배정문은 식 또는 다른 식에 포함된 피연산자로 사용 할 수 있다. • 예) while (( ch = getchar()) != EOF ) { . . . } *Java의 경우 배정 연산자의 우선순위가 관계연산자의 우선 순위보다 낮기 때문에 배정문이 괄호 안에 표현되어야 한다는 것에 유의 • C는 다중 목적지 배정문의 효과를 허용한다는 것에 유의 예) sum = count = 0 ; count에 먼저 0을 배정하고 count값이 sum에 배정된다.

  15. 혼합형 배정문 • 혼합형 배정문 – 배정문의 양편 자료형이 서로 다를 때 • Fortran , C, C++은 묵시적 형 변환 규칙을 혼합형 배정에서 사용한다. • Pascal은 몇 개의 묵시적 형 변환을 허용 • Integer은 real에 배정될 수 있다 (역은 허용되지 않는다.). • Ada와 modula-2는 혼합형 배정을 허용하지 않는다. • Java는 요구된 형 변환이 확장 형 변환인 경우에만 혼합형 배정을 허용 • 혼합형 배정문을 허용하는 언어에서 묵시적 형 변환은 우변 식이 평가 된 후 일어난다. • 예) int a, b ; float c ; . . . c = a / b ; c가 float형이기 때문에 나눗셈이 이루어지기 전에 a와 b의 값이 float형으로 묵시적 형 변환된다.

  16. 5.5 상수 및 변수 초기화 • 상수와 초기화(-Constant & Initialization) • 프로그램이 실행되는 동안 값이 변하지 않는 식별자 • 상수 개념 제공 : Pascal, Ada, Java

  17. 속성들 이름 값 상수 및 변수 초기화(2) • 상수 표기법 : 참조 없이 값만을 보유 • 상수 허용 시 고려사항 ① 단순 변수 또는 구조 변수(record, array) ②상수 값 표현 : 수식 가능 여부 ③ 상수 값 배정 시간 (정적, 동적 배정 가능?) ④ predefined constant 제공 여부

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

  19. 상수와 초기화 예 (2)

  20. 상수와 초기화 예 (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 ); 상수 선언

  21. 상수와 초기화 예 (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}} ; 동일한 선언이다.

  22. 상수와 초기화 예 (5) • Java • 예약어로 const는 확보하였으나, 기억 장소 속성으로 상수를 선언 • 예) static final float pi = 3.1415926 ; • 초기값 선언 (C언어와 비슷) • 변수 선언에서 초기값 부여 가능 . • 예) int I = 100 ; • 배열 선언 • 객체로 취급하므로 생성문new사용이 요구 • 예) int [ ] ia = new int [3] ; int ib = { 1, 2, 3 } ; 첫 선언 : 정수 배열 ia선언과 생성만을 의미. 두 번째 선언 : new가 없어도 정수 배열 ib 선언 및 생성과 초기값이 주어진다.

  23. 표현식(Expression) • 표현식(Expression) • 목적 : 계산될 값을 기술한 문장 • 피연산자(상수, 변수, 함수 등)와 연산자로 구성

  24. 표현식(Expression)(2) • 참조 투명성 (referential transparency) : 수식 평가는 환경 변화 없이 값만을 생성 참조 투명성을 보장하기 위해 부작용(side-effect) 제거가 관건 • 연산 순위 : 연산자 순위(implicit), 괄호 사용(explicit), 결합 법칙 제공 • 언어에서 제공되는 연산자 순위는 언어에 따라 차이가 남 • 괄호-+는 언어 제공의 연산 순위를 변화시키고자 할때 사용 • 결합법칙은 동 순위 사이에서 발생되며 일반적으로 left-to-right 법칙을 따름 • 언어의 연산 순위는 BNF로 제공하기도 함 • 수식의 연산 순위를 표현하기 위해서는 추상 구문 트리를 사용

  25. 표현식(Expression) (3) • 연산자 순위 • 몇몇 연산자들의 상대적 우선 순위는 표준화 되어 있음 • 각종 언어에서 연산자 순위는 아래 표에서와 같이 서로 다름

  26. ALGOL60 ↑ ×, /, ÷ +, - <,≤,=, ≥, >, ≠ ¬ ∧ ∨ ⊃ ≡ PL/1 **, unary +, unary -, ¬ *, / +, - ∥ =, <=, >=, >, < ¬=, ¬<, ¬> Fortran ** *, / +, - .EQ., .NE., .LT., .LE., .GT., .GE. .NOT. .AND. .OR. ADA ** ×, /, mod, rem +, -, not(unary) +, -, & =, /=, <, <=, >, >= and, or, xor PASCAL not *, /, div, mod, and +, -, or =, <>, <=, >=, <, > , in 표현식(Expression) (4)

  27. 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> ::= **

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

  29. 논리 조건 • 적용순서(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사용

  30. 조건문(Conditional Statements) • 조건문 • FORTRAN IF (BCOND) L1 , L2IF (BCOND) <STMT> IF (ACOND) L1 , L2 , L3 GOTO문 요구 판독성 저하

  31. 조건문(Conditional Statements)(2) 택일문 처리, dangling else • Algol60 if cond then S1else S2 Fortran 77에서는 dangling else의 해결로 ENDIF 사용

  32. 조건문(Conditional Statements)(3) • 중첨 if문 개선 표 5.5 nested if문 구조 • if C1then S1 • else if C2then S2 • else if C3then S3 • ................ • else if Cnthen Sn • else Sn+1 • end if • ........ • end if • end if • end if

  33. 조건문(Conditional Statements) (4) • 다수의 endif 사용을 줄이고 판독성을 증가시키기 위해 새 구문 형태 도입 예) Algol 68의 elif (최초 시도), Ada의 elsif • Ada의 elsif 사용한 표5.6 개선 예 • if C1then S1 • elsif C2then S2 • elsif C3then S3 • . . . . . . . . . . . • elsif Cnthen Sn • else Sn+1 • endif;

  34. 조건문(Conditional Statements) (5) • CASE 문 • - if-then-else를 확장한 택일문

  35. 조건문(Conditional Statements) (6) <integer expression > : (1 ~ n) 정수 임의 i 이면 Si실행 • 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 열거형 도입 <case label list>는 <expr>의 상수

  36. 조건문(Conditional Statements) (7) 다음 문장이 정의되었다고 가정 type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); var thismonth : months; • Pascal case문 사용 예 case thismonth of Feb, Apr, Jun, Jul, Aug : birthday := 4; Sep : birthday := 1; Jan, Mar, May, Oct, Nov, Dec :birthday := 0; end; • Ada • others절 도입 • 열거형과 부분범위(range)형 • 예 case thismonth is when Feb|Apr|Jun..Aug ⇒ birthday := 4; when Sep ⇒ birthday := 1; when others ⇒ birthday := 0; endcase;

  37. 조건문(Conditional Statements) (8) • case 문 고려 사항 (1) 선택자 수식(selector expression)으로 허용된 자료형은 무엇인가? (2) case 레이블에 허용되는 자료형은 무엇인가? (3) case문의 내부 또는 외부로부터 case 레이블로 분기될 수 있는가? (4) 레이블간의 상호 배제를 요구하는가? (5) 수식으로부터 발생되는 모든 경우들을 처리해야 하는가?

  38. switch (<정식>) { case <상식1> : <문장 1> case <상식2> : <문장 2> case <상식n> : <문장 n> default : <문장> } … 조건문(Conditional Statements) (9) • C와 Java에서는 case문이 switch문으로 제공.

  39. 반복문(Iterative Statements) • 반복문 • 반복 수행 - 컴퓨터 중요 특성, 초기언어부터 사용

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

  41. while ( <조건식> ) ③ ②참 ④거짓 < 문장 > 반복문 (2) ② while 문 - 시작 부분에서 반복 조건 검사 (0번 이상 반복 가능) - C 나 Java의 경우 형태) While ( <조건식>) <문장> 실행 순서)

  42. 반복문 (3) ③ repeat-until 문 - 마지막 부분에서 반복조건 검사 (1번 이상 반복 가능) - 형태) repeat <statement> until <bcond> • C와 Java에서는 do- while문으로 제공 • 형태) Until문과 조건이 반대로 작용한다. do <문장> while (<조건식>)

  43. 반복문 (4) ④ 반복 제어 변수 사용 반복문 (화려한 역사를 갖음) 예) Fortran의 DO문, Pascal, C, Ada, Algol 등등의 for문

  44. 반복문 (5) • for 문에서 고려할 점 • 반복 변수가 택할 수 있는 값들의 자료형은? • 초기값, 최종값, 증분값에 수식의 허용여부와 수식 결과의 자료형은? • 반복시 최종값과 증분값은 얼마나 자주 평가되는가? • 반복 변수와 최종값은 언제 비교되나? • 반복문 내에서 배정문으로 반복 변수가 변경될 수 있나? • 반복문 종료후 반복 변수가 갖는 값은? • 반복문 내외로 제어 이동이 허용되나? • 반복 변수의 영역(scope)은?

  45. 반복문 (6) for <var> :=<init> step <incr> until <final> do <stmt> • Algol60 (Alogol60 보고서 내용) • 반복 변수와 최종값 먼저 비교 • 초기값, 최종값, 증분값(임의 수식) • 자료형 : 실수형, 정수형, 혼합형 연산 허용 • 최종값, 증분값은 비교시 매번 재평가 • 보고서의 설명 예 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 문 내부로 제어 이동시 결과 미정의

  46. 반복문 (7) Pascal • 변수의 초기, 최종값은 동일 자료형(스칼라형, 실수형 제외) • 초기, 최종값은 시작전 한번만 계산 • 변수와 최종값 비교 먼저 • 종료후 반복 변수의 값 미정의 • 반복문 변수 열거형 사용 • 증분값 : to, downto Fortran II의 DO문 (최초의 반복문) • DO 문 몸체가 적어도 한번 수행 • 초기값, 증분값, 최종값 : 정수형 상수나 변수 • 반복문 수행후 반복 변수의 값 무 언급 Algol 68의 for문 • Exp1, Exp2, Exp3 : 정수 수식, 한번만 평가 (Algol 60은 임의 수식, 매번 평가) • 반복 변수 영역 : 몸체부 국한 (Ada도 동일) Pascal의 for문 구문 for <var> :=<init> to <final> do <stmt> 또는 for <var> :=<init> downto <final> do <stmt> Algol 68의 for문 구문 [ for <vble> ][ from <Exp1>][ by <Exp2>][ to <Exp3>] [while <Exp4>] do <S> od

  47. 반복문 (8) <식1> : 반복 변수의 초기화 식 <식2> : 조건식 <식3> : 제어변수의 값을 수정하는 식 • C와 Java의 for문 • 형태) • 실행 순서) for (<식1> : <식2> : <식3>) <문장>

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

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

  50. GOTO 문 (3)

More Related