포스 (프로그래밍 언어)
포스는 구조적 명령형 스택 기반 컴퓨터 프로그래밍 언어 및 프로그래밍 환경이다. 포스(FORTH)는 때때로 예전부터 사용되던 관습적인 사용을 따라 모두 대문자로 쓰지만 약어는 아니다.
패러다임 | 절차적, 스택지향, 반영 |
---|---|
설계자 | Charles H. Moore |
발표일 | 1970년대 |
자료형 체계 | 형 없음 |
운영 체제 | 크로스 플랫폼 |
웹사이트 | forth-standard |
주요 구현체 | |
Forth, Inc., Gforth, MPE, pForth | |
오픈 펌웨어, colorForth, MUF, Reva Forth | |
영향을 받은 언어 | |
리스프, APL | |
영향을 준 언어 | |
팩터, 포스트스크립트 |
절차적, 스택 지향, 형 확인 없는 반사적 프로그래밍 언어(reflective programming language without type checking)인 포스는 두 가지 특징을 가진다. 명령어의 상호작용적인 실행(좀 더 정형적인 운영 체제에 부족한 시스템용 셸로서 적합하게 한다)과 나중에 실행할 일련의 명령어를 컴파일하는 능력이다. 몇몇 포스 버전들(특히 초기의 것들)은 스레드된 코드를 컴파일하지만 오늘날의 많은 구현들은 다른 언어 컴파일러처럼 최적화된 기계어를 생성한다.
스택
편집포스는 스택을 사용하며, 역폴란드 표기법(후위 표기법) 사용하여 입출력에 대한 코드를 기술하며, 스택 조작 명령어들을 통해서 값들의 위치와 상태를 변형한다.
(25 * 10 + 50 = 300)이라는 식을 포스에 기술한다면 다음과 같다:
25 10 * 50 + . <cr> 300 ok
왼쪽은 스택에 25와 10이 차례로 들어가 있다. | |
연산자 "*"에 의해 250이 되었다. | |
250 위에 50이 들어갔다. | |
연산자 "+"에 의한 결과 300이 명령 "."에 의해 스택으로부터 출력. |
몇 가지 스택 조작 명령들은 본다면 다음과 같다
- 교환: swap ( x y -- y x )는 TOS와 NOS를 맞바꾼다.
- 복제: over ( x y -- x y x )는 NOS를 TOS로 복제하며, dup ( x -- x x )는 TOS를 복제한다,
- 제거: drop ( x -- )는 TOS를 제거한다.
주석 기호인 소괄호(()) 안에 들어가는 stack effects는 대체로 통용되는 것들을 사용하는데, n 은 숫자, s는 문자열 따위로 적는다.
낱말
편집사용하는 낱말에 대한 정의는 다음처럼 콜론 기호(:)를 이용하여 시작한다음, 세미콜론 기호(;)를 이용하여 닫으면 된다:
: ++ ( n -- n ) 1+ ;
이름 짓기에 있어서 특별한 제약이 없기 때문에 원하는 대로 할 수 있다. 단, 포스는 공백으로 낱말을 구분하기 때문에 공백이 들어가지 않게 한다. 이렇게 만들어지는 낱말은 방언을 제외하고는 ANS 포스를 따르는 이상 대소문자 구별을 하지 않는다. 또, 한 번 만들어진 단어라도 정의를 시도하면 언제든지 재정의 할 수 있다.
모든 낱말은 포스 사전에 들어가며, 사용자는 사용자 사전을 통해 자신이 만들어낸 낱말들을 저장하고 불려나갈 수 있다.
예제
편집Hello, factorial! 출력문:
: hello ( -- str ) ." Hello, factorial!" cr ; : fac ( n -- n! ) dup 0= if drop 1 else dup 1- recurse * then ; hello 10 fac . cr bye
반복문을 이용하는 계승 코드:
1 swap begin ?dup while tuck * swap 1- repeat
외부 링크
편집- (영어) pForth 튜토리얼
- (영어) 초보자를 위한 포스 가이드
- (영어) 포스 입문