** Flow Control
- within expressions -> operator precedence, associativity
- among statements -> statement-level control structures
- among unit -> procedure invocation
1. Intro
(1) Computations in imperative language
- 표현식 평가 및 결과 값을 변수에 할당
-> alternative control flow paths를 선택
-> statement들의 collection의 반복적인 수행 발생
(2) The control statements of early FORTRAN : 직접적으로 machine language instruction들과 관련
(3) 플로우 차트에 의해 표현된 모든 알고리즘들은 단 2개의 control statement를 사용한 언어로 표현할 수 있음
- 2개의 control path에서의 선택을 위해 하나 사용(ex. if-then-else) , 논리적 controlled iteration을 위해 하나 사용 (ex. for loop)
(4) Writability는 많은 양의 control statement에 의해 향상됨
(5)

- for, while문은 Single-Entry, Single-Exit O
break 사용은 Single-Entry, Single-Exit X
(6) Compound Statements
- Algol 60
: compound statement -> 하나의 statement로 추상화할 statement의 collection

: block -> compound statement + data declarations (변수 선언)

- pascal
: ALGOL 60의 compound statement 디자인 사용, block은 사용하지 않음
- C
: compound statement와 block을 구분하기 위해 중괄호 사용
- control structure가 여러 개의 entry를 가질 수 있나 ?
-> 여러 개의 entry는 contro structure에 거의 추가 되지 않음
2. Selection Statement
(1) 2개 이상의 수행 path 사이의 선택을 위한 수단을 제공
-> two-way selection, n-way selection (multiple selection)
2.1 Two-way Selection Statements
- selection을 control하는 표현식의 형식과 타입
: C -> arithmetic expression
: 나머지 -> boolean expression
(1) 다른 selector의 then 절에 중첩된 selector를 어떻게 지정? -> syntax , semantic rule
(2) Single-way Selectors
- 모든 imperative 언어는 single-way selector를 포함하며, 대부분 two way selector의 subform으로 사용
- FORTRAN (a logicl IF)
-> IF문 : selector control 표현식은 boolean type이며, single문은 selectable
: 중첩 허용 x
: goto문의 사용 유발
: 매우 간단하며 inflexible
- compound statements는 조건적으로 statements의 그룹을 수행하는 단순한 메카니즘이 사용된 selection construct를 제공

- 여러 언어는 single-way selector를 제공하여 compound statement나 statement의 sequence를 선택
(3) Two-way Selectors
- 선택된 2개의 control paths 중 하나를 허용
- ALGOL 60

(4) Nesting Selectors : 중첩된 selector 안에서의 모호성

C에선, else는 가장 가까운 then에 붙으므로 바로 위의 then 절에 붙음
- 대부분의 imperative language에서, 언어의 static sementics는 else문은 가장 최근에 짝을 이루지 않은 then 절과 묶어줌
- ALGOL 60
: if문은 then문과 직접적으로 중첩되지 않음
-> 대부분 compound statement에 위치함

왼쪽은 else -> 바로 위의 then
오른쪽은 else -> 처음의 then
- if문에서 마지막 문이 then 또는 else 문일 때, compound하지 않으면, 전체 selection construct의 end를 표시하기 위한 syntactic entity가 없음
따라서, modula-2에선 END, FORTRAN에선 END IF 사용

파이썬에선 indentation(들여쓰기) 사용하여 절 정의


block은 들여쓰기에 의해 나타내짐
2.2 Multiple Selection Contructs; 여러 개 중 하나를 선택
**binary selector : if-then-else
(1) statement나 statement 그룹 중 하나를 선택
(2) selector의 일반화
(3) 디자인 문제
- selection을 control하는 표현식의 형식과 타입은?
- 단일문, statement의 순서, compound statement가 선택될 수 있음?
- syntactic structure에서 전체 construct가 encapsulate되어야 하는 지
- structure을 통한 execution flow가 단지 단일 selectable statement를 포함하기 위해 제한되어야 함?
- 표현되지 않은 selector 표현식의 값은 어떻게 수행됨?
(4) 이전 selector

현대 selector
: ALGOL-W
- structure은 encapsulate됨, 단일 selectable segment 제공
- 실행문은 표현식의 값에 의해 선택됨

: Pascal
- selectable segments는 label됨
- 표현식은 ordinal 타입 (int, Boolean, char, enumeration type)
- Semantics : 표현식이 평가되고, 값은 상수 리스트에서 상수와 비교됨
- 상수 리스트는 표현식과 동일한 유형,
mutually exclusive (조건 중복x),
exhaustive할 필요 없음 ( 모든 것을 나열할 필요없음 -> ex.default)

: C
- 제어과 상수식은 정수형
- 코드 segment의 끝 부분에서 implicit branch를 제공하지 않음 (reliable vs flexible)

프로그래머가 반드시 explicit branching을 사용해 줘야함 (ex. break)
: 파이썬
case
when count < 10 then bag1 = true
when count < 100 then bag2 = true
when count < 1000 then bag3 = true
end
3. Iterative Statements ; 반복문
(1) 0번 이상을 실행하기 위한 statement 또는 그 집합 중 하나
(2) iterative contruct를 사용하는 거 대신 recursion을 사용하여 함수 언어에서 구현
(3) 첫번째 iterative contructs는 배열과 관련 있음
(4) 디자인 문제
- 어떻게 iteration을 제어? -> logical (for loop), counting, ..
- 루프 안에서 제어 메카니즘이 어디서 발생? -> pretest, posttest, user defined
** pretest : for loop
** posttest, user defined: do {...} while (..)
(5) counter-controlled loops
- count 변수가 유지되어 있는 루프 변수
- 루프 파라미터 : initial, terminal, stepsize

1 : initial
100 : terminal
2 : stepsize
- counter-controlled 루프는 machine inst에 의해 지원됨
- 디자인 문제
: 루프 변수의 영역과 타입? -> int, char, enumeration, float
: loop termination에서 어떤 변수가 루프 변수를 가짐?
: 루프 변수 또는 파라미터가 루프 안에서 change하는 게 legal 한가? 그렇다면 그 변화가 루프 control에 영향을 줌?
: 완료에 대한 테스트가 루프의 top 혹은 bottom에서 진행되어야 함?
: 루프 파라미터를 한번만 평가하는지, 아니면 모든 반복에 대해 한 번만 평가?
(4) FORTRAN IV, FORTRAN 77, FORTRAN 90에 대한 DO statement는 8단원 13, 14 페이지 참고
(5) C의 for 문
- pretest counting loop structure

- 만약 2번째 표현식의 값이 0이라면, for문 종료
그렇지 않으면, loop문이 실행됨
-C의 for의 모든 표현식은 optional
for (sum = 0.0, count = 0 ; count <= 10 && sum < 1000.0; sum = sum + count++) ;
여러 개의 표현식이 들어갈 수 있음

explicit 루프 변수가 없음
관련된 모든 루프 변수는 루프 안에서 변경
'PL' 카테고리의 다른 글
| [PL] CH9. Subprograms (Module) (3) (0) | 2022.05.19 |
|---|---|
| [PL] CH9. Subprograms (Module) (2) (0) | 2022.05.17 |
| [PL] CH9. Subprograms (Module) (0) | 2022.05.10 |
| [PL] CH8. Statement-Level Control Structures (2) (0) | 2022.05.10 |
| [PL] CH7. Expressions and the Assignment Statement (0) | 2022.05.03 |