포스 (프로그래밍 언어)

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색
Forth
패러다임 절차적, 스택지향, 반영
발표년도 1970년대
설계자 Charles H. Moore
자료형 체계 형 없음
주요 구현체 Forth, Inc., Gforth, MPE, pForth
영향을 받은 언어 리스프, APL
영향을 준 언어 팩터, 포스트스크립트
운영 체제 크로스 플랫폼

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

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

스택[편집]

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

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

25 10 * 50 + . <cr> 300 ok
Stack1.svg
왼쪽은 스택에 25와 10이 차례로 들어가 있다.
Forthstack1 5.png
연산자 "*"에 의해 250이 되었다.
Forthstack2.PNG
250 위에 50이 들어갔다.
Forthstack3.PNG
연산자 "+"에 의한 결과 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

바깥 고리[편집]