본문 바로가기

Programming Languages [PL]

[PL] 07. Statement-Level Control Structures

Control Statements

60년대에 알고리즘은 “Sequential / two-way selection / pretest logical loop 로 표현 가능하다.”라고 했다. 

 

어셈블리어 예시

Conditional (BEQ, BNE 등) Ex) 500 BEQ R2, R4 2000 / R2, R4가 같으면 500에서 2000으로 이동

Unconditional (JMP 등) Ex) 500 JMP 10000 / Unconditional하게 10000으로 이동

 

Control Structure
컨트롤 명령어(if, while 등)와 그 명령어에 의해서 제어되는 명령어들의 집합
(control statement + statement whose execution it controls)

 

구조적 프로그래밍

goto 문을 사용하지 않고 시작과 끝 지점이 일정한 구조적 구문 사용

어떤 계산 함수든 순차, 선택(if, switch), 반복(while, for)의 3가지 제어 구조로 표현 가능


Selection Statements

Two-way에서 Multiple-way로 발전

 

Two-way Selection Statements 

=> if <control_expression> then <clause> else <clause>

=> then 예약어는 이제는 괄호{ }로 대체됨

Multiple-way Selection Statements

  1. control expression의 형태와 타입은?
  2. 선택 가능한 segments는 어떻게 지정되는가?
  3. 구조의 실행 흐름이 단 하나의 선택 가능한 segment로 제한되는가? 아니면 여러 개가 가능한가?
  4. case value(case 안에 들어가는 값)는 어떻게 지정되는가?
  5. 선택 가능한 segment가 없는 경우 어떻게 처리할 것인가? (default 혹은 else 등)

C언어의 switch 문

  1. control expression은 오직 integer type만 가능
  2. 선택 가능한 segment는 statement sequences / blocks / compound statements
  3. 구조에서 하나가 실행이 되고 break;가 없으면 다른 것도 실행이 가능. (implicit branch가 없다.)
  4. unrepresented values를 위해 default clause를 사용한다.

Multiple Selector의 구현

  1. 다중 조건 분기 (Multiple conditional branches) (if else 안에 if else를 계속 넣는 방식)
  2. 테이블에 case value 값을 저장한 뒤, 선형 탐색을 사용
  3. case가 10개 이상이면 hash table을 이용할 수 있음
  4. case가 적고 전체 case value의 절반 이상이 표현된다면, case label이 case value인 array를 사용할 수 있음

Iterative Statements

iteration control을 어떻게 할 것인가? - 루프를 돌지, 나갈지 등 (1. Counter로 미리 정함 / 2. Logical 판단) 

control하는 부분을 loop의 어디에 위치시킬 것인가? (루프의 시작, 루프의 끝, 루프의 중간 등)

 

Counter-Controlled Loops (C의 for문) 

loop variable을 가진다. -> 초기 값(initial) / 끝나는 값(terminal) / step size

  1. loop variable의 type과 scope는 어떻게 할 것인가?
  2. loop variable을 loop control 문 안쪽이 아닌 loop body에서도 변경할 수 있게 할 것인가?
  3. loop variable 값의 판단은 언제 할 것인가? (Ex : initial은 처음에 한 번, 나머지는 계속 판단 등등)


Logically-Controlled Loops (C의 while문)

Boolean expression을 기반으로 반복 제어를 한다.


User-Located Loop Control


User-Defined Data Structure를 이용한 Iteration

주로 User-Defined Data Structure를 이용해 User-Defined Function을 실행한다. (Iterator라고 부름)

(링크드 리스트를 이용하여 노드를 순회하면서 어떤 함수를 실행한다.) 

C : ( for (p=root; p==NULL; trans(p)){...} )

Java : ‘foreach’를 Iterable 인터페이스를 구현한 배열이나 클래스에 사용한다. ( for (String Mys : Mylist) {...} ) 


Unconditional Branching

대표적으로 goto. => 장점은 Flexibility와 Writability가 올라간다. Readability와 Reliability는 떨어진다. 


Guarded Commands 

=> Verification이 함께 이루어지는 문법

하나도 선택되지 않아서 발생하는 에러는 생기지 않는다. 

 

Selection

  • 일반적으로는 여러 개 중에 하나를 선택, Guarded는 여러 개 중에 여러 개를 선택 가능
  • 모든 Boolean Expr를 평가 후, True인 것 중에 무작위로 실행이 된다. 만약 모두 False라면 runtime error 발생

Loop

  • 모든 Boolean Expr를 평가 후, True인 것 중에 무작위로 실행이 된다. 만약 모두 False라면 exit loop

'Programming Languages [PL]' 카테고리의 다른 글