강좌] 한글 매크로 언어 (마소 4월호) #2 95/04/06 07:34 | 조회수 1059 고원용 통합검색 매크로 언어와 포스의 특징눈치챈 독자도 있겠지만 이 매크로 언어 인터프리터는 포스(Forth)의 인터프리터를 C++로 작성한 것이다. 매크로 언어에서 사용한 명령어들의 이름은 ANSI 포스 표준을 대체로 따랐다. 명령어의 이름이 기호나 영어 대문자인 것은 표준 포스에 의거한 것이고, 영어 소문자인 것은 표준 포스에 없거나 표준 포스와 하는 일이 조금 다른 명령어들이다. C/C++나 흔히 쓰이는 프로그램 언어와의 다른 이 매크로 언어의 특징, 곧 포스의 특징을 몇 가지 설명하면 다음과 같다.

① 포스는 대화식으로 사용하며, 포스 시스템이 인식하는 명령어들은 사전에 들어 있다. ② 사전의 명령어들은 실제로 어떤 기능을 갖고 있다. 이 명령어들은 대화식으로 실행되거나 다른 명령어의 정의에 포함된다. 사전에 새로운 명령어들을 넣어 포스를 확장하는 것이 포스 프로그램을 작성하는 것이다.③ 포스 시스템은 명령어를 만나면 그에 딸린 일을 실행한다(다른 명령어의 정의에 더하는 경우는 예외). 실행되는 일, 다시 말해 '명령어의 뜻'이 포스와 포스 문법을 이해하는 핵심이다.④ 흔히 사용하는 프로그램 언어들의 문법은 자연 언어나 수학 언어를 양식화한 것으로, 문장을 어떻게 구성하는지에 대한 구문론이다(syntax). 반면에 포스의 문법은 각 명령어들이 어떻게 쓰이는지에 대한 의미론이라 할 수 있다(semantics). 명령어를 다시 정의하여 명령어의 의미를 바꿀 수 있으므로 포스에서는 반드시 따라야 하는 규칙이 없다(다른 언어의 프로그래머는 문법이 허용하는 일만 할 수 있지만 포스 프로그래머는 원하는 어떤 일도 할 수 있다). 명령어들은 바로 실행되기 때문에 필요한 값들이 미리 주어져야 한다. 따라서 필요한 값을 주는 명령어가 그 값을 써서 실행하는 명령어보다 먼저 온다(뒤붙임 표기, postfix notation).⑤ 흔히 쓰이는 대부분의 프로그램 언어는 레지스터를 쓰는 컴퓨터를 가정하며(변수와 레지스터의 내용을 바꾸는 치환문 사용), 포스는 더미(stack)를 쓰는 컴퓨터를 가정한다. 따라서 다른 언어들은 이름이 붙은 인자들을 써서 값들을 넘기고 자료를 다루지만 포스는 이름이 없는 값들을 넘기고 더미에 들어 있는 이름이 없는 자료를 다룬다.

작년에 마소에서 특집으로 다룬 포스트스크립트 언어는 포스의 사촌이다. 위에서 적은 것은 또한 포스트스크립트 언어의 특징이기도 하다. 인터프리터를 쓸 수 밖에 없는 환경에서는 인터프리터이면서 컴파일러를 포함한 프로그램 언어 포스나 포스와 비슷한 더미를 사용하는 언어가 쓰인다. 인쇄할 페이지를 묘사하는 프로그램이나 네트웨크를 돌아다닐 에이전트 프로그램들을 모두 컴파일한 후 실행할 수는 없다. 앞으로 네트워크를 통한 통신의 공통 언어가 될 제너럴 매직사의 텔레스크립트에서 실제로 실행되는 언어(Low Telescript)도 포스의 사촌이다. 전자 우편으로 도착하는 수많은 에이전트 프로그램들이 서버에 큰 부담을 주지 않으려면 바로 실행되어야 하고 메모리를 적게 차지해야 한다. 또한 인터프리터를 다른 컴퓨터에 쉽게 옮길 수 있어야 할 것이다. 포스는 이 모든 조건을 만족한다. 사용자가 포스트스크립트 프린터로 보내지는 포스트스크립트 프로그램을 볼 필요가 없듯이 로우 텔레스크립트 언어 프로그램을 직접 볼 필요는 없을 것이다. 그러나 네트워크와의 통신 프로그램을 만들 마소 독자는 로우 텔레스크립트 언어를 알아야 할 것이다. 지난달 특집으로 실린 MUD 게임의 스크립트 언어로 포스를 써도 좋을 것이다. 네트워크에서 텔레스크립트로 작성된 에이전트 프로그램들이 돌아다니며 실행되듯이 게임에 참여하는 사람이 작성한 작은 프로그램들이 실행되는 MUD 게임도 생각해 볼 수 있다. 스크립트 언어에 우리말 함수와 변수 이름을 쓸 수 있다는 것만으로도 고려해 볼 가치가 있을 것이다.

