기타 업적

속성 문법

언어에는 문법Syntax과 의미Semantics가 있다고 한다. 일단 문법이 틀린 문장은 해석할 수가 없다. 그런데 문법이 맞는 문장이더라도 말이 안 되는 경우가 있다. 예를 들면, “나는 커피를 운전했다”와 같은 문장이 있을 수 있다.

프로그래밍 언어도 마찬가지이다. 문법에 맞더라도 실행이 되면 오류를 발생시키는 경우가 있다. 예를 들면 1 + ‘a’ 같은 명령문이다. 프로그래밍 언어에서는 이런 경우에 타입type이 잘못되었다고 표현한다.

고급 언어로 작성된 프로그램 소스 코드를 기계어로 변환하는 과정에서 문법과 의미 두 가지 모두 문제가 없는지 확인할 수 있다면 좋을 것이다. 다행히 문법의 경우는 BNF라는 표기법을 바탕으로 문법 규칙을 정확하게 기술할 수 있고 컴파일러는 이 규칙들을 사용하여 프로그램 소스 코드의 문법 오류를 찾아낸다.

그런데 의미Semantics는 그 규칙을 기술하기가 쉽지 않았다. 그래서 컴파일러는 다양한 경우의 수를 고려하여 타입 검사type checking를 하는 알고리듬을 구현해야 했다. 1960년대에 컴퓨터 과학자들은 문법 규칙처럼 의미도 규칙을 기술해보려 시도했으나 어려움을 겪었다.

1967년에 커누스는 이를 해결하기 위한 방법으로 속성 문법Attribute grammar이라는 것을 고안했다. 그는 기존의 컴파일러에서 사용하는 파싱 트리의 각 노드마다 속성attribute이라는 것을 추가한 후 이 속성의 값이 트리의 경로를 통해 전파되는 방식을 제안했다. 속성의 값은 타입type일 수도 있고, 아니면 에러error 값일 수도 있다. 파싱 트리 내에서 속성이 전파되는 것을 표현하기 위해 그는, 문법을 기술하는 데 사용되는 BNF 표기법에 속성 표기법을 추가했다.

속성 문법은 속성값이 하향식Top-down으로도 전파되고, 상향식Bottom-up으로도 전파될 수 있어서 자칫하면 무한 반복이 생기는 단점이 있었다. 그래서 초기에 커누스는 이 문제를 해결하기 위해 많은 노력을 기울였으나 여전히 허점이 노출되곤 했다. 커누스는 1970년대 중반 이후로는 속성 문법을 연구하지 않았지만 후에 다른 연구자들에 의해 많은 후속 연구가 이루어졌다.

TeX

‘조판typesetting을 위한 언어’라는 표현은 좀 생경할 수 있다. ‘언어’라는 단어가 주는 어색함 때문일 것이다. ‘조판을 위한 컴퓨터 언어’라고 쓰면 조금 나아 보인다. ‘컴퓨터 언어’란 무엇인가? 컴퓨터에게 일을 시키기 위한 언어이다. 따라서 앞의 표현을 좀 더 풀어쓰면 ‘컴퓨터에게 조판 일을 시키기 위한 언어’라고 쓸 수 있겠다.

조판은 인쇄를 위해서 활자를 배치하는 작업이다. 컴퓨터를 이용한 인쇄에는 활자가 존재하지 않는다. 대신에 폰트가 존재한다. 따라서 컴퓨터 조판은 결국 인쇄를 위해 폰트를 배치하는 작업이다. 그러므로 ‘조판을 위한 컴퓨터 언어’는 결국 컴퓨터에게 어떤 폰트를 어느 위치에 놓으라고 지시하기 위한 언어이다.

언뜻 보면 상당히 단순해 보이지만 제대로 하려면 쉽지 않은 일이다. 인쇄란 심미적인 부분이 반영되어야 하기 때문이다. 역시나 이것도 ‘Art’이다. 영문 알파벳은 글자의 폭이 다르기 때문에 일정한 간격으로 배치하면 미려하지 않다. 그렇다고 조판을 위한 언어를 사용할 때, 글자마다 간격을 얼마로 하라고 일일이 지정하는 것은 편의성을 무시한 처사가 될 것이다. 특히나 영어는 줄 바꿈에서 문제가 발생한다. 긴 단어의 경우 중간을 끊고 하이픈(-)을 넣어주는데 이를 미리 계산해서 지정해주는 것은 쉽지 않다. 수식 처리도 문제이다. 수식은 다양한 기호가 사용되며 전체 폭과 높이가 불규칙적이다. 전체적으로 문서의 다른 부분과 조화롭게 어울리도록 수식을 배치하는 일은 만만치 않은 과제이다.

