증명
- 데이크스트라가 초기에 인식한 문제는 프로그래머는 프로그래밍을 잘하지 못한다는 사실
- 그는 '증명'이라는 수학적인 원리를 적용하여 문제를 해결하고자 했다
- 그럴려면 단순한 알고리즘에 대해 기본적인 증명을 작성할 수 있는 기법을 보여줘야 한다는 사실 인지
- 연구를 진행하면서 goto 문장이 더 작은 단위로 재귀적으로 분해하는 과정에 방회가 되는 경우가 있다는 사실 발견
- goto문을 사용하더라도 모듈을 분해할 때 문제가 되지 않는 경우도 있었다
- if/then/else와 do/while과 같은 분기와 반복이라는 단순한 제어 구조에 해당한다는 사실 발견
- 모듈이 이러한 종류의 제어 구조만을 사용한다면 증명 가능한 단위로까지 모듈을 재귀적으로 세분화하는 것이 가능해보였다
- 이러한 제어 구조는 순차 실행과 결합했을 때 특별하다는 사실을 인지
- 뵘과 야코피니가 그보다 2년 앞서 발견했는데 모든 프로그램은 순차, 분기, 반복 세가지 구조만으로 표현할 수 있다는 사실 증명
- 즉, 모듈을 증명 가능하게 하는 바로 그 제어 구조가 모든 프로그램을 만들 수 있는 제어 구조의 최소 집합과 동일하다는 사실!
- 구조적 프로그래밍은 이렇게 탄생
- 데이크스트라가 발견한 3가지 구조
- 단순한 열거법을 이용해 '순차' 구문이 올바름을 입증할 수 있다는 사실을 보여주었다. 이 기법에서는 각 순차 구문의 입력을 출력까지 수학적으로 추적
- '분기'의 경우 열거법을 재적용하는 방식으로 처리. 분기를 통한 각 경로를 열거
- '반복'은 조금 다르다. 올바름을 증명하기 위해 귀납법 사용.
해로운 성명서
- 데이크스트라가 'goto문의 해로품'으로 세 가지 제어 구조에 대한 자신의 의력을 피력했다
- 이로인해 10년 이상 논쟁이 벌어졌지만, 그가 승리하여 goto문은 거의 사라졌다
- 현재 우리 모두는 구조적 프로그래머이며, 선택의 여지가 없다
- 제어흐름을 제약 없이 직접 전환할 수 있는 선택권 자체를 언어에서 제공하지 않는다
기능적 분해
- 구조적 프로그래밍을 통해 모듈을 증명 가능한 더 작은 단위로 재귀적으로 분해 가능해졌다