상용 프로그램을 작성하는 데는 언제나 에러 처리가 문제이다. C++ 프로그램 위에 이 매크로 언어를 사용해 만든 상용 프로그램이 에러를 만났을 때는 매크로 언어 인터프리터로 돌아가지 않고 필요한 처리를 한 다음 계속 실행하는 편이 좋을 것이다. ANSI C 컴파일러의 throw(), catch() 함수를 써서 ANSI 포스가 제공하는 THROW, CATCH 기능을 넣을 수 있을 것으로 생각하나 필자가 사용한 터보 C++는 ANSI C 컴파일러가 아니어서 할 수 없었던 것이 아쉬움으로 남는다.포스에 대해 더 알고 싶은 독자는 하이텔 두루물 동호회의 포스 포럼에서 포스에 대한 강좌, 질문과 답을 볼 수 있다. 두루물 동호회 자료실에는 필자가 준비 중인 ANS eForth와 함께 윈도우즈용 포스인 WinForth 쉐어웨어 버전과 C로 작성한 포스인 pfe(portable Forth environment), ThisForth, 온라인 포스 책 "Real Time Forth", ANSI 포스 표준 문서 등의 자료가 있다. 인터넷을 쓸 수 있는 독자라면 날마다 20 개 이상의 글이 올라오는 뉴스 그룹 comp.lang.forth를 보거나 WWW 페이지 "**http://taygeta.oc.nps.navy.mil/forth.html**"과 "**http://pisa.rockefeller.edu:8080/FORTH.html**"을 찾아가보기 바란다.포스를 만든 찰스 무어는 이렇게 말했다. '좋은 프로그래머는 좋은 프로그램을 작성하고 나쁜 프로그래머는 나쁜 프로그램을 작성한다.' 어느 프로그램 언어에 대해서나 맞는 말일 테지만 포스의 경우에는 프로그래머가 어떤 일이라도 할 수 있기 때문에 그 좋고 나쁜 정도의 차이가 아주 크다. 독자가 좋은 프로그래머라면 포스를 써서 다른 사람의 눈이 휘둥그레질 일들을 할 수 있을 것이다. 매크로 언어나 포스에 대한 질문은 하이텔 wykoh나 인터넷 [email protected]로 하기 바라며, '스타워즈'에서오비원 캐노비 노인이 루크 스카이워커에게 마지막으로 한 말로 이 글을 끝내겠다

'May the Forth be with you.'

추천도서"Starting FORTH" 2nd Ed. Leo Brodie, Prentice-Hall, 1987프로그래밍을 처음 배우는 사람에게 좋습니다. 설명을 돕는 그림도 있고 즐겁고 가볍게 읽힙니다. 포스를 처음 배울 때 추천하는 두 권 중의 하나입니다. 신종균님의 번역이 거의 끝나 올해 안에 번역본을 볼 수 있을 것입니다.

"FORTH: A Text and Reference" Mahlon G. Kelly and Nicholas Spies, Prentice-Hall, 1986프로그래밍에 어느 정도 익숙해져 있다면 이 책도 포스를 배우기에 좋습니다. 포스를 처음 배울 때 추천하는 두 권 중의 하나입니다. 보통의 컴퓨터 언어책처럼 약간 딱딱합니다.

"Forth: The New Model, A Programmer's Handbook" Jack Woehr, M&T Books, 1993가장 최근에 나온 책으로 ANSI 포스에 대해 설명하고 있읍니다. Jack Woehr 는 ANS 포스 표준을 만든 위원회의 회원이었읍니다.

