문학적 프로그래밍

문학적 프로그래밍(literate programming)은 프로그래밍 방법론의 한 가지로, 프로그래밍을 할 때 컴퓨터로 컴파일 가능한 코드를 만드는 것보다 사람이 이해하기 쉬운 코드를 만드는 것에 중점을 두는 방법이다. 다시 말해, 사람이 보고 이해할 수 있도록 문서를 만들듯이 프로그래밍을 하는 것이 목적이다. '마치 문학작품을 읽는 것처럼 프로그래밍을 읽을 수 있도록 만드는 것'이 목표이므로 '문학적 프로그래밍'이라는 이름을 지었다.

문학적 프로그래밍에서는 프로그램에 대한 문서와 소스 코드가 하나의 소스 파일에 들어 있으며, 특별한 프로그램을 사용하여 문서와 소스 코드를 각각 따로 뽑아낸다. 소스 코드는 흔히 '덩어리'라고 부르는 단위로 구분하고, 각각의 덩어리가 어떤 원리로 동작하는지 등을 소스 파일에서 자세히 설명한다. 여기서 덩어리는 실제 소스 코드의 순서와 다르게 배열되어도 상관 없으며, 문서로 설명하고자 하는 순서대로 배열한다. 컴파일러나 인터프리터가 처리할 수 있는 형태로 만드는 것은 별도의 프로그램을 이용한다.

기원 편집

처음으로 개발된 문학적 프로그래밍 환경은 도널드 커누스TeX 조판 시스템을 만들면서 1981년에 개발한 이다. 웹은 프로그래밍 언어로는 파스칼을 사용하고, 문서화는 TeX을 이용한다.

커누스는 TeX 전체 소스를 문학적 프로그래밍 형식으로 만들었고 이것을 문서화해서 자신의 다섯권짜리 책 《Computers and Typesetting》중에서 B권 《TeX: The program》으로 출판했다. 커누스는 1979년부터 DOC이라고 이름 지은 문학적 프로그래밍 환경을 이용했다. 커누스 본인은 Pierre Arnoul de Marneffe의 아이디어에서 영감을 얻어 이 작업을 시작했다고 한다. 파스칼만 사용할 수 있는 웹의 단점을 보완하여, 커누스와 레비는 CWEB을 만들었다. CWEB의 특징은 다음과 같다.

  • 프로그래밍 언어로 C, C++, 자바 등을 사용할 수 있다.
  • 대부분의 운영체제에서 돌아간다.
  • TeX뿐 아니라 PDF 문서도 만들 수 있다.

다른 문학적 프로그래밍 툴에는 noweb, FunnelWeb 등이 있다.

구현 편집

문학적 프로그래밍 툴 중에서 가장 널리 쓰이고 가장 강력한 것으로 Leo가 있다. Leo는 내부적으로 noweb과 CWEB 처리기를 내장하고 있으며, 사용하기 편리한 인터페이스를 가진 편집기도 제공한다. 윈도우, 리눅스, OS X 등 다양한 시스템에서 돌아간다. Leo 설명서에는 문학적 프로그래밍에 대해서 알기 쉽게 설명한 것도 들어 있다.

문학적 프로그래밍과 비슷하게, 다음과 같은 문서 생성기를 이용하여 프로그램의 주석에서 문서를 뽑아내는 방법이 있다.

그러나 이런 방법은 엄밀한 의미의 문학적 프로그래밍과는 거리가 있다.

  • 프로그램 함수와 파라미터에 대해 설명하는 방식으로 프로그램에 대해서 설명할 수는 있지만, 소스 코드 전체에 대해서 문서화할 수는 없다.
  • 대부분의 문학적 프로그래밍 환경에서 사용하는 소스 파일은 문서화에 사용되는 파일도 아니고 소스 코드도 아닌 제 3의 형태를 가진다. 그러나 위와 같은 프로그램에서는 소스 코드에 주석으로 설명이 추가된 형태를 가진다.
  • 문학적 프로그래밍에서는 소스 파일이 제3의 형태를 가지기 때문에, 프로그램에 대해서 설명할 때 작성자가 원하는 순서대로 프로그램 덩어리를 배열하여 설명할 수 있다. 그러나 위와 같은 도구에서는 소스 코드에 주석문의 형태로 설명을 붙인 것이기 때문에 설명 순서는 소스 코드의 순서를 따를 수밖에 없다.

참고 문헌 편집

  • Donald E. Knuth, Literate Programming, Stanford, California: Center for the Study of Language and Information, 1992, CSLI Lecture Notes, no. 27.
  • Pierre Arnoul de Marneffe, Holon Programming. Univ. de Liege, Service d'Informatique (December, 1973).
  • Literate Programming
  • [1]

외부 링크 편집