[Enumeration]**
: "열거하다"라는 뜻으로, 반복문에서 수행하는 모든 index 케이스들을 먼저 확인후 집합형태로 도출.
이후 반복문 수행을, 이 집합의 케이스들에 대해서 해당 문을 실행하는 형태로 수행한다.
[여러 언어에서의 Enumeration-control을 이용한 반복]
# Fortran I : enumeration-control 기반 반복을 최초로 사용한 언어
# 오늘날의 Fortran 예시 (do loop문)
do i = 1, 10, 2 ... enddo |
: 수행해야 하는 케이스 (1, 3, 5, 7, 9)를 먼저 도출한 다음에 각 케이스를 수행하는 방식으로 루프를 수행한다.
# 많은 다른 언어에서 제공하는 비슷한 형태의 함수 예시 (for loop문)
FOR i := first TO last BY step DO // first, last, step에 값을 넣어 사용 ... END |
# Clu등의 대부분의 현대 언어
: 이러한 방식의 루프를 일반화해서 사용하기도 한다. (트리의 노드, Collection의 원소들 등) - 6.5.3에서 자세히
[for 루프문]
: for 루프문은 위의 예시와 같이 for 기반 반복문을 의미하고, 오늘날 대부분의 언어에서 for을 이용한 반복문을 수행한다.
# 두가지의 for 루프문
1) enumeration 방식으로 특정 루프변수에 주어진 숫자 범위 안의 값을 대입하여 실행하는 방식(basic, fortran등 방식, C 기반언어에는 이 개념자체가 없다)
2) 논리기반 for 루프문. "foreach"문이라고도 한다. (C, JAVA등)
# for loop문을 위한 코드 생성
r1 := first r2 := step r3 := last L1: if r1 > r3 goto L2 ... r1 := r1 + r2 goto L1 L2: |
# 보다 간편한 형태로 개선 r1 := first r2 := step r3 := last goto L2 L1: ... r1 := r1 + r2 L2: if r1 <= r3 goto L1 |
: (우)측 버전은 각 반복문이 단일 조건 분기문을 가지고 있기때문에 좀더 빠르다. ( 분기문을 아래로 내린 방법 )
: 둘다 loop-ending 테스트를 근본으로 채택하는걸 지향하고 있다.
[Enumeration 반복문 특징]
: 컴파일러들이 올바른 선택을 할 수 있도록 하기 위해서, 많은 언어들은 그들의 산술 시퀀스의 일반성을 제한한다.
: 일반적으로, 반복할것을 컴파일 시점에 추출후 그 경우에 대해서 실행시간에 실행한다. (실행시점 변경 X) (로직의 경우엔 중간에 수정 가능)
: Ada에서는 +1, -1 선택 제한
: 여러언어(ada,pascal등)에서, 거꾸로 반복(10 downto 1와같이)을 구현하기위해 특별한 문법이 필요하다. (C등에선 없는 개념)
[Semantic Complications]
: '반복문의 카운팅'은 반복이 실행되기전에 몇번 반복을 수행해야하는지를 예측될 수 있고 이를 사용한다.
: 이러한 예측은 Fortran, Ada와 같은 언어들에서 가능하지만, C나 그 기반 언어들에선 불가능하다 (논리기반 루프 사용언어에선 불가능)
: 그리고 이러한 차이는 for loop 구조가 오직 반복을 위해서만 존재되는지, 아니면 단순히 enumeration(열거)을 쉽게 하기위해서 존재하는지에 따라 다르다.
1) enumeration(열거)에 포커싱한 언어 : 처음에 말한 반복문 카운팅 작업 사용해도 문제 없다.(for-loop가 유일한 목적)
2) iteration(반복)에 포커싱한 언어 : 다양한 것들에서 일반화되서 사용된다 (while등) => logic 형
[열거값 요구와 활성화 간의 선택]
: 열거(enumeration)값 '요구'와 '활성화' 사이의 선택은 다음과 같은 몇 가지 특정 질문으로 나타난다.
1. 제어가 loop문에 열거 매커니즘을 통하지 않아도 들어가거나 나올수 있는가?
2. 루프문 내부에서 루프 종료 바인딩을 계산하는데 사용된 변수를 수정하면 어떻게 되는가?
3. 루프문 내부가 스스로의 index(반복중기준)를 수정하면 어떻게 되는가?
4. 프로그램이 루프문이 완료된후에 index 변수를 읽을수 있는지, 또 읽을수 있으면 그 값은 무엇일까?
# 1, 2번 해결
: 대부분의 언어들이 for loop문에 대해 일찍부터 loop문을 떠나기 위해 break/exit 상태의 사용을 허락했다.
: Fortran 4는 루프문 안으로 jump를 위해 goto문을 허락했지만, 이는 언어의 결함으로 취급받았다.
: 비슷하게 대부분의 언어 (C제외)들은 첫번째 반복전에 바운딩이 한번만 계산되고, 임시 저장소에 유지된다.
: 이후 바인딩을 계산하는 데 사용되는 변수에 대한 변경은 루프 반복 횟수에 영향을 미치지 않는다.
# 3, 4번 해결
for i := 1 to 10 by 2 ... if i = 3 i := 6 |
: 위와 같은 코드가 있을때 어떤경우에 반복이 될것인가? (1, 3, 5, 7, 9 / 1, 3, 6, 8, 10)
: 대부분의 언어에서 루프 내부에서 루프의 index를 변경하는 것을 막아두었다.
: 만약 루프에서 break/exit를 통해 빠져나오게되면, index에 대한 값은 빠져나온 시점의 index에 대한 값으로 남아있는다.
# index로 인해 발생할 수 있는 두가지 문제
1) index 수정 문제
: 특정 루프문에서는 다음 값이 정수 정밀도의 범위의 밖에 있는 경우가 있다. (범위 표시 index를 a~z로 할때, z다음의 index는 무엇으로 할것 인가?)
2) post-loop 값 문제
: 루프문에서 조건확인위해 사용하는 비교문의 경우에 두 비교대상이 const일경우, 이를 비교문으로 사용하는것은 별로이다.
... r1 =a, r2 = z일때 if r1 > r2 goto L3 // a, z값은 const이기때문에 궅이 필요없는 확인문. ... |
# index 문제 해결 방법
: 위에서 언급한 index 수정 문제와 post-loop 값 문제의 해결책은 Algol W와 Algol 68등 많은 언어에서 해결되었다.
=> loop의 header에서 index를 정의를 포함하는 방식으로 해결
for I in Integer range 1 .. 10 loop // 사용되는 index를 for문 안에서 정의. 밖에서 사용 불가능. Do_Something(I) end loop; |
'[프로그래밍 언어론]' 카테고리의 다른 글
프로그래밍 언어론 6-5-3강. 반복자(Iterators) (0) | 2019.12.01 |
---|---|
프로그래밍 언어론 6-5-2강. 조합된 루프문(Combination Loops) (0) | 2019.11.29 |
프로그래밍 언어론 6-5강. 반복(Iteration) (0) | 2019.11.28 |
프로그래밍 언어론 6-4강. 선택(selection) (0) | 2019.11.23 |
프로그래밍 언어론 6-3강. 시퀀싱(Sequencing) (0) | 2019.11.23 |