"Thinking Forth" Leo Brodie, Prentice-Hall, 1984Starting Forth의 저자가 쓴 책으로 포스 언어의 바탕에 깔린 철학을 다루고 있읍니다. Starting Forth 와 마찬가지로 가볍고 즐겁게 읽힙니다. 포스 프로그래머라면 반드시 읽어보아야 할 책입니다. 신종균님의 번역이 거의 끝나 올해 안에 번역본을 볼 수 있을 것입니다.

<정리 : 정인성> 박스 기사 포스의 역사

포스를 '발명'한 사람은 찰스 무어(Charles H. Moore)이다(어떤 이는 포스를 '발견'했다고 말하기도 한다). 무어가 1960년대에 한 일이 바탕이 되어 1970년에 포스라 불리는 첫 프로그램이 완성되었다. 1971년에는 제대로 모습을 갖춘 포스가 아리조나의 미국 국립 전파 천문대(National Radio Astronomy Observatory)의 전파 망원경에 사용되었다. 이 프로그램은 11미터 크기의 접시 안테나로 하늘의 전파원을 조준 추적하고, 그에 대한 자료를 자기 테이프에 저장해서 천문학자들이 그래픽 단말기에서 대화식으로 분석하는 것을 지원했다. 이 시스템은 멀티프로세싱 기능을 제공하기 때문에 모든 기능을 충돌이나 간섭없이 동시에 쓸 수 있었다. 이것은 당시로는 매우 앞선 개념이었다. 다른 천문학자들도 이 프로그램을 쓰고 싶어해서 이 시스템은 전세계로 빠른 속도로 퍼져 나갔고, 1976년에는 세계 천문학회(International Astronomical Union)에서 포스를 표준 언어로 채택했다.1973년에 무어와 그의 동료들은 이 언어를 상업적으로 보급하려고 포스사(FORTH, Inc.)를 세웠다. 포스사는 미니 컴퓨터에서 멀티유저를 지원하는 포스 시스템을 만들어 데이터베이스에서부터 화상 처리 같은 다양한 분야에 적용했다. 1977년에 포스사는 microFORTH라 불리는 새로 등장한 8비트 CPU용 포스 시스템을 만들었는데, 이 시스템은 미국, 영국, 일본에서 CPU를 내장한 시스템에 성공적으로 사용되었다.북부 캘리포니아의 컴퓨터 동호인들이 microFORTH의 성공에 자극 받아 포스에 관심을 갖게 되어 1978년에 포스 동호회(FIG, Forth Interest Group)를 조직하였다. 이들은 단순한 포스 모델을 개발해서 여러 CPU에 이식하고, 그 소스 코드와 디스크를 매우 싼 값에 보급하였다. 이후로 포스에 대한 관심이 높아져 미국말고도 15개 나라에 포스 동호회 지부가 생겼다. 1980년이 될 때까지 여러 회사들이 포스 동호회 모델을 바탕으로 싼 값의 포스 시스템을 팔기 시작했는데, 이들은 개인 컴퓨터용으로 개발되어 널리 보급되었다.1980년에는 미국의 바이트(BYTE)지에 PC에서 쓰기에 가장 좋은 언어로 포스를 소개하는 특집이 실리기도 했고, 1984년에는 바이트지에 PC/FORTH가 인기 있는 제품으로 소개되기도 했다.포스를 굳은모로 구현한 포스 마이크로프로세서도 80년대에 개발되었다. 칩의 ROM에 포스를 넣은 락웰(Rockwell) 65F11는 1980년대 초부터 생산되어 여러 내장 시스템(embedded system)에 사용되었다. 찰스 무어는 1981년에 포스사에서 기계어가 포스인 마이크로프로세서의 개발을 시작한 후 이를 위한 NOVIX사를 설립해 1984년에 설계를 끝냈다. 이것은 해리스 반도체사(Harris Semiconductor Inc.)가 NOVIX사를 사들인 이후 RTX2000이라는 이름으로 보급되었다.

박스 기사포스의 현재 (ANS Forth, Open Firmware, MuP21)

