본문 바로가기
PL

[PL] CH8. Statement-Level Control Structures

by 녕인뉸 2022. 5. 3.

** 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)

switch문에서 모든 statement를 묶어서 하나처럼 사용 - >encapsulation

프로그래머가 반드시 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 루프 변수가 없음

관련된 모든 루프 변수는 루프 안에서 변경