문학적 프로그래밍
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
문학적 프로그래밍은 1984년 도널드 커누스에 의해 처음 소개되었으며, 인간을 위한 훌륭한 문학 작품과 같은 프로그램을 만들기 위해 고안되었다. 문학적 프로그래밍은 코드 조각과 매크로를 사용하여 인간 언어로 프로그램 로직을 작성하는 방식으로, 코드 대신 문서에 내장된 코드를 사용한다. 이 방식은 프로그램의 사고 과정을 명확하게 드러내어 품질을 높이고, 문서 시스템을 자연스럽게 생성하여 다른 프로그래머의 이해를 돕는 장점을 가진다. 문학적 프로그래밍은 엮기와 얽히기 두 단계로 구현되며, WEB, CWEB, noweb, Leo 등이 널리 사용되는 도구이다.
문학적 프로그래밍은 1984년 도널드 커누스에 의해 처음 소개되었으며, 그는 이를 통해 인간이 이해하기 쉬운, 마치 훌륭한 문학 작품과 같은 프로그램을 만들고자 했다.[6] 커누스는 스탠퍼드 대학교에서 알고리즘과 디지털 타이포그래피에 대한 연구의 일환으로 이 개념을 구현했다.
문학적 프로그래밍은 컴퓨터 프로그래밍 방법론의 하나로, 소스 코드와 그에 대한 설명을 하나의 파일에 통합하여 작성하는 방식을 의미한다. 이는 1984년 도널드 크누스에 의해 처음 소개되었으며, 그는 이를 통해 프로그램이 마치 사람이 읽기 좋은 문학 작품처럼 작성되어야 한다고 주장했다.[1] 크누스는 이러한 방식으로 TeX 조판 시스템 전체 소스를 작성하고 이를 책으로 출판하기도 했다.
문학적 프로그래밍 구현은 두 가지 주요 단계로 구성된다.
2. 역사와 철학
최초의 문학적 프로그래밍 환경은 커누스가 TeX 조판 시스템을 개발하던 중 1981년에 만든 웹(WEB)이다. 웹은 프로그래밍 언어로 파스칼을 사용하고, 문서화에는 TeX을 이용했다. 커누스는 TeX 전체 소스를 문학적 프로그래밍 형식으로 작성하여 《Computers and Typesetting》 시리즈의 B권 《TeX: The program》으로 출판하기도 했다. 커누스는 1979년부터 DOC이라는 이름의 초기 문학적 프로그래밍 환경을 사용했으며, Pierre Arnoul de Marneffe의 아이디어에서 영감을 얻었다고 밝혔다. 커누스가 WEB이라는 이름을 붙인 이유는 당시 컴퓨팅 분야에서 아직 사용되지 않은 영어의 세 글자 단어 중 하나라고 생각했기 때문이기도 하지만[6], 다른 한편으로는 단순한 요소들로 정교하게 조립된 소프트웨어의 복잡한 구조를 나타내는 이름이기도 했다.[1]
일반적으로 컴퓨터 프로그래밍에서는 프로그램 소스와 관련된 문서를 별도의 파일로 관리하는데, 이는 관리의 어려움과 업데이트 시 내용 불일치 문제를 야기할 수 있다. 문학적 프로그래밍은 이러한 문제를 해결하기 위해 문서와 소스 코드를 하나의 'WEB'이라 불리는 메타 소스 파일에 함께 기술한다. 이 메타 소스로부터 문서와 소스 코드를 각각 자동으로 생성함으로써 정보의 일관성을 유지한다. 이 과정을 처리하는 시스템을 'WEB 시스템'이라고 부른다.
문학적 프로그래밍의 핵심은 단순히 코드와 문서를 병기하는 것을 넘어, 매크로 기능을 이용하여 코드 조각(chunk)들을 논리적인 순서나 작성자가 설명하기 편한 순서대로 배열하고 설명할 수 있다는 점이다. 각 코드 조각은 이름이 부여되고, 다른 조각에서 이 이름을 참조하여 포함시킬 수 있다. 이는 코드의 실제 실행 순서와 관계없이, 하이퍼링크처럼 자유로운 순서로 내용을 구성하고 설명할 수 있게 해준다. 예를 들어, 복잡한 알고리즘의 핵심 부분을 먼저 설명하고, 나중에 전체적인 구조나 세부 사항을 설명하는 방식이 가능하다. 이는 코드 내 주석과는 다른 방식으로, 코드의 논리와 설계를 중심으로 문서를 작성하게 유도하며, 주석이 간략해지기 쉬운 단점을 보완한다.
파스칼만 지원했던 초기 웹의 한계를 극복하기 위해 커누스와 레비는 CWEB을 개발했다. CWEB은 C, C++, 자바 등 다양한 프로그래밍 언어를 지원하며, 대부분의 운영체제에서 사용 가능하고 TeX뿐만 아니라 PDF 문서 생성도 지원한다. 이 외에도 noweb, FunnelWeb 등 여러 문학적 프로그래밍 도구들이 개발되었다.
문학적 프로그래밍은 모든 종류의 소프트웨어 개발에 적용하기에는 현실적인 어려움이 따를 수 있지만, 복잡한 알고리즘을 설명하거나 오픈 소스 프로젝트처럼 코드의 이해와 배포가 중요한 경우에 유용하게 활용될 수 있다. 특히 2010년대 들어 데이터 과학 분야에서 노트북 인터페이스(예: 주피터 노트북)가 널리 사용되면서, 코드, 설명, 실행 결과를 통합적으로 관리하는 문학적 프로그래밍의 개념이 다시 주목받고 중요하게 부활했다. 문학적 프로그래밍의 기본 철학은 특정 프로그래밍 언어나 문서 형식에 얽매이지 않으며, 다양한 형태로 응용되고 발전하고 있다.
3. 개념
문학적 프로그래밍의 핵심 아이디어는 프로그램의 로직을 기계가 이해하는 순서가 아닌, 인간이 이해하기 쉬운 논리적 흐름에 따라 설명하는 데 있다. 이를 위해 소스 코드를 작은 코드 조각(chunk)으로 나누고, 각 조각에 대해 상세한 설명을 덧붙인다.
이 과정에서 매크로(macro)가 중요한 역할을 한다. 매크로는 특정 코드 조각이나 다른 매크로를 대표하는 설명적인 이름(예: <<파일 스캔>>)으로, 프로그래머는 복잡한 코드 대신 이 매크로 이름을 사용하여 프로그램을 더 높은 수준에서 추상적으로 기술할 수 있다. 이는 마치 의사 코드처럼 작동하며, 프로그래머가 기본 프로그래밍 언어 위에 자신만의 '메타 언어'를 만드는 것과 같다.
작성된 문학적 프로그램 소스 파일은 전처리기(preprocessor)를 통해 두 가지 결과물로 변환된다.
이러한 방식은 코드 조각들을 파일 내 어디든 자유롭게 배치할 수 있게 해주므로, 프로그래머는 전통적인 프로그래밍 언어가 강제하는 순서에 얽매이지 않고 자신의 사고 흐름에 따라 프로그램을 구성하고 설명할 수 있다.[7] 예를 들어, 프로그램의 핵심 로직을 먼저 설명하고 세부 구현은 나중에 설명하는 식의 구성이 가능하다.
다음은 C언어로 작성된 wc 프로그램의 문학적 프로그래밍 예시 일부이다. <<...>>는 매크로를, <<...>>=는 코드 조각의 정의를 나타낸다.
```c
/* wc 프로그램의 개요 정의 */
<<*>>=
<<포함할 헤더 파일>>
<<정의>>
<<전역 변수>>
<<함수>>
<<메인 프로그램>>
@
/* 표준 입출력 헤더 포함 */
<<포함할 헤더 파일>>=
#include
@
/* 파일 스캔 로직 */
<<파일 스캔>>=
while (1) {
<<버퍼가 비어 있으면 채우기; 파일 끝에서 중단>> /* 또 다른 매크로 */
c = *ptr++;
if (c > ' ' && c < 0177) {
/* 표시 가능한 ASCII 코드 처리 */
if (!in_word) {
word_count++;
in_word = 1;
}
continue;
}
if (c == '\n') line_count++;
else if (c != ' ' && c != '\t') continue;
in_word = 0;
/* c는 줄 바꿈, 공백 또는 탭 */
}
@
/* 전역 변수 정의 (나중에 내용 추가 가능) */
<<전역 변수>>=
long tot_word_count, tot_line_count, tot_char_count; /* 총 단어, 줄, 문자 수 */
@
```
이처럼 문학적 프로그래밍은 단순히 코드에 주석을 다는 것과는 다르다. 주석은 코드에 부가적으로 설명을 덧붙이는 형태지만, 문학적 프로그래밍에서는 설명이 중심이 되고 코드가 그 설명 안에 포함되는 구조를 가진다. 즉, 코드의 실행 순서가 아닌 설명의 논리적 흐름이 전체 구조를 결정한다.[1]
3. 1. 장점
크누스에 따르면[8][9] 문학적 프로그래밍은 프로그래머가 프로그램의 핵심 아이디어를 명확하게 표현하도록 유도하여 품질이 더 높은 프로그램을 만들 수 있도록 돕는다. 이 과정에서 충분히 고려되지 않은 설계상의 결정들이 더 명확하게 드러날 수 있다.
크누스는 또한 문학적 프로그래밍이 단순히 부가적인 기능이 아니라, 프로그램 생성 과정에서 개발자의 생각을 설명하며 자연스럽게 만들어지는 우수한 문서화 시스템을 제공한다고 주장한다.[10] 이렇게 생성된 문서는 작성자 본인이 나중에 자신의 사고 과정을 다시 따라가거나, 다른 프로그래머가 프로그램의 구조를 더 쉽게 이해하는 데 도움을 준다. 이는 기존의 문서화 방식, 즉 컴파일러가 요구하는 순서대로 나열된 소스 코드와 그에 덧붙여진 주석을 통해 프로그램의 논리를 파악해야 하는 방식과는 차이가 있다.
문학적 프로그래밍에서 활용되는 메타 언어 기능은 프로그래머의 사고를 촉진하고, 코드 전체를 더 높은 관점에서 바라볼 수 있게 하며(일종의 "조감도" 제공), 사람이 한 번에 효과적으로 다룰 수 있는 개념의 수를 늘려준다고 여겨진다. 이러한 개념이 대규모 상용 프로그램 개발에도 적용될 수 있음은 문학적 프로그래밍 방식으로 작성된 TeX 코드의 사례를 통해 입증된 바 있다.[8]
더불어 크누스는 문학적 프로그래밍이 여러 다른 환경으로 소프트웨어를 쉽게 이식할 수 있게 해준다고 주장하며, 이 역시 TeX의 구현을 예시로 든다.[11] 문학적 프로그래밍의 WEB 시스템은 문서와 소스 코드를 하나의 파일에서 관리하여 정보의 일관성을 높이는 장점도 가진다. 또한 매크로를 통해 코드 조각과 문서를 연결함으로써, 실제 코드의 실행 순서와 관계없이 논리적 흐름에 따라 자유롭게 내용을 기술할 수 있게 하여 프로그램에 대한 상세한 설명을 유도한다.
3. 2. 문서 생성과의 비교
문학적 프로그래밍은 흔히 소스 코드와 주석이 모두 포함된 공통 파일에서 생성되는 서식 있는 문서, 즉 문서 생성으로 오해받거나, 코드와 함께 포함된 방대한 주석으로 오해받는 경우가 많다.[12] 이는 문학적 프로그래밍의 본질과는 차이가 있다. 잘 문서화된 코드나 코드에서 추출된 문서는 기본적으로 코드의 구조를 따르며 문서가 코드에 내장된 형태인 반면, 문학적 프로그래밍에서는 코드가 문서에 내장되어 있으며 코드의 설명 순서가 문서의 논리적 구조를 따른다는 점에서 근본적인 차이가 있다.
이러한 오해로 인해 펄의 Plain Old Documentation(POD)나 자바의 Javadoc 시스템과 같은 주석 추출 도구가 "문학적 프로그래밍 도구"로 언급되기도 한다. 하지만 이 도구들은 도널드 크누스가 제시한 엄밀한 의미의 문학적 프로그래밍과는 다음과 같은 점에서 구별된다.[12][13]
결론적으로 pod, doc++, javadoc, Doxygen과 같은 도구들은 코드에서 문서를 자동으로 생성하여 개발 편의성을 높이는 유용한 도구이지만, 프로그램 로직을 인간의 언어로 설명하고 그 구조에 따라 코드를 배치하는 문학적 프로그래밍의 핵심 철학과는 거리가 있다.
4. 구현
# '''엮기'''(weave|위브eng): 프로그램과 유지보수에 대한 포괄적인 문서를 생성한다.
# '''얽히기'''(tangle|탱글eng): 기계어로 실행 가능한 코드를 생성한다.
이 두 단계, 엮기와 얽히기는 동일한 소스 파일에서 수행되므로 문서와 코드 간의 일관성을 유지하는 데 유리하다. 일반적으로 컴퓨터 프로그래밍에서는 프로그램 소스와 관련 문서를 별도의 파일로 관리하는 경우가 많아, 내용 변경 시 두 파일을 모두 수정해야 하는 번거로움과 정보 불일치의 위험이 따른다.
문학적 프로그래밍은 이러한 문제를 해결하기 위해 WEB이라고 불리는 독특한 시스템을 사용한다. WEB 시스템에서는 문서와 소스 코드가 하나로 통합된 메타 소스 파일을 작성하고, 이 파일로부터 각각 문서와 소스 코드를 자동으로 생성한다. 이를 통해 정보의 일체성을 높이고 관리 부담을 줄일 수 있다.
단순히 문서와 코드를 한 파일에 넣는 것은 주석이나 Perl의 POD(Plain Old Documentation) 같은 임베디드 문서 방식과 유사해 보일 수 있다. 하지만 문학적 프로그래밍의 핵심적인 차이는 매크로를 이용하여 코드 조각(chunk)과 설명을 자유롭게 연결하고 재배열할 수 있다는 점이다. 이는 마치 하이퍼링크처럼 작동하여, 실제 코드의 실행 순서와 상관없이 작성자가 가장 이해하기 쉬운 논리적 흐름에 따라 내용을 구성하고 설명할 수 있게 해준다. 예를 들어, 프로그램의 핵심 로직 부분을 먼저 상세히 설명하고, 나중에 이 로직이 전체 프로그램의 어느 부분에서 호출되는지를 보여주는 방식으로 문서를 구성할 수 있다. 이는 코드의 특정 부분에 대한 설명을 관련 부분만 정확히 뽑아내어 제시하므로, 단순 주석과는 다른 깊이 있는 문서화가 가능하다. 특히, 실제 프로그램 코드 내의 주석은 간결하게 작성되는 경향이 있지만, 문학적 프로그래밍에서는 설명 자체가 중심이 되므로 더 상세하고 체계적인 기술이 가능하다.
이러한 방식은 일반적인 문서 생성기와는 몇 가지 중요한 차이점을 가진다.
다음은 프로그램 주석에서 문서를 추출하는 방식의 예시이다. 이는 엄밀한 의미의 문학적 프로그래밍과는 차이가 있다.
문학적 프로그래밍을 구현하기 위한 도구 중 가장 널리 알려지고 강력한 것으로 평가받는 것은 [https://web.archive.org/web/20060128235241/http://webpages.charter.net/edreamleo/front.html Leo]이다. Leo는 내부적으로 noweb과 CWEB 처리기를 포함하고 있으며, 사용하기 편리한 그래픽 인터페이스의 편집기를 제공한다. 윈도우, 리눅스, OS X 등 다양한 운영체제에서 사용할 수 있다. Leo의 설명서에는 문학적 프로그래밍에 대한 쉬운 설명도 포함되어 있다.
현실적으로 변화가 잦은 모든 소스 코드를 문학적 프로그래밍 방식으로 작성하는 것은 어려울 수 있다. 하지만 복잡한 알고리즘을 설명하거나, 여러 사람이 참여하고 공유하는 오픈 소스 프로젝트처럼 코드의 이해와 유지보수가 중요한 경우에는 매우 유용하게 활용될 수 있다.
크누스가 처음 제안한 오리지널 WEB 시스템은 Pascal 코드와 TeX 형식의 문서를 생성했지만, 문학적 프로그래밍의 개념 자체는 특정 프로그래밍 언어나 문서 형식에 얽매이지 않는다. 이후 다양한 언어와 형식을 지원하는 많은 도구들이 개발되었다.
5. 예제
고전적인 문학적 프로그래밍의 예는 표준 유닉스의 wc
단어 수 세기 프로그램의 문학적 구현이다. 크누스는 그의 저서 ''문학적 프로그래밍''의 12장에서 이 예제의 CWEB 버전을 제시했다. 동일한 예제가 나중에 noweb 문학적 프로그래밍 도구에 맞게 다시 작성되었다.[14] 이 예는 문학적 프로그래밍의 기본 요소를 잘 보여준다.
매크로는 표준 문서의 "섹션 이름"과 동일하지 않다. 문학적 프로그래밍 매크로는 실제 코드를 숨기고, if
, while
또는 case
와 같은 논리 연산자 내부를 포함하여 모든 하위 레벨 기계어 연산자 내에서 사용될 수 있다. 이는 다음 wc
문학적 프로그램에서 볼 수 있다.[14]
/* 계산을 수행하는 현재 청크는 실제로 작성하기 가장 쉬운 것 중 하나였습니다. 각 문자를 살펴보고 단어가 시작되거나 끝나는 경우 상태를 변경합니다. */
<<파일 스캔>>=
while (1) {
<<버퍼가 비어 있으면 채우기; 파일 끝에서 중단>>
c = *ptr++;
if (c > ' ' && c < 0177) {
/* 표시 가능한 ASCII 코드 */
if (!in_word) {
word_count++;
in_word = 1;
}
continue;
}
if (c == '\n') line_count++;
else if (c != ' ' && c != '\t') continue;
in_word = 0;
/* c는 줄 바꿈, 공백 또는 탭입니다 */
}
@
매크로는 코드 조각이나 다른 매크로를 나타내며, 상향식 또는 하향식 "청킹"(chunking)이나 하위 섹션화보다 더 일반적이다. 도널드 크누스는 이를 깨달았을 때 프로그램을 다양한 부분의 ''웹''으로 생각하기 시작했다고 말했다.[1]
noweb 문학적 프로그램에서는 자유로운 노출 순서 외에도, <<...>>=
를 사용하여 매크로 뒤에 숨겨진 청크를 파일의 어느 곳에서든 <<청크 이름>>=
을 쓰고 더 많은 내용을 추가하여 나중에 확장할 수 있다. 다음 스니펫에서 이를 보여준다 (+
는 가독성을 위해 문서 포맷터에 의해 추가되었으며 코드에는 없다).[14]
/* 총계는 프로그램 시작 시 0으로 초기화되어야 합니다.
이 변수를 main 내에서 지역 변수로 만들었다면, 명시적으로 초기화를 해야 할 것입니다; 하지만 C의 전역 변수는 자동으로 0으로 초기화됩니다. (정확히는, "정적으로 0으로 초기화됩니다." (이해했나요?)) */
<<전역 변수>>+=
long tot_word_count, tot_line_count, tot_char_count;
/* 총 단어 수, 줄 수, 문자 수 */
@
6. 문학적 프로그래밍 도구
최초의 문학적 프로그래밍 환경은 도널드 커누스가 TeX 조판 시스템을 개발하면서 1981년에 만든 웹(WEB)이다. 웹은 프로그래밍 언어로 파스칼을 사용하고, 문서화에는 TeX를 이용한다. 커누스는 TeX의 전체 소스 코드를 문학적 프로그래밍 형식으로 작성하여 《Computers and Typesetting》 시리즈의 B권 《TeX: The program》으로 출판했다. 그는 1979년경부터 DOC이라는 이름의 초기 문학적 프로그래밍 시스템을 사용했으며, 피에르-아르누 드 마르네프(Pierre-Arnoul de Marneffe)의 아이디어에서 영감을 얻었다고 밝혔다.[16]
파스칼만 지원하는 웹의 한계를 보완하기 위해, 커누스와 실비오 레비(Silvio Levy)는 CWEB을 개발했다. CWEB은 C, C++, 자바 등 다양한 프로그래밍 언어를 지원하며, 대부분의 운영체제에서 실행된다. 또한 TeX뿐만 아니라 PDF 형식의 문서도 생성할 수 있다.
다른 문학적 프로그래밍 도구로는 noweb과 FunnelWeb 등이 있다. noweb은 다양한 언어를 지원하며 TeX 시스템 없이도 HTML 형식으로 텍스트 서식을 지정할 수 있다는 장점이 있다.
가장 널리 사용되고 강력한 도구 중 하나로 평가받는 것은 Leo이다. Leo는 내부적으로 noweb과 CWEB 처리기를 내장하고 있으며, 사용하기 편리한 인터페이스를 갖춘 편집기를 제공한다. 윈도우, 리눅스, OS X 등 다양한 운영체제에서 사용할 수 있다.
Axiom 컴퓨터 대수 시스템 역시 전체가 문학적 프로그래밍으로 작성된 사례이다.
다음은 주요 문학적 프로그래밍 도구들을 비교한 표이다.
이름 | 지원되는 언어 | 작성 언어 | 마크업 언어 | 매크로 및 사용자 지정 순서 | 셀 실행 | 비고 |
---|---|---|---|---|---|---|
WEB | 파스칼 | 파스칼 | TeX | 예 | 아니요 | 최초로 공개된 문학적 프로그래밍 환경. |
CWEB | C++ 및 C | C | TeX | 예 | 아니요 | C 및 C++에 맞게 조정된 WEB. |
noweb | 임의 | C, AWK, 및 Icon | LaTeX, TeX, HTML 및 troff | 예 | 아니요 | 단순하며, TeX 없이 HTML 서식 지정 가능. |
Emacs org-mode | 임의 | Emacs Lisp | 일반 텍스트 | 예[19] | 예[17][18] | Babel 확장 필요. 단일 문서에 여러 언어 코드 블록 임베딩 가능. 코드 블록 간 데이터 공유, 이미지 인라인 표시, noweb 참조 구문 사용 가능. |
CoffeeScript | CoffeeScript | CoffeeScript, JavaScript | Markdown | 아니요 | 예[20] | Markdown 문서 내 들여쓰기된 코드 블록으로 "문학적" 모드 컴파일 지원. |
Maple 워크시트 | Maple | Maple | XML | 아니요 | 예 | 기호 계산을 위한 라이브 코드, 텍스트, 그래픽 결합 플랫폼 독립적 환경. |
Wolfram 노트북 | Wolfram 언어 | Wolfram 언어 | Wolfram 언어 | 아니요 | 예[21][22] | 텍스트, 그래픽, 라이브 코드를 결합한 플랫폼 독립적 환경. |
Jupyter Notebook (이전 IPython Notebook) | 파이썬 및 Jupyter 커널 지원 언어 | 파이썬 | JSON 형식 ([https://ipython.org/ipython-doc/3/notebook/nbformat.html ipynb]) | 아니요 | 예 | 제목, 텍스트(LaTeX 포함), 플롯 등을 코드와 결합하는 노트북 형식. 데이터 과학 분야에서 부활하며 중요성 증대. |
[https://nbdev.fast.ai/ nbdev] | 파이썬 및 Jupyter Notebook | 파이썬 | Markdown (Jupyter Notebook 내) | 예 (부분적) | 예 | Jupyter Notebook에서 파이썬 라이브러리 개발 지원. 코드, 테스트, 문서를 한 곳에서 관리. |
줄리아 (프로그래밍 언어) | 줄리아 (프로그래밍 언어) | 줄리아 (프로그래밍 언어) | Markdown | 예 (Pluto.jl) | 예 | iPython에서 영감을 받은 iJulia 개발 모드 및 반응형 노트북 환경 Pluto.jl 지원 (사용자 지정 순서 가능, 웹 유사 매크로 미지원). |
Agda (프로그래밍 언어) | Agda (프로그래밍 언어) | Haskell | LaTeX, HTML, Markdown | 예 | 아니요[23] | 제한된 형태의 문학적 프로그래밍 즉시 지원. |
Sweave | R | R | LaTeX (PDF) | 예 | 예[24][25] | R 코드와 LaTeX 문서 결합. |
Knitr | R | R | LaTeX, PDF, LyX, HTML, Markdown, AsciiDoc, reStructuredText | 예 | 예[26][27] | Sweave를 확장하여 더 다양한 문서 형식 지원. |
이 외에도 다음과 같은 도구들이 있다.
- Leo 텍스트 편집기는 선택적으로 noweb 및 CWEB 마크업을 지원하는 ''개요'' 편집기이다. Leo의 작성자는 두 가지 다른 접근 방식을 혼합한다. 첫째, Leo는 큰 텍스트 관리에 도움이 되는 개요 편집기이다. 둘째, Leo는 순수한 형태(즉, 크누스 웹 도구나 "noweb"과 같은 도구에서 사용되는 방식)에서 어느 정도의 독창성과 편집기를 작성자가 정확히 예상하지 않은 방식으로 사용하는 경우에만 가능한 문학적 프로그래밍의 일부 아이디어를 통합한다(수정된 @root 노드에서). 그러나 이것과 다른 확장(@file 노드)은 개요 프로그래밍 및 텍스트 관리를 성공적이고 쉽게 만들고 어떤 면에서는 문학적 프로그래밍과 유사하게 만든다.[28]
- Haskell 프로그래밍 언어는 반문학적 프로그래밍을 기본적으로 지원한다. 컴파일러/인터프리터는 두 개의 파일 이름 확장자를 지원한다. `.hs` 및 `.lhs`; 후자는 문학적 Haskell을 의미한다. 문학적 스크립트는 전체 LaTeX 소스 텍스트일 수 있으며 동시에 변경 없이 컴파일할 수 있다. 인터프리터는 코드 환경에서 텍스트만 컴파일하기 때문이다. 예를 들어:
% 여기 기능 설명 텍스트:
\begin{code}
fact 0 = 1
fact (n+1) = (n+1) * fact n
\end{code}
여기에 더 많은 텍스트
코드는 각 줄을 보다 큰 기호와 공백으로 시작하고 코드 조각 앞뒤에 빈 줄을 사용하여 Richard Bird 스타일로 표시할 수도 있다. LaTeX `listings` 패키지는 소스 코드를 장식하는 데 사용할 수 있는 `lstlisting` 환경을 제공한다. Haskell 내에서 `code` 환경을 정의하여 다음과 같은 방식으로 기호를 인쇄하는 데 사용할 수 있다.
\newenvironment{code}{\lstlistings[language=Haskell]}{\endlstlistings}
\begin{code}
comp :: (beta -> gamma) -> (alpha -> beta) -> (alpha -> gamma)
(g `comp` f) x = g(f x)
\end{code}
다음과 같이 생성하도록 구성할 수 있다.
패키지는 코드 덩어리를 구성하는 수단을 제공하지 않지만 서로 다른 파일에서 LaTeX 소스 코드를 분할할 수 있다.[29]
- Web 68 Literate Programming 시스템은 기본 프로그래밍 언어로 Algol 68을 사용했지만, 전처리 프로그램 'tang'에는 해당 언어를 강제로 사용하도록 하는 것이 없었다.[30]
- 텍스트 인코딩 이니셔티브의 사용자 정의 메커니즘을 사용하면 사용자가 TEI 체계를 제한, 수정 또는 확장하여 One Document Does-it-all 형식으로 산문 문서를 스키마 사양 조각과 혼합할 수 있다. 이 산문 문서, 스키마 및 처리 모델 파이프라인에서 생성할 수 있으며 크누스의 문학적 프로그래밍 패러다임은 이러한 작업 방식의 영감으로 인용된다.[31]
한편, 프로그램의 주석에서 문서를 추출하는 방식의 문서 생성기도 존재한다.
이러한 도구들은 소스 코드와 문서를 연결하지만, 엄밀한 의미의 문학적 프로그래밍과는 차이가 있다. 문학적 프로그래밍은 프로그램 전체 로직을 인간이 이해하기 쉬운 순서대로 설명하며 코드 조각(매크로)을 재배열할 수 있는 반면, 문서 생성기는 주로 함수나 매개변수에 대한 설명을 소스 코드의 구조에 따라 추출하는 방식에 가깝다. 문학적 프로그래밍의 소스 파일은 문서나 코드 파일과는 다른 제3의 형태를 가지지만, 문서 생성기는 일반적으로 소스 코드에 주석을 추가하는 형태를 사용한다. 따라서 설명의 순서가 소스 코드의 순서에 제약을 받게 된다.
7. 기타
기타 유용한 도구는 다음과 같다.
- Leo 텍스트 편집기: 선택적으로 noweb 및 CWEB 마크업을 지원하는 ''개요'' 편집기이다. Leo의 작성자는 두 가지 다른 접근 방식을 혼합한다. 첫째, Leo는 큰 텍스트 관리에 도움이 되는 개요 편집기이다. 둘째, Leo는 순수한 형태(즉, 크누스 웹 도구나 "noweb"과 같은 도구에서 사용되는 방식)에서 어느 정도의 독창성과 편집기를 작성자가 정확히 예상하지 않은 방식으로 사용하는 경우에만 가능한 문학적 프로그래밍의 일부 아이디어를 통합한다(수정된 @root 노드에서). 그러나 이것과 다른 확장(@file 노드)은 개요 프로그래밍 및 텍스트 관리를 성공적이고 쉽게 만들고 어떤 면에서는 문학적 프로그래밍과 유사하게 만든다.[28]
- Haskell 프로그래밍 언어: 반문학적 프로그래밍을 기본적으로 지원한다. 컴파일러/인터프리터는 두 개의 파일 이름 확장자를 지원한다:
.hs
및.lhs
; 후자는 문학적 Haskell을 의미한다. 문학적 스크립트는 전체 LaTeX 소스 텍스트일 수 있으며 동시에 변경 없이 컴파일할 수 있다. 인터프리터는 코드 환경에서 텍스트만 컴파일하기 때문이다. 예를 들어:
% 여기 기능 설명 텍스트:
\begin{code}
fact 0 = 1
fact (n+1) = (n+1) * fact n
\end{code}
여기에 더 많은 텍스트
코드는 각 줄을 보다 큰 기호와 공백으로 시작하고 코드 조각 앞뒤에 빈 줄을 사용하여 Richard Bird 스타일로 표시할 수도 있다. LaTeX
listings
패키지는 소스 코드를 장식하는 데 사용할 수 있는 lstlisting
환경을 제공한다. Haskell 내에서 code
환경을 정의하여 다음과 같은 방식으로 기호를 인쇄하는 데 사용할 수 있다:\newenvironment{code}{\lstlistings[language=Haskell]}{\endlstlistings}
\begin{code}
comp :: (beta -> gamma) -> (alpha -> beta) -> (alpha -> gamma)
(g `comp` f) x = g(f x)
\end{code}
다음과 같이 생성하도록 구성할 수 있다:
패키지는 코드 덩어리를 구성하는 수단을 제공하지 않지만 서로 다른 파일에서 LaTeX 소스 코드를 분할할 수 있다.[29]
- Web 68 Literate Programming 시스템: 기본 프로그래밍 언어로 Algol 68을 사용했지만, 전처리 프로그램 'tang'에는 해당 언어를 강제로 사용하도록 하는 것이 없었다.[30]
- 텍스트 인코딩 이니셔티브(TEI): TEI의 사용자 정의 메커니즘을 사용하면 사용자가 TEI 체계를 제한, 수정 또는 확장하여 One Document Does-it-all(ODD) 형식으로 산문 문서를 스키마 사양 조각과 혼합할 수 있다. 이 산문 문서, 스키마 및 처리 모델 파이프라인에서 생성할 수 있으며 크누스의 문학적 프로그래밍 패러다임은 이러한 작업 방식의 영감으로 인용된다.[31]
참조
[1]
간행물
Literate Programming
http://www.literatep[...]
British Computer Society
2009-01-04
[2]
간행물
A Multi-Language Computing Environment for Literate Programming and Reproducible Research
https://www.jstatsof[...]
2020-05-30
[3]
학술회의
The Story in the Notebook: Exploratory Data Science using a Literate Programming Tool
Association for Computing Machinery
2018-04
[4]
인용문
[5]
문서
[6]
웹사이트
Literate Programming
http://www.literatep[...]
2019-06-03
[7]
인용문
[8]
웹사이트
Interview with Donald Knuth
https://www.informit[...]
2009-01-04
[9]
인용문
[10]
인용문
[11]
웹사이트
"Oral History of Donald Knuth"- an Interview with Ed Feigenbaum
http://archive.compu[...]
2018-12-07
[12]
웹사이트
POD is not Literate Programming
https://www.perl.com[...]
2000-03-20
[13]
인용문
[14]
웹사이트
An Example of noweb
https://www.cs.tufts[...]
2009-01-04
[15]
문서
[16]
보고서
Holon Programming – A Survey
https://github.com/h[...]
Université de Liège, Service d'Informatique
1973-12
[17]
웹사이트
Babel: Introduction
https://orgmode.org/[...]
[18]
웹사이트
Babel Languages: redirect
https://orgmode.org/[...]
[19]
웹사이트
Babel: Introduction
https://orgmode.org/[...]
[20]
웹사이트
Literate CoffeeScript
https://coffeescript[...]
2014-11-13
[21]
문서
[22]
웹사이트
Wolfram Notebooks
https://www.wolfram.[...]
2018-11-28
[23]
웹사이트
Literate Agda
http://wiki.portal.c[...]
2017-03-26
[24]
간행물
Sweave, Part I: Mixing R and LaTeX: A short introduction to the Sweave file format and corresponding R functions
https://cran.r-proje[...]
2012-01-22
[25]
웹사이트
The Joy of Sweave – A Beginner's Guide to Reproducible Research with Sweave
http://www.math.ualb[...]
2012-01-22
[26]
서적
Dynamic Documents with R and knitr, 2nd Edition
http://www.crcpress.[...]
Chapman & Hall/CRC
2015
[27]
웹사이트
knitr: A General-purpose Tool for Dynamic Report Generation in R
https://github.com/y[...]
[28]
웹사이트
Leo's Home Page
http://leoeditor.com[...]
2015-04-03
[29]
문서
[30]
웹사이트
Web 68: Literate programming with Algol 68
http://www.poenikatu[...]
2013-01-01
[31]
웹사이트
TEI Guidelines
http://www.tei-c.org[...]
TEI Consortium
2018-08-23
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com