80년대 중반 이후 C나 베이직의 득세에 비해 포스의 인기는 크게 늘지 못했다(마이크로소프트의 빌 게이트나 볼랜드의 필립 칸이 성공하기 전에 포스를 배울 기회가 있었다면 모든 것이 달라졌을 것이지만 그런 일은 일어나지 않았다). 작년에 포스의 장래에 영향을 미칠 중요한 일들이 있었다. C 언어에서 ANSI C에 해당하는 ANSI 포스 표준이 94년 3월에 공식발표되었고, 12월에 발표된 'IEEE P1275 Standard for Boot (Initialization configuration) Firmware(보통 Open Firmware라고 부른다)'에 사용된 FCode에도 포스가 적용되었다.PCI 버스에 꼽혀있는 어댑터 카드를 생각해 보자. 이 카드가 하드 디스크 컨트롤러라면 전원이 들어온 후 초기화하고 하드 디스크로부터 운영체제를 부팅하는 데 필요한 코드를 CPU에 제공해야 한다. 문제는 CPU가 펜티엄이 될지 파워PC가 될지 알파(Alpha)가 될지 어댑터 카드가 미리 알 수 없다는 데 있다. IEEE P1275은 이를 해결하기 위해 CPU에 독립적인 기계어 FCode와, 마더 보드와 어댑터 카드 사이의 소프트웨어 인터페이스, 대화식으로 부트 과정을 바꾸거나 펌웨어를 시험하고 디버그하기 위한 사용자 인터페이스를 정의했다. 이것은 선(Sun)의 모든 워크스테이션의 롬에 들어 있던 오픈 부트(Open Boot)를 표준화한 것이다. 컴퓨터를 켜면 마더 보드의 롬에 있는 인터프리터가 FCode로 작성된 어댑터 카드 롬의 프로그램을 실행한다. Open Firmware 사용자는 대화식으로 한 단계씩 하드웨어와 소프트웨어를 시험하고 주변 장치의 구성을 바꿀 수도 있고 새 명령어를 만들어 이것들을 한꺼번에 할 수도 있다. 애플은 올해 상반기에 등장할 PCI 버스를 사용하는 파워 맥에 이 표준을 사용할 것으로 알려졌다. 파워PC CPU를 사용하는 IBM과 모토로라의 PC에도 이 Open Firmware가 채택될 것이다. 하드웨어를 다루는 데는 포스보다 좋은 언어가 없다. 개발 도중 하드웨어가 계속 바뀐다면 더욱 그렇다.포스를 만든 찰스 무어는 90년대에도 포스 마이크로프로세서를 개발하는 일을 계속했다. 작년 말에 최초의 MISC(Minimum Instruction Set Computer) 프로세서 MuP21이 공급되기 시작했다. 7000 개의 트랜지스터로 만든 MuP21의 기계어 명령 24개는 80 MIPS로 실행되고 0.05W의 전력을 소모한다. 또한 MuP21에는 CPU와 함께 TV에 바로 연결할 수 있는 16색 신호를 내는 비디오 코프로세서가 40핀 DIP에 들어있다. 너무 좋아서 믿을 수 없다는 것이 대부분의 사람들의 반응이기 때문에 이것을 만드는 회사는 투자자를 끌어들이는 데 어려움을 겪고 있다. 우리 나라의 반도체 회사가 이를 사들여 다음 세기의 마이크로프로세서 시장에서 한 자리를 차지하기를 바라는 것은 필자의 꿈일까? 인터넷을 사용할 수 있는 독자는 MuP21과 개발 중인 다른 MISC 프로세서에 대한 정보와 MuP21 시뮬레이터 프로그램 등을 WWW 페이지 "**http://www.dnai.com/~jfox**"에서 찾을 수 있다. WWW를 쓸 수 없더라도 MuP21 마이크로프로세서 메일링 리스트 "[email protected]"에 subscribe라는 메시지를 보내면 MuP21에 대한 정보를 전자 우편으로 받아볼 수 있다.필자가 알기로 우리나라에 포스가 처음 소개된 것은 1987년이다. 본지 1987년 9월호와 '과학동아' 1988년 2월호와 3월호에 애플 II에서 쓸 수 있는 한글 포스 '늘품'이 변종홍님에 의해 소개되었다. 또한 1988년에 이태욱님이 쓰신 'FORTH 입문'이 교학사에서 출판되었다. 그 후로 잊혀진 것처럼 보이던 포스가 많은 사람의 노력으로 우리나라에서도 작년부터 활동이 활발해졌다. 하이텔 두루물 동호회에 포스 포럼이 생겼고 신종균님의 포스 BBS도 생겨서 활동 중이다.