프로그래밍 언어론 6-4강. 선택(selection)

[프로그래밍 언어론]

2019. 11. 23. 19:03

 

[선택문(Selection statements)]

: 대부분의 명령형 언어에서 Algol 60때 소개된 if..then...else 개념을 기반으로 사용한다..

 

# 선택문의 기본 형태

if condition then statement

else if condition then statement

else if condition then statement

...

else statement

 

 

 

[선택문 기본 형태의 모호성]

: Algol 60과 Pascal에선, 위와 같이 'then'과 'else'가 단일한 상태만을 가지게끔 정의된다.

: 하지만 이와 같은 형태로는 중첩 IF문을 사용할 수 없다(모호성 문제)

 

# 선택문 기본 형태의 모호성 예시

if condition1 then

  if condition2 then statement1

else statement2

...

statement3

: 예를 들어 condition2가 T/F면 statement2 실행할지 statement3 실행할지를 컴파일러에서 구분하지 못한다. (모호성)

 

# 해결책1 - Algol 60의 begin

if condition1 then

begin:

  if condition2 then statement1

...

: begin을 중첩문 시작전에 작성해줘서 구별해주는 방법

 

# 해결책2 - Pascal의 사용불가 처리

: 위와 같은 모호한 문제를 해결하기 위해, 'else문'과 가장 가까운 아직 매칭되지 않은 'then'에 따르도록 규칙을 설정 (disambiguating rule)

 

# 해결책3 - 오늘날 배부분의 언어들의 상태리스트

: 상태 리스트(statement list)구조의 끝에 종료 키워드와 함께 then 혹은 else를 따르도록 한다.

: 종료자(terminators)들이 중첩의 끝에 쌓이는 것을 막기 위해, 대부분의 언어에서 elif나 elsif와 같은 키워드를 제공한다.

  (기존에 사용하던 else if는 말그대로 else 구문에 if가 들어간 형태이고 elif 키워드를 따로 만들어 이 문제를 해결)

# Ruby : elsif문은 if문의 한 종류

if a == b then

  ...

elsif a == c then

  ...

else

  ...

end

# Lisp : if문 사용안하고 괄호이용해 처리하는 언어

(cond

  ( ( = A B )

      (...    ) )

  ( ( = A C )

      (...    ) )

  ( T

      (...    ) )

 

 

 

[선택문의 단락 평가(Short-circuited) conditions]

: 선택문 if...then...else문은 부울(Boolean) 표현식의 형태이다.

: 그리고 레지스터에서 이러한 표현식(bne,beq)은 평가할 필요가 없다.

: 대신 대부분의 기계들은 위와 같은 간단한 비교를 포착하는 조건부 분기(선택문)에 대한 지시사항을 제공한다.

: 선택문에서 부울 표현식의 목적은 저장할 값을 계산하는 것이 아니라 제어장치가 다양한 위치로 분기되도록 하는 것이다.

: 이러한 사실이 단락 평가에 적합한 표현에 대해 특별히 효율적인 코드를 생성할 수 있다.

(다 같은 얘기)

 

# 선택문의 단락 평가 조건 예시

if (( A > B ) and ( C > D )) or ( E != F ) then

  then_clause

else

  else_clause

 

# short-circuited conditon이 없는 언어

  r1 := A

  r2 := B

  r1 := r1 > r2

  r2 := C

  r3 := D

  r2 := r2 > r3

  r1 := r1 & r2

  r2 := E

  r3 := F

  r2 := r2 != r3

  r1 := r1 | r2

if r1 = 0 goto L2

L1 : then_clause

  goto L3

L2 : else_clause

L3 :

# short-circuited conditon이 있는 언어

    r1 := A

    r2 := B

    if r1 < r2 goto L4     #short-circuit 모습

    r1 := C

    r2 := D

    if r1 > r2 goto L1

L4: r1 := E

    r2 := F

    if r1 = r2 goto L2

L1: then_clause

    goto L3

L2 : else_clause

L3 :

: short-circuited condition을 제공하는 언어가 선택문에서 더 효율적인 코드 작성을 야기할 수 있다.

 

 

 

[Case/Switch Statements]

: Algol W에서 파생되어진 언어들의 case statements는 중첩 if...then...else문에 대한 특별 케이스로써 제공된다.

: 효율적인 코드 생성을 위하여 만들어진 statement.

 

# if...then...else문을 case문으로 재작성 예시 (생략)