기타 업적

case 문

현대의 고급 프로그래밍 언어는 조건문과 반복문을 예외 없이 지원한다. 조건문은 if … then … else의 형태가 보편적이다. 그런데 조금 독특한 조건문 형태가 있다. switch 문이다. C언어나 Java 언어에서는 switch … case의 형태가 사용되고 python 언어에서는 match … case의 형태가 사용된다.

포트란 언어는 원래 이런 형태의 조건문을 지원하지 않았다. switch라는 예약어는 알골 언어에서 처음 등장한다. 하지만 지금과는 행태가 완전히 달랐다. switch는 레이블label을 원소로 가지는 일종의 배열이었다. 레이블이란 프로그램의 어떤 위치를 표시하는 명칭identifier이고 흔히 goto 명령에서 점프할 위치를 지정할 때 사용한다. 아래의 예를 보자.

integer a;
switch I := L_1, L_10, L_43; 

// a의 값을 결정하는 작업이 진행된다.

go to I[a];

L_1:  a := a + 1;
      go to L_100;
L_10: a := a - 1;
      go to L_100;
L_43: a := a / 10;
      if (a < 1) then a = 100;
L_100:

I라는 switch 타입의 변수는 3개의 레이블(즉, L_1, L_10, L_43)을 원소로 가지고 있다. go to I[a]가 수행되면 a의 값에 따라서 점프하게 될 위치가 달라진다. 만약 a의 값이 1이면 I[1]은 switch 타입의 변수 I의 첫 번째 원소인 L_1에 해당하므로 go to L_1이 되어 결국 다음에 수행할 명령은 a := a + 1이 된다. 만약 a의 값이 3이라면 프로그램의 수행은 L_43으로 점프하게 된다.

문제는 switch 타입의 변수의 원소로 단순히 레이블 값만 올 수 있는 것이 아니라, 수식이 올 수도 있다는 것이었다. 즉 다음과 같은 경우가 가능하다.

integer m;
switch Q:= P_1, P_2;
switch S:= L_1, L_10, Q[m], if v>-5 then L_1 else L_43;

S라는 switch 타입의 변수에서 3번째 원소, Q[m]과 4번째 원소, if v>-5 then L_1 else L_43은 실제로 프로그램이 실행되어야만 알 수 있는 값이다. 그래서 토니는 이런 방식이 컴파일러를 구현하기에 너무 어려우며 예상치 못한 문제를 일으킨다고 보고 새로운 방식을 제안했다.​1​ case 문이라고 불리는 이 방법은 알골-W에 포함되었다.​14​ 앞의 예를 case문으로 구현하면 다음과 같다.

case a of
begin 
 a:= a + 1;
 a:= a - 1;
 begin
   a:= a / 10;
   if (a < 1) then a = 100;
 end
end

case 문의 begin … end 블록 안에 있는 명령어들은 순차적으로 수행되는 것이 아니라, 일종의 목록으로 이해해야 한다. case 뒤에 오는 변수의 값에 의해서 이 목록 중 하나가 실행되는 것이다.

대통합 이론 (Unifying theories)

은퇴 후 마이크로소프트에서 객원 연구원으로 일하면서 그는 프로그래밍 언어의 의미론을 하나로 통합하려는 시도를 했다. 프로그래밍 언어의 의미론에는 토니가 주도했던 공리적 의미론 외에 표시론적 의미론denotational semantics​15​과 동작적 의미론operational semantics이 있었는데, 그는 이 세 가지를 하나로 합치고 싶었다.

대통합 이론은 저에게 일종의 취미생활이었습니다. 과학의 다른 영역들을 보면 대통합 이론은 그 자체로 의미를 가지는 도전과제입니다. 컴퓨팅 분야는 그런 정도에 이르기에는 충분히 성숙하지 않았죠. 그러다 보니 많은 프로그래밍 이론이 생겨났고 서로 경쟁하듯이 보였습니다. 하지만 깊숙이 들여다보면 결국은 같은 주제에 대한 변주들일 수도 있겠다고 나는 생각했습니다.​4​

마이크로소프트에서의 활동

마이크로소프트는 토니 호어를 객원 연구원으로 초빙하면서 아무런 요구도 하지 않았다. 그래서 토니는 자유롭게 하고 싶은 연구를 할 수 있었다. 그런데 의외의 상황이 그의 공리적 의미론을 실무 현장으로 끌어들였다.

