포스 (프로그래밍 언어)

포스는 구조적 명령형 스택 기반 컴퓨터 프로그래밍 언어 및 프로그래밍 환경이다. 포스(FORTH)는 때때로 예전부터 사용되던 관습적인 사용을 따라 모두 대문자로 쓰지만 약어는 아니다.

절차적, 스택 지향, 형 확인 없는 반사적 프로그래밍 언어(reflective programming language without type checking)인 포스는 두 가지 특징을 가진다. 명령어의 상호작용적인 실행(좀 더 정형적인 운영 체제에 부족한 시스템용 셸로서 적합하게 한다)과 나중에 실행할 일련의 명령어를 컴파일하는 능력이다. 몇몇 포스 버전들(특히 초기의 것들)은 스레드된 코드를 컴파일하지만 오늘날의 많은 구현들은 다른 언어 컴파일러처럼 최적화된 기계어를 생성한다.

스택 
포스는 스택을 사용하며, 역폴란드 표기법(후위 표기법) 사용하여 입출력에 대한 코드를 기술하며, 스택 조작 명령어들을 통해서 값들의 위치와 상태를 변형한다.

(25 * 10 + 50 = 300)이라는 식을 포스에 기술한다면 다음과 같다:
 25 10 * 50 + . <cr> 300 ok

몇 가지 스택 조작 명령들은 본다면 다음과 같다
 교환: 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 튜토리얼
  초보자를 위한 포스 가이드
  포스 입문

스택 지향 프로그래밍 언어
1970년 개발된 프로그래밍 언어
시스템 프로그래밍 언어
ISO 표준 프로그래밍 언어