무조건 분기와 보호 명령

어디로든 갈 수 있는 goto는 왜 환영받지 못할까?

무조건 분기

어디로든 뛰면 따라가기 어렵습니다

무조건 분기(unconditional branching)는 조건 없이 프로그램의 지정한 곳으로 실행을 옮깁니다. goto 문이 그것입니다. 1960년대와 1970년대에 격렬한 논쟁이 있었고, 가장 큰 문제는 가독성이었습니다.

가독성은 읽고 이해하기 쉬운 정도입니다(1강). 오른쪽은 진입점이 하나인 제어 구조를 차례로 이은 모습입니다.

goto의 오늘

없애거나, 갈 곳을 정해 둡니다

Java에는 goto가 없습니다. C#에는 있지만 switch 문 안에서 쓰도록 제한합니다. 반복문의 break와 continue도 사실은 goto의 한 형태입니다. 갈 수 있는 곳이 정해져 있어서 일반 goto보다 안전합니다.

보호 명령

순서를 적지 않습니다

보호 명령(guarded command)은 다익스트라(Dijkstra)가 설계했습니다. 프로그램의 정확성을 개발하면서 검증할 수 있게 하려는 것이었습니다. 평가 순서가 중요하지 않다면 프로그램이 순서를 정해 두지 말아야 한다는 생각입니다.

보호 명령은 조건과 문장을 화살표로 이은 한 쌍입니다. CSP(여러 일을 함께 진행시키는 병행 프로그래밍을 다루는 언어)의 두 구문이 여기서 나왔습니다.

선택 보호 명령

참인 것 가운데 아무거나 하나

선택 보호 명령은 if로 시작해 fi로 끝납니다. 조건을 모두 평가하고, 참인 것이 여럿이면 그 가운데 하나를 골라 그 문장을 실행합니다. 어느 것이 뽑힐지 정해져 있지 않다는 뜻에서 비결정적(nondeterministic)이라고 합니다.

->의 왼쪽이 조건, 오른쪽이 문장입니다. []는 보호 명령 사이를 나누는 표시입니다. 참과 거짓은 예시입니다.

반복 보호 명령

참이 하나도 없을 때 끝납니다

반복 보호 명령은 do로 시작해 od로 끝납니다. 돌 때마다 조건을 모두 평가해, 참인 것 가운데 하나를 골라 실행하고 처음으로 돌아갑니다. 참인 조건이 하나도 없으면 오류가 아니라 반복이 끝납니다. 선택 보호 명령과 다른 점입니다.

참과 거짓이 바뀌는 순서는 예시입니다.

검증과 제어문

제어문이 검증의 난이도를 정합니다

제어문과 프로그램 검증은 깊이 이어져 있습니다. 이 강의가 따르는 교재는, goto가 있으면 흐름이 어디로든 갈 수 있어 검증이 불가능하다고 봅니다. 선택문과 사전 검사 논리 반복문만 쓰면 검증할 수 있고, 보호 명령만 쓰면 검증이 비교적 단순해집니다.

검증(verification)은 프로그램이 정확함을 따져서 보이는 일, 사전 검사 논리 반복문은 7편의 while입니다.

맺음

더할수록 언어는 커집니다

선택문과 사전 검사 논리 반복문만으로도 모든 알고리즘을 쓸 수 있습니다. 그런데도 언어가 제어문을 더 두는 것은 쓰기 쉽게 하려는 것이고, 그 대신 언어가 커집니다. 언어의 크기와 작성 용이성 사이의 절충입니다.

절충은 하나를 얻으려 다른 하나를 내주는 것입니다(1강). 함수형 언어와 논리형 언어는 재귀와 패턴 매칭(값의 모양으로 갈래를 고르는 것)이 제어 흐름의 주된 수단입니다. 막대 길이는 실제 비율이 아닙니다.

다음 강의

8강은 문장들을 묶어 이름을 붙이고 불러 쓰는 서브프로그램입니다

7강 끝목록으로 돌아가기