내가 공리적 의미론에 관한 논문을 썼을 때만 해도, 상당한 기간 동안 업계에서 여기에 관심을 가지지 않으리라고 생각했습니다…. 정말로 그랬습니다. 마이크로소프트는 형식화된 방법formal method을 오랫동안 사용하지 않았습니다. 그런데 내가 예상하지 못한 이유로 그들은 필요에 의해 그것을 사용하게 됩니다. 오류가 까딱 잘못하면 사람의 목숨도 앗아갈 수 있는 상황이 생기게 된 것인데요. 다름 아닌 바이러스의 등장이었습니다. 이것은 나는 물론이고 마이크로소프트도 전혀 예상하지 못한 것이었습니다. 그래서 그들은 바이러스의 위협에 대응하기 위해 형식화된 방법을 사용하여 프로그램 분석을 시작했습니다.​3​

30년 전에 시작했던 연구가 갑자기 빛을 발하는 상황을 직접 목격하는 기분은 남달랐을 것으로 추측된다. 그는 자신이 운이 좋았다면서 이렇게 말하기도 했다.

사실 이것은 한 사람이 30년 동안 연구하기에 멋진 주제였습니다. 왜냐하면 산업계에서 30년 동안 받아들이지 않았다는 말은, 곧 내가 산업계와 경쟁할 필요가 없고 30년 동안 이 주제를 내 것으로 계속 유지할 수 있었다는 의미이니까요.​5​

널 포인터

널 포인터null pointer 혹은 널 레퍼런스null reference 는 포인터 변수가 아무것도 가리키고 있지 않음을 의미한다. 프로그래밍을 할 때는 흔히 null 이라는 값으로 표현된다. 이 개념을 처음 도입한 사람이 토니 호어이다. 1965년에 알골-W를 설계할 때 도입되었다.

우리가 프로그래밍을 할 때 변수를 선언하게 되면 그 값의 초기값을 지정해준다. 초기값을 지정하지 않는 경우, 자동으로 0이라는 값을 설정하는 컴파일러도 있지만 대부분의 컴파일러는 오류라고 판단한다. 그런데 포인터 변수는 좀 애매하다. 포인터 변수란 어떤 주소를 가리키는 변수를 의미한다. 경우에 따라서는 아무것도 가리키지 않을 수 있기 때문이다. 그리고 아무것도 가리키지 않는다는 개념이 유용하다. 예를 들어 아래와 같은 자료 구조를 생각해보자.

연결 리스트의 예​‡‡​

위에서 하나의 객체는 정수형 변수와 포인터 변수로 구성되어 있다. 이 포인터 변수는 다음 객체의 주소값을 저장한다. 만약 위와 같은 연결 리스트linked list에서 모든 객체에 접근하려면, 첫 객체에서부터 시작하여 포인터 변수를 따라가면 된다. 그런데 마지막 객체는 더 이상 가리킬 객체가 없으므로 포인터 변수값이 null이 된다. 그러므로 다음과 같이 코드를 작성할 수 있다.

p = head: // p는 포인터 변수이고 head는 첫 번째 객체의 주소이다.
while (p->next != null) { // next는 객체에 있는 포인터 변수의 이름이다.
    p = p->next;
}

개수를 알 수 없는 경우에 매우 유용하게 사용할 수 있다.

하지만 토니 호어가 구현한 널 포인터는 큰 실수였음을 본인이 인정했다. 그는 2009년에 열린 강연에서 다음과 같이 말했다.

이건 내가 저지른 10억 달러짜리 실수입니다… 1965년 당시에 나는 널 포인터를 추가하고 싶은 충동을 억누를 수 없었습니다. 왜냐하면 그냥 너무 구현하기 쉬웠거든요. 지난 40년 동안 그것 때문에 엄청나게 많은 오류, 취약점, 시스템 중단 등이 양산되어서 그로 인한 고통과 손실을 따져보면 10억 달러는 될 것 같네요.​16​

