Forth Language

FrontPage|FindPage|TitleIndex|RecentChanges| UserPreferences P RSS

소개

ForthLanguage(Forth)는 1970년대 찰스 무어(Charles H. Moore)라는 사람에 의해 개발된 인터프리터기반의 언어이다. 스택(Stack)을 이용하여 값을 전달하는 후위연산(Postfix)방식이 특징이라고 할 수 있다. 기존의 언어와는 다른 개념의 언어라고 본다. TCOM이라는 DOS용의 강력한 컴파일러도 있으며, Windows용 개발도구인 Win32Forth(공개)나 Swift Forth(상용, embedded system 개발용도 있음), Linux용인 gforth 등의 개발도구도 있다. 고원용씨가 eForth를 고쳐서 만든 hForth라는 DOS용이나 Z80용 포스시스템도 있다. Palm OS용으로 Quartus forth도 있다.

특징

  1. 스택(Stack)
    스택을 이용하여 대부분의 값을 전달한다. 변수나 상수의 개념도 있지만 단순히 연산을 위한 경우에는 잘 쓰이지 않는다.

  2. 후위연산(Postfix)
    1 2 + .
      
    1+2를 출력하라는 명령이다. 김선주는 1970년대에 만들어진 휴렛팩커드(Hewlett-Packard)의 공학용 계산기가 이 방식을 쓰는 것을 보았다.

  3. 모든 것이 단어(word)다
    공백을 제외한 모든 문자,숫자,특수문자를 이용하여 단어(C언어의 함수와 비슷한 개념이지만 똑같다고 볼 수는 없다.)를 만들 수 있다. 단어는 공백으로 구분한다. 새로운 단어의 정의가 가능하고, 기존의 기능을 대체하는 단어도 만들 수 있다.
    : + * ;
     
    단어 :가 새로운 단어를 정의하라는 명령이고, +는 새로 정의할 단어(기존에 있는 것이든, 없는 것이든 상관없다.)이다. *+라는 단어가 앞으로 어떤 역할을 해야하는지를 나타내고, ;는 정의를 마친다. 앞으로 +를 쓰면 그것은 곱하기의 결과를 보인다. 이는 포스의 확장성을 나타낸다. 자기 자신의 덩치가 점점 커질 수 있는 것이다.

  4. 개념이 다르다
    CLanguage 같은 언어와는 개념이 좀 다르다. C 짜듯이 프로그램을 짜면 지저분하게 되고 덩치만 커진다.

장점

  1. 개념이 다르다
    ForthLanguage만의 독특한 방식으로 인해, 이에 길들여진 사람들은 그만큼 쉽게 ForthLanguage를 이용할 수 있다. 자신만의 언어로 무한히 확장할 수도 있다.

  2. 적용성
    ForthLanguage 표준을 따르는 소스 코드는 포스시스템 돌아가는 환경에서라면 어떤 플랫폼에서든 무리없이 돌아간다.

  3. 독립성
    각 포스시스템은 해당하는 운영체제나 하드웨어적인 환경에 따라 그에 맞는 특징을 갖고 있다. 표준에서 정한 모든 단어를 가질 필요가 없으며, 꼭 표준을 따를 필요가 없다. 그만큼 플랫폼간의 독립성도 어느정도 인정한다. 사용가능한 메모리가 작다면 꼭 필요한 Core 단어들만 갖고 있으면 되고, Windows같이 인터페이스를 잘 조작해야 하는 경우는 훨씬 많은 단어를 포함할 수도 있다. 이는 적용성에 문제를 일으키는 장점에서오는단점으로 작용하기도 한다.

  4. 작고 빠르다
    필요한 기능만 선택해서 갖고 있을 수 있도록 표준에서 정의해 놓았다. 이는 제한된 메모리를 이용해야하는 EmbeddedSystem과 같은 경우에 큰 힘을 발휘한다.

단점

  1. 활용 가능한 자원이 많지 않다
    우리말로 된 도움말은 커녕, 영어로 된 도움말도 그리 많지 않다. Starting Forth, Wiki:ThinkingForth, Forth - the New Model, Forth Programmer's Handbook 정도의 책이 있다. 풍부한 소스코드가 대중화의 지름길이라고 할 때, ForthLanguage는 그 자원이 너무 적다. 따라서 사용자도 적고 활용 가능한 분야는 더 적어진다.

  2. 개념이 다르다
    장점에서오는단점으로, 다른 언어에 익숙한 사람이 쉽게 ForthLanguage를 접하지 못하게 한다.

  3. 호환성의 문제
    개념이 다르다는 장점에서 언급했듯이 자신만의 포스시스템을 만들 수 있다는 점에서 각 개발자 개인이 만든 소스를 다른 사람과 공유하기 어렵다. 또한 79표준과 83표준, ANS표준이 약간씩 다르고, 각 포스시스템이 환경에 따라 특정한 기능이 없을 수도 있다. 이는 적용성에 문제가 된다.

