댓글을 보다가, 이런 마이너한 거 좋아하실 분(%%c모 님이라고…)이 눈에 띄어서 소개해 봅니다.
VBA를 공부해둬야 하는 저는 현실도피(…)로 <Head First C#>을 충동구매하였지만, 그마저도 읽다가 지루해진 나머지 딴 짓을 할 궁리를 시작했습니다. 그러던 와중에, 책에서 “프로그램에서 객체가 생성되면 그 객체는 힙(heap)이라는 컴퓨터 메모리의 한 부분에서 서식합니다.”라는 문장을 읽고, ‘그러고보니 힙 대신에 스택을 기반으로 하는 언어가 있었지… 그거 이름이 Forth였던가?’ 이런 잡생각을 시작했습니다. 그리고 그게 맞는지 검색을 하다가, 문득 처음 보는 프로그래밍 언어를 발견했습니다. 그게 바로 Forth로부터 영향을 받은 언어, Factor였습니다.
Factor는 스택 기반의 프로그래밍 언어로, “Concatenative programming language”라는 생소한 분류에 속하는 언어입니다. 일반적인 프로그래밍 언어는 “Applicative Programming Language”라는 분류에 속한다는데, 이건 절차형 언어고 함수형 언어고와는 상관없는 이야기입니다. C언어든 Python이든 Lisp든간에, 우리가 흔히 들어본 대다수의 언어는 “Applicative Programming Language”의 범주에 속한다는군요. Factor 언어의 모양새는 함수형 언어와 닮은 듯 보이지만, 절차형으로 프로그래밍하는 것도 가능하다고 합니다.
Factor는 후위 표기법(RPN)을 사용합니다. 예를 들어 “5와 3을 더하라.”는 문장은 5 3 +
이렇게 표현할 수가 있지요. Lisp계 언어와는 정반대인 셈인데, 이걸 함수에 적용하면 다음과 같이 됩니다. 다음 구문은 x라는 객체에 A, B, C, D 네 개의 함수를 차례대로 적용하는 예제입니다.
- Lisp:
(D (C (B (A x))))
- Factor:
x A B C D
저는 이걸 보고 깜짝 놀랐습니다. 으아니 스택에 기반한 후위 표기법이 이렇게 좋은 것일 줄이야… 근데 KLDP wiki에서는 이걸 두고 “줄줄이비엔나ㅂㅌ들”이라고 하더군요.
Lisp계 언어들을 왕복싸대기로 뺨치는 수준의 문법 간결성을 제외하고도, 이 언어에는 몇 가지 흥미로운 점이 있습니다. 먼저, 이 언어는 이미지 기반입니다. 소스코드와는 별도로 인터랙티브 쉘에서 작업한 가상머신 이미지를 저장할 수가 있다는 것이죠. 표현 또한 독특해서, 함수를 “Word”라고 부르고 모듈은 “Vocabulary”라고 부릅니다. 또 다른 점으로는, 이 언어의 GUI 인터랙티브 쉘(“Listener”라고 부릅니다)과 도움말 시스템 등은 모조리 이 언어로 되어 있어서, 원하면 즉석에서 뜯어볼 수가 있게끔 되어 있습니다. 예를 들면 리스너 창의 폰트를 바꾸는 명령어 예제는 "consolas" 16 set-listener-font
이렇고, 도움말 창의 폰트 크기를 키우는 명령어는 com-font-size-plus
이런데, 이 명령어 모두가 실은 다 Factor 코드입니다. 그리고 이걸 Listener에 동봉된 Inspector로 다 뜯어볼 수 있게끔 되어 있지요. 이건 무슨 Emacs도 아니고…
하여튼 대단히 흥미로운 프로그래밍 언어인 것은 틀림없어 보입니다. 제가 내공이 매우 얕아 이 언어의 진짜 가치를 알아보기는 힘들 것 같지만, 적어도 지금까지 들어본 언어 중에서는 가장 흥미로운 것 같습니다. 이런 마이너한 걸 좋아하시는 모 분이 생각나서, 여기에 소개해 봅니다.
RPN이 참 재미있고 익숙해지면 실질적으로 쓸모도 있고 한데 사용자가 많지 않네요..