그가 구현한 널 포인터의 문제점은, 그 자체에 타입이 없다는 점이다. 무슨 포인터 변수이든지 간에 null이라는 값을 가질 수 있기 때문에 컴파일 과정에서 널 포인터가 잘못 사용되는 것을 걸러낼 수 없다.


  1. ​*​
    출처: https://en.wikipedia.org/wiki/Tony_Hoare, CC BY-SA 2.0 fr
  2. ​†​
    출처: https://www.bl.uk/voices-of-science/interviewees/tony-hoare#
  3. ​‡​
    Autocode는 1950년대에 영국에서 사용되던 일종의 고급 프로그래밍 언어이다. 다양한 Autocode가 존재했는데 조금씩 달라서 호환성은 없었다.
  4. ​§​
    어떤 식으로 퀵 정렬을 구현했는지는 알려진 바가 없다. 아직 재귀적 호출이 사용되기 전이었으므로, 특정 입력에만 한정된 코드가 아니었을까 추측해본다.
  5. ​¶​
    니클라우스 비르트가 스탠퍼드 대학교의 교수로 있을 때 개발한 언어이다.
  6. ​#​
    이것을 thrashing이라고 부른다.
  7. ​**​
    이해를 돕기 위해 단순화하는 과정에서 실제 문법과는 맞지 않는 부분이 있을 수 있음을 밝힌다.
  8. ​††​
    에드스거 다익스트라는 1972년에, 올레-요한 달은 2001년에 튜링상을 수상했다.
  9. ​‡‡​
    출처: https://en.wikipedia.org/wiki/Linked_list

참고문헌

  1. 1.
    Hoare Charles Antony Richard. The emperor’s old clothes. ACM Turing Award Lectures. Published online 1980. doi:10.1145/1283920.1283936
  2. 2.
    제임스 윌킨슨 – 튜링상 수상자 시리즈. 지식함지. Accessed April 4, 2023. https://knowledgebasin.com/archives/persons/%ec%a0%9c%ec%9e%84%ec%8a%a4-%ec%9c%8c%ed%82%a8%ec%8a%a8
  3. 3.
    An Interview with Tony Hoare by Cliff Jones. ACM; 2015:1-29. https://amturing.acm.org/interviews/hoare_4622167.cfm
  4. 4.
    Oral History of Sir Antony Hoare by Jonathan P. Bowen. Computer History Museum; 2006:1-25.
  5. 5.
    An Oral History of British Science: Professtor Sir Tony Hoare, Interviewed by Dr Thomas Lean. The British Library; 2011:1-190.
  6. 6.
    존 배커스 – 튜링상 수상자 시리즈. 지식함지. Accessed April 3, 2023. https://knowledgebasin.com/archives/persons/%ec%a1%b4-%eb%b0%b0%ec%bb%a4%ec%8a%a4
  7. 7.
    Floyd Robert W. Algorithm 97: Shortest path. Commun ACM. Published online June 1962:345. doi:10.1145/367766.368168
  8. 8.
    Hoare CAR. An axiomatic basis for computer programming. Commun ACM. Published online October 1969:576-580. doi:10.1145/363235.363259
  9. 9.
    Axiom. Wikipedia. Accessed April 4, 2023. https://en.wikipedia.org/wiki/Axiom
  10. 10.
    에드스거 다익스트라 – 튜링상 수상자 시리즈. 지식함지. Accessed April 3, 2023. https://knowledgebasin.com/archives/persons/%ec%97%90%eb%93%9c%ec%8a%a4%ea%b1%b0-%eb%8b%a4%ec%9d%b5%ec%8a%a4%ed%8a%b8%eb%9d%bc
  11. 11.
    Hansen Per Brinch. The programming language Concurrent Pascal. IIEEE Trans Software Eng. Published online June 1975:199-207. doi:10.1109/tse.1975.6312840
  12. 12.
    Hoare CAR. Communicating sequential processes. Commun ACM. Published online August 1978:666-677. doi:10.1145/359576.359585
  13. 13.
    Dahl OJ, Dijkstra EW, Hoare CAR. Structured Programming. Academic Press; 1972.
  14. 14.
    Sites Richard L. Algol W Reference Manual. Stanford University; 1972:1-160. https://www.algol60.org/docsW/AlgolW_STAN.pdf
  15. 15.
  16. 16.
    Hoare CAR. Null References: The Billion Dollar Mistake. infoQ.com. Published August 25, 2009. http://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare

1 2 3 4 5 6