폰트를 배치하는 작업이 조판이라고 했으므로 폰트에 대한 고려는 필수적이다. 커누스는 심미적으로 훌륭한 인쇄물을 원했으므로 폰트에도 많은 정성을 기울였다. 컴퓨터 인쇄를 위한 폰트가 변변치 않던 시절이었으므로 그는 직접 폰트를 만들기로 결심했다. 그는 당시 제록스 PARC 연구소에서 컴퓨터용 벡터 폰트를 개발하는 모습을 본 적이 있었다.​‡‡​ 그래서 제록스 PARC의 장비로 자신이 폰트를 개발해도 될지를 문의했다고 한다. 제록스에서는 흔쾌히 승낙했지만 한 가지 조건이 있었다. 그곳에서 개발한 폰트는 제록스의 소유라는 것이었다. 커누스의 마음에 들지 않았음은 당연했다.

그래서 나는 스탠퍼드 인공지능 연구소에서 작업을 했습니다. 거기에는 좋은 고정밀도 카메라가 없었습니다. 일반 TV용 카메라를 사용했는데 왜곡이 너무 심했습니다. 조명이 조금만 밝아져도 스크린에 나타나는 글자의 폭이 25%나 커졌습니다. 고품질의 결과물을 얻기는 불가능했죠. 어떻게든 괜찮은 결과물을 얻어내기 위해 온갖 트릭을 배워야 했습니다. 폰트를 만드는 일은 내가 예상했던 것보다 아주 훨씬 어려웠습니다.​2​

TeX을 위해 커누스가 바친 세월이 10년이나 되었다는 점은 이 일이 얼마나 힘들었는지를 가늠케 해준다.

TeX 언어는 기본적으로 매크로 방식이다. 어떤 명령어가 나타나면 그것에 해당하는 실제 코드가 그 자리를 대체한다. TeX 언어로 작성한 문서(실질적으로는 프로그램)는 언뜻 보기에는 중간중간에 특수문자가 들어간 일반적인 텍스트 문서처럼 보인다. 아래와 같은 식이다.

The quadratic formula is $-b \pm \sqrt{b^2 - 4ac} \over 2a$
\bye

$는 수식의 시작과 끝을 표시한다. \가 붙은 단어가 TeX의 명령어로 실제로는 매크로macro이다. \pm은 ± 기호로 바뀌고 \sqrt는 √로 바뀌는 식이다. \bye는 프로그램의 끝을 나타낸다. 이것이 인쇄되면 아래와 같이 나타나게 된다.

The quadratic formula is -b \pm \sqrt{b^2 - 4ac} \over 2a

TeX은 폰트의 배치를 정하는 일을 하지만, 문서 전체의 구조와는 관련이 없다. 그래서 실제로 문서를 작성할 때는 LaTeX이라는 도구를 사용한다​9​. LaTeX은 TeX을 기반으로 만들어진 상위 개념의 도구이다. LaTeX은 문서의 구조를 지정하는 추가 명령어를 가지고 있으며 아울러 TeX이 제공하는 명령어도 포함하고 있다.

문학적 프로그래밍

‘문학적 프로그래밍Literate programming‘이라고 흔히 번역되지만 ‘서술적 프로그래밍’이 더 적절하지 않나 싶다. 기존의 프로그래밍 언어와 비교했을 때 형태적으로 느낄 수 있는 차이점이라면, 블록block을 매크로 방식으로 구현하는데 이때 사용하는 매크로 이름이 ‘서술형’이라는 것이다. 아래의 예를 보자. 참고로 이 예는 완전한 코드가 아니라 일부만 발췌한 것이다.​10​

#define _ALL_SOURCE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
<data structures>
<function prototypes>
<main program>
<service routines>
@ 

<data structures> =
typedef struct _reference {
  struct _reference *next, *prev;
  char *reftext;
} REF;
@ 

<service routines> =
process_art( FILE *art_fp, char *art_name )
{
  <process_art local variables>
  <allocate and initialize an article>
  <parse the article headers>
#ifdef DEBUG
  show_headers(art);
#endif
  place_article(art);
}
@ 

<process_art local variables> =
  char buf[BUFSIZ];
  ART *art;
  char *s, *t;
@ 

이것은 C언어에 기반한 CWEB라는 언어로 작성한 서술형 프로그램이다. 관심을 가질 부분은 < >로 되어 있는 매크로 부분이다. < >는 매크로를 의미하는데 그 안의 이름과 일치하는 매크로를 찾아서 대치된다. 흥미로운 점은 매크로의 이름이 일반적인 프로그래밍 언어와는 달리 여러 개의 단어로 구성된 서술형 문장이라는 점이다. 훨씬 사람이 이해하기에 편하다. 이렇게 작성된 프로그램은 별도의 주석이 필요하지 않다는 장점도 있다.