가능성

EmbeddedSystem에서 ForthLanguage를 이용하려는 시도가 몇몇 있었다. 작고 개발이 용이하다는 점에서 어느 정도 가능성이 있다고 보지만, 활용 가능한 소스코드의 부재로 다양한 분야로의 진출은 어렵지않나 생각된다.

연산자 후위 기술방식 (postfix notation) 이나 스택지향의 연산(stack-oriented computation), 단어(word)와 사전(dictionary) 구조의 사용등등은 [http]Adobe System에서 개발하고, 요즘은 널리 쓰이고 있는 Postscript언어로 이어졌습니다. 사실 PostScript는 forth에서 나온 것입니다. 또한 Postscript 언어는 더욱 널리 쓰이고 있는 PDF 문서 포맷의 기본이 되었습니다. Postscript 방식으로 출력하고, 출력 파일을 잘 읽어 보시면 dup rot 같은 친숙한 단어들도 가끔 보일겁니다. :)

IEEE 1275 Open Firmware라는 규격으로 Forth를 이용한 Firmware표준이 존재합니다. Sun과 Apple 에서 이것을 적용하여 firmware를 제작하고 있습니다. 썬 서버들의 OpenBoot라는 firmware에도 Fcode라는 이름으로 forth가 쓰이며 MacOS에도 쓰입니다.

시작하기

적당한 포스시스템을 구했다면 실행을 시켜보자. OK가 보일 것이다. 이제 명령을 할 준비가 된 것이다. WORDS를 치면 사용가능한 단어들이 출력된다. [http]표준문서 나 다른 도움말을 참고하면서 하나하나 실행해보자. 포스시스템을 마치고 싶다면 BYE를 치면 된다.


김선주는 고등학교를 다닐 때 포스를 처음 접하고는 매우 작다는 점과 확장성이 뛰어나다는 점에 끌려서 이리저리 문서를 구해서 읽었다. 지금은 단점에서 오는 한계 때문에 거의 손을 놓은 상태이며, 개인홈페이지에서 돌아가는 CGI가 거의 유일한 작품이다. 개인적인 생각으로 ForthLanguage가 좋은 언어라고 볼 수는 없다. 하지만 이런 언어도 있다는 것을 프로그래밍을 하는 사람이라면 알아두는 것도 좋을 것같다.
포스에 막 흥미를 가지기 시작했습니다. :-) 여러 페러다임의 언어를 접하는 것은 결국 플러스가 되는 것 같더군요. Forth의 단점에서 오는 한계때문에 Forth에 대한 손을 놓으셨다고 하셨는데 어떠한 단점들이 있습니까? --씨엔
다른 패러다임이라고 하기에 충분하지요. 제가 느끼는 한계는 사용자가 적다는 것, 그에 따라 참고할만한 자료가 많이 부족하다는 것이 있습니다. 그리고 보통의 포스시스템은 무거운 것을 지양하고 최소한의 요건만을 갖출 것을 권합니다. core words라고 해서 정말 꼭 필요한 단어만을 갖추도록 하도록 규정하고 있으며, 나머지 단어들은 시스템마다 없을 수도 있고 있다고 해도 다를 수 있습니다(어떤 단어가 데이터를 처리하는 방식도 여러 가지가 있을 때는 각 시스템에서 알아서 정하라고 합니다). 필요한 것은 필요한 사람이 직접 만들어서 쓰라는 것입니다. 저수준까지 다루는 것은 어셈블리어를 통해서 이루어집니다. 그러다보면 자연히 사용자끼리 서로 다른 시스템을 갖게 되고 그 차이는 새로 각자가 만든 새로운 단어를 이용하면서 점점 커집니다. 소스 코드를 밑바닥부터 공개한다고 해도, 컴퓨터의 종류마다 또 포스의 종류마다 일일이 수정을 가해야하는 경우가 많습니다. 또 개인적으로 씨나 베이직에 길들여져 있는 상태에서는 포스 방식으로 생각하는게 힘듭니다. 하나의 철학이라고까지 얘기하는 사람도 있습니다. :) 개인적으로 창의력이 부족하여 필요한 단어를 쉽게 만들어내는 능력이 부족했습니다. -_-;; --김선주



"; if (isset($options[timer])) print $menu.$banner."
".$options[timer]->Write()."
"; else print $menu.$banner."
".$timer; ?> # # ?>