프로그래밍[Univ]/프로그래밍 언어론

[프로그래밍 언어론] Statement - Level Control Structure Part 1 - if

Cloud Travel 2011. 11. 3. 11:40
* Statement - Level Control Structure
 - 문장 수준에서 일어나는 제어 구조
 - 제어란? 컴퓨터가 실행하는 순서와 다르게 실행 위치를 변경하는 행동
                                                  
* 제어가 일어나는 단계
 ⓐ 여러개의 수식이 있을 경우 
  - a + b + c + d * e : 컴퓨터의 실행 순서에 따르면 'a+b'부터 실행해야 하지만, 'd*e'부터 실행한다.
   > 이 경우는 연산자의 우선순위와 결합법칙에 의해 컴퓨터의 실행 순서와 다르게 제어가 일어난다.
 ⓑ 프로그램 단위당
  - 함수나 Sub-Program > 함수 호출에 의해서 실행 위치가 변경된다.
 ⓒ 프로그램 안에서의 문장에 의해서 실행위치가 변경 
   ※ ⓐ는 이미 이전에 설명한 것이므로 Pass하고 이번엔 ⓒ를 중점적으로 살펴 보겠다.

* 제어 구조의 탄생 
 - 60년대 : 제어를 조절하는 방법은 오직 go-to문 밖에 존재하지 않았다.
  > 당시 프로그램의 구조를 flow chart로 구성을 많이하였는데, 다양한 flow chart를 분석해보니 2가지 제어문이
     있으면 모든 제어가 가능할 것이라고 판단을 내렸다. 이에 의해서 태어난 것이 Two way selection(if-else), 
     Pretest logical loops(while) 제어 구조이다.
 - 제어문의 설계이슈 (Optimal/Best set 찾기)
  > 어떤 제어문을 제공할 것인가?
  > 어느 정도의 양을 제공할 것인가?

* 제어 단위
 - Single Statement : 말 그대로 단 하나의 구문이 제어에 의해서 발생한다.
 - Compound Statement 
  > begin-end 까지를 하나의 단위로 취급하여 사이에 있는 구문을 하나의 제어 단위로 취급
  > C계열은 begin을 {, end를 }로 대처하고, Compound대신 block이란 단어를 사용하였다.
     Block은 멀리서 보면 구분이 잘 안가서 가독성에서 떨어진다.

* Selection Statements(선택구문 : if, switch, ...)
 -  설계 이슈
  > 제어문의 형태는 어떻게 취할 것인가?
  > 조건식에 들어가는 Form과 Type은 어떻게 할 것인가?
  > 조건에 의해서 실행되는 제어단위는 어떤걸 지원 할 것인가? (Single? Compound? Multi?)
  > else의 matching은 어떤 규칙으로 제공해 줄 것인가?
     


* If문의 발달 과정 
 - if문의 초기형태는 single way로 출발 하였다. 또한, 제어단위가 Single로 밖에 지원이 되지 않았다.
  > IF(<boolean_expr>) statement;
   ex) IF ( a > 0 ) 에 해당하는 statement가 3개가 있다면 두가지 방법으로 해결을 한다. 
       

        ⓐ 해당 statement에 해당하는 것을 모두 써준다. 3번 if문을 작성
        ⓑ 반대의 경우를 제시하고, 반대의 경우에 해당하면 goto문을 이용하여 점프하게 만든다.

 - 제어단위가 Single임에 의해 발생하는 문제를 해결하기 위해서 Compound Statement가 탄생했다.
   (ALGOL 60에서 처음 제공되었다.)

  ex) if ( a > 0 ) 에 해당하는 statement가 3개 있다. 이를 알골 형식으로 표현하면..?
       

       > ㅁ박스처럼 begin-end사이에 stmts를 넣으면 된다.
 - 또한, ALGOL 60은 if문과 더불어 else문을 제공해주어서 two way를 제공해주었다.
   

 - if문에 else문이 제공되면서 생긴 문제는 바로 Nested Selectors이다.
   간단히 말하면 else를 어떤 if에 묶어주는가의 문제이다.
   

   (In Pascal) pascal은 단지 가장 가까운 then과 match시킨다.
   (In ALGOL 60) 위에서 봤듯이 compound를 이용하여 문제를 해결하였다.
     > ALGOL 60에서 else를 해당 if와 묶어주기(필자가 생각한 방법이므로 정답은 아닙니다.)

       


     > else의 매칭 문제는 해결되었지만, ALGOL60의 compound 개념에는 약점이 있었다.
        ALGOL60에서는 if문 뿐만아니라 모든 compound 개념에 begin과 end를 사용하여 다음과 같은 문제가 발생
       
 
       무분별한 begin-end의 사용으로 가독성이 매우 떨어진다. 위에서는 들여쓰기를 하여 구분이 됬지만
       실제로 보게 되면 어떤 것에 해당하는지 이해하기 힘들 것이다.
       이러한 것을 해결하기 위해 Ada는 새로운 닫는 키워드를 생성했다.
   (In Ada) if문의 끝을 알려주는 end if 기호를 생성하여 매칭문제를 해결

    > Ada에서 매칭 else의 매칭 위치 알기 
       

        알골과 다르게 if문의 끝이 정확히 어딘지 모두다 명시가 되어있고,
       if문 만의 compound 닫는 키워드가 따로 있다. (for while... 등에 해당하는 compound 닫는 키도 존재)
       
* if문의 끝(현 시점에서의 최종단계)
 - if문의 최종버전인 Ada는 유연하고 가독성도 높다.