[선택문(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문으로 재작성 예시 (생략)
'[프로그래밍 언어론]' 카테고리의 다른 글
프로그래밍 언어론 6-5-1강. Enumeration-Controlled Loops (0) | 2019.11.29 |
---|---|
프로그래밍 언어론 6-5강. 반복(Iteration) (0) | 2019.11.28 |
프로그래밍 언어론 6-3강. 시퀀싱(Sequencing) (0) | 2019.11.23 |
프로그래밍 언어론 6-2-1강. goto문의 구조적 대안(Structured Alternatives to goto) (0) | 2019.11.22 |
프로그래밍 언어론 6-2강. 구조화, 비구조화된 흐름(Structured and Unstructured Flow) (0) | 2019.11.22 |