CWEB는 커누스와 실비오 레비Silvio Levy가 1987년에 발표한 서술형 프로그래밍 언어이다. CWEB로 작성된 프로그램 소스 코드는 CTANGLE과 CWEAVE라는 두 개의 도구를 통해 각각 C 소스 코드와 TeX 문서로 변환된다.

한국과의 관계

커누스가 한국과 관련하여 언급한 몇 가지를 소개하고자 한다. 먼저 그는 기회가 있을 때마다 CWEB에 대한 애착을 보여왔는데 2007년 인터뷰에서는 CWEB 매뉴얼이 한국어로 번역되었음을 소개하기도 했다.

얼마 전에 한국에서 편지를 받았습니다. 편지를 쓴 친구는 CWEB가 아주 멋지다는 의견을 주면서 자신이 CWEB 매뉴얼을 한국어로 번역했다고 알려주었습니다.​2​

여기서 언급된 한국인은 남수진Soojin Nam 님으로 해당 매뉴얼은 https://github.com/sjnam/tex/blob/master/cwebman.ko.pdf에서 찾을 수 있다.

두 번째로 소개할 인물은 김치헌Chihurn Kim 님이다. 커누스는 자신의 작업에서 오류를 찾아서 신고해주는 사람에게 소정의 상금을 주는 것으로 유명하다. 그런데 아직 상금을 찾아가지 않은 사람들 목록에 김치헌 님이 포함되어 있다.

상금이라고는 하나 액수가 2.56달러에 불과하다. 과거에는 실제로 수표를 보냈다고 하는데, 수표를 위조하는 사례가 발생하면서 중단된 상태이다. 그 대신에 Bank of San Serriffe라는 가상의 은행에 계좌를 만들어 상금을 입금해주고 있다.


  1. ​*​
    출처: https://en.wikipedia.org/wiki/Donald_Knuth, CC BY-SA 2.0
  2. ​†​
    구 소련의 컴퓨터 과학자이다.
  3. ​‡​
    출처: https://catonmat.net/donald-knuths-first-computer
  4. ​§​
    첫 번째 튜링상 수상자
  5. ​¶​
    한국어로 발음할 때는 ‘텍’이라고 한다. 그래서 TeX뒤의 조사가 ‘를’이 아니라 ‘을’이다.
  6. ​#​
    두 명의 대학원생은 Michael Plass와 Frank Liang이다. Michael Plass는 line-breaking 연구를 했고, Frank Liang은 hypenation 연구를 했다. 후에 Plass는 제록스에서, Liang은 마이크로소프트에서 문서 작성 프로그램 개발의 핵심 역할을 했다.
  7. ​**​
    출처: https://www-cs-faculty.stanford.edu/~knuth/taocp.html, by Héctor García-Molina
  8. ​††​
    이 튜링상 수상 강연은 컴퓨터와 상관없는 이에게도 권하고 싶을 정도로 유익하고 위트가 넘친다.
  9. ​‡‡​
    이 폰트를 개발하고 있던 버틀러 램슨도 후에 튜링상을 받았다.

참고문헌

  1. 1.
    Knuth DE. Computer programming as an art. ACM Turing Award Lectures.:1974. doi:10.1145/1283920.1283929
  2. 2.
    An Interview with Donald Knuth 1974 ACM Turing Award Recipient, Interviewed by Edward Feigenbaum. Computer History Museum; 2007:82. https://amturing.acm.org/pdf/KnuthTuringTranscript.pdf
  3. 3.
    A Look Back: A 1996 Interview with Donald Knuth on The Art of Computer Programming. informIT. Published March 31, 2009. https://www.informit.com/articles/article.aspx?p=1327952
  4. 4.
    Ervin Knuth D. The Art of Computer Programming: Fundamental Algorithms. Addison-Wesley; 1968.
  5. 5.
    Knuth D. Digital Typography. Stanford University; 1998.
  6. 6.
    Interview with Donald Knuth by Andrew Binstock. informIT; 2008:1. https://www.informit.com/articles/article.aspx?p=1193856
  7. 7.
    Programming for the UNIVAC FAC-TRONIC System. Remington Rand; 1953:1-267.
  8. 8.
    Knuth DE. On the translation of languages from left to right. Information and Control. Published online December 1965:607-639. doi:10.1016/s0019-9958(65)90426-2
  9. 9.
    Lamport L. LATEX: A Document Preparation System. Addison-Wesley; 1986.
  10. 10.
    Copeland J, Haemer J. Cathedrals, Bazaars, and News Readers. SunExpert Magazine. Published online July 1998:57–61.

1 2 3 4 5