2022. 7. 24. 17:34ㆍ카테고리 없음
[서론]
데이크스트는 goto 문장이 모듈을 더 작은 단위로 나눔에 있어서 방해가 된다는 사실을 발견하였고, 모듈을 분해할 수 없다면, 합리적으로 증명할 때 필수기법인 분할 정복 접근법을 사용할 수 없음을 알게 되었다.
반면, goto 문장을 사용하더라도 문제가 되지않는 경우가 있는데, 이런 경우는 분기(if/else/then) 또는 반복(do/while/until)과 같은 경우이다.
모듈이 이러한 종류의 제어 구조만을 사용한다면, 증명 가능한 단위로까지 모듈을 재귀적으로 세분화하는것이 가능해보였다.
그는 이러한 제어구조는 순차 실행과 결함했을 때 특별?하다는 사실을 깨달았다.
특별하다고 말하는 이유는 모든 프로그램은 순차, 분기, 반복 세 가지의 구조만으로 표현할 수 있기 때문이다.
즉 모듈을 증명 가능하게 하는 바로 그 제어 구조가 모든 프로그램을 만들 수 있는 제어구조의 최소 집합과 동일하다는 사실 때문이다.
구조적 프로그래밍은 이렇게 탄생하였다.
[본론]
구조적 프로그래밍을 통해 모듈을 증명 가능한 더 작은 단위로 재귀적으로 분해할 수 있게 되었고, 이는 결국 모듈을 기능적으로 분해할 수 있음을 뜻했다. 그리고 이렇게 기능적으로 분해된 모듈은 다시 저수준의 함수들로 분해할 수 있고 이는 끊임없이 반복할 수 있다.
이 기법을 사용하면 프로그래머는 대규모 시스템을 모듈과 컴포넌트로 나눌 수 있고, 이는 입증할 수 있는 작은 기능들로 세분화 될 수 있다.
하지만 결국, 엄밀한 (수학적) 증명은 이루어지지 않았다. (프로그램 관점에서 정리에 대한 유클리드 계층구조는 끝내 만들어지지 않았다)
다행히도 무언가가 올바른지를 입증하는데 수학적 증명만이 존재하는 것은 아니다. 다른 전략으로 과학적 방법이 있다.
과학은 서술된 내용이 사실임을 증명하는 것이 아니라 서술이 틀렸음을 증명하는 방식으로 동작한다. 반례를 들 수 없으면 참이라고 보는 것이다.
<테스트>
과학적 방법에 근거하여, '테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다' 다시 말해 프로그램이 잘못되었음을 증명할 수는 있지만, 맞다고는 증명할 수는 없는 것이다.
[결론]
구조적 프로그래밍이 오늘날까지 가치 있는 이유는 반증가능한 단위를 만들어 낼 수 있는 능력 때문이다. 또한 현대적 언어가 아무런 제약이 없는 goto 를 지원하지 않는 이유이기도 하다. 소프트웨어는 구조적 프로그래밍에 근거하여 아키텍처가 모듈, 컴포넌트, 서비스가 쉽게 반증 가능하도록 만들어지도록 노력해야 한다. 이를 위해서는 제한적인 규칙들을 받아들여 활용해야 하는데, 이것이 바로 객체 지향 프로그래밍인 것이다.