맨위로가기

포스 (프로그래밍 언어)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

포스는 1958년 찰스 무어가 개발한 프로그래밍 언어이다. 스택 기반, 역폴란드 표기법(후위 표기법)을 사용하며, 작고 이식성이 뛰어나 임베디드 시스템, 부트로더, 천문학 및 우주 개발 등 다양한 분야에서 활용되었다. 1970년대에 처음 공개되었으며, 1973년 FORTH, Inc.가 설립되어 상업적으로 발전했다. 1979년과 1983년에 사실상의 표준이 제정되었고, 1994년에는 ANSI 표준으로 제정되었다. 포스는 자기 확장적이며, 대화형 개발 환경을 제공하며, 다양한 구현체가 존재한다.

2. 역사

찰스 무어는 1958년부터 개인 프로그래밍 시스템을 꾸준히 개발했고, 여기서 포스(Forth)가 탄생했다.[44] 1968년, 무어는 가구 및 카펫 회사에서 근무하며 이 소프트웨어를 미니컴퓨터에서 FORTRAN으로 다시 작성했는데, 이것이 포스의 원형이 되었다.[44] 1970년대 초, 미국 국립 전파 천문대(NRAO)의 엘리자베스 레더를 시작으로 다른 프로그래머들에게 처음 공개되었다.[13]

무어는 포스의 이름을 지을 당시를 다음과 같이 회상한다:[15]

> 1968년의 "[t]he file holding the interpreter was labeled FOURTH, for 4th (next) generation software — but the IBM 1130 operating system restricted file names to 5 characters."[45]에서 Forth가 명명되었다. 무어는 compile-link-go 3세대 언어의 후계, 또는 "4세대" 하드웨어를 위한 소프트웨어로서 Forth를 보고 있었으며, 용어로 사용되던 4세대 언어 (4GL)는 아니었다. 무어는 어셈블리어・FORTRAN・BASIC에 이은 4번째 언어라는 의미로 이 소프트웨어에 "fourth"라고 이름을 붙이려 했지만, 이 미니컴에서 처리할 수 있는 파일명이 최대 5자였기 때문에 "FORTH"라는 이름이 되었다고 한다.

1971년, 무어는 NRAO에서 사용할 제어용 소프트웨어를 제작하면서 포스를 완성했다.[44] 이후 무어와 레더는 1973년에 FORTH, Inc.를 설립하여 포스 시스템을 더욱 발전시키고 다양한 플랫폼으로 이식했다.

포스는 초기 언어 개발의 어려움 중 하나였던 서로 다른 컴퓨터 아키텍처로의 이식성이 용이했기 때문에, 새로운 하드웨어를 개발하는 데 자주 사용되었다. 예를 들어, 포스는 1978년 인텔 8086 칩의 최초 상주 소프트웨어였고, MacFORTH는 1984년 애플(Apple Inc.) 매킨토시의 최초 상주 개발 시스템이었다.[44]

포스는 1980년대 초, 마이크로컴퓨터의 제한된 메모리에 적합하고 쉽게 구현할 수 있다는 장점 덕분에 널리 사용되었다.[17][18] Jupiter ACE 가정용 컴퓨터는 ROM에 내장된 운영 체제에 포스를 포함하기도 했다. Insoft GraFORTH는 Apple II용 그래픽 확장을 갖춘 포스의 한 버전이다.[19] 캐논 캣(Canon CAT)도 또한 그 시스템 프로그래밍을 위해 Forth를 사용했다. 게다가 Rockwell도 상주 Forth 커널을 가진 R65F11과 R65F12의 싱글칩 마이크로컴퓨터를 제조했다.

2018년 기준으로, FORTH의 원래 1130 버전의 소스가 복구되어 복원되거나 에뮬레이션된 1130 시스템에서 실행되도록 업데이트되고 있다.[24]

2. 1. 초기 개발

찰스 무어는 1968년부터 지속적으로 개발해 온 개인 프로그래밍 시스템을 바탕으로 포스(Forth)를 만들었다.[13][14] 1970년대 초, 미국 국립 전파 천문대(NRAO)의 엘리자베스 레더를 시작으로 다른 프로그래머들에게 처음 공개되었다.[13]

무어는 포스를 컴파일-링크-실행 방식을 사용하는 3세대 프로그래밍 언어의 후계자, 또는 "4세대" 하드웨어를 위한 소프트웨어로 보았다. 그는 이 언어의 이름을 짓게 된 과정을 다음과 같이 회상한다:[15]

1973년, 무어와 레더는 FORTH, Inc.를 설립하여 포스 시스템을 개선하고 수십 개의 다른 플랫폼으로 이식했다.

2. 2. FORTH, Inc. 설립과 상업적 확산

찰스 무어와 엘리자베스 레더는 1973년에 FORTH, Inc.를 설립했다.[13] 이 회사를 통해 그들은 10년 동안 포스 시스템을 개선하고 수십 개의 다른 플랫폼으로 이식했다.[13]

무어는 포스를 컴파일-링크-실행 방식을 사용하는 3세대 프로그래밍 언어나 "4세대" 하드웨어를 위한 소프트웨어의 후속 주자로 보았다.

FORTH, Inc.는 1976년부터 인텔 8080, 모토로라 6800, Zilog Z80, RCA 1802 마이크로프로세서를 위해 microFORTH를 개발했다.[16] MicroFORTH는 나중에 취미 개발자들이 1978년 6502와 같은 다른 아키텍처를 위한 포스 시스템을 생성하는 데 사용되었다.[16] 1978년에는 Forth Interest Group이 결성되어,[16] 자체 버전의 언어인 FIG-Forth를 대부분의 가정용 컴퓨터에 홍보하고 배포했다.

2. 3. 표준화 노력과 ANS Forth

1979년과 1983년에 각각 사실상의 표준인 FORTH-79[20]와 FORTH-83[21]이 공식화되었다. 이 표준들은 1994년 ANSI에 의해 통합되었으며, 일반적으로 ANS Forth[22][23]라고 불린다.

2. 4. 한국에서의 포스

임베디드 시스템의 경우, 코드는 직렬 포트 또는 단일 TTL 비트를 통해 크로스 컴파일이라는 기법으로 다른 컴퓨터에 기록될 수 있으며, 사전의 단어 이름 및 기타 실행되지 않는 부분은 원래 컴파일 컴퓨터에 유지된다. 이러한 포스 컴파일러의 최소 정의는 바이트를 가져오고 저장하는 단어와 포스 단어가 실행되도록 명령하는 단어이다. 원격 포트를 작성하는 데 가장 시간이 많이 걸리는 부분은 가져오기, 저장 및 실행을 구현하는 초기 프로그램을 구성하는 경우가 많지만, 많은 최신 마이크로프로세서에는 이 작업을 제거하는 통합 디버깅 기능(예: 모토로라 CPU32)이 있다.[32]

3. 특징

포스는 스택 기반의 프로그래밍 언어로, 다음과 같은 특징을 갖는다.
스택 지향 및 역폴란드 표기법:포스는 데이터 스택을 사용하여 연산을 수행하며, 역폴란드 표기법(후위 표기법)을 사용한다. 후위 표기법은 연산자가 피연산자 뒤에 오는 표기법이다. 예를 들어 `(25 * 10 + 50)`은 포스에서 `25 10 * 50 +` 로 표현된다.[26]

왼쪽


먼저 숫자 25와 10이 스택에 순서대로 들어간다.

왼쪽


`*` 연산자는 스택의 상위 두 숫자를 곱하여 250을 만들고, 이를 다시 스택에 넣는다.

왼쪽


그 후, 숫자 50이 스택에 추가된다.

`+` 연산자가 스택의 상위 두 숫자를 더해 300을 만들고, 이를 스택에 넣는다. 마지막으로 `.` 명령어가 스택의 맨 위 값(300)을 출력한다.[26]

포스는 `swap`, `dup`, `drop`과 같은 스택 조작 명령어를 제공하여 데이터의 위치와 상태를 변경할 수 있다.
절차적 프로그래밍 및 확장성:포스는 '단어(word)'라고 불리는 작은 함수들을 결합하여 프로그램을 작성하는 절차적, 명령형 언어이다. 큰 포스 프로그램은 단어들의 계층 구조로 구성되며, 각 단어는 스택 메커니즘을 통해 암묵적으로 통신하는 독립적인 모듈처럼 작동한다. 이러한 특징 덕분에 포스는 문제 지향 언어를 만드는 데 사용될 수 있으며, '메타 애플리케이션 언어'라고도 불린다.[25]

새로운 단어는 `:`(콜론)으로 시작하고 `;`(세미콜론)으로 끝나는 정의를 통해 생성된다. 다음은 `FLOOR5`라는 새 단어를 정의하는 예시이다.

```forth

: FLOOR5 ( n -- n' ) DUP 6 < IF DROP 5 ELSE 1 - THEN ;

```

이 단어는 스택에서 숫자를 가져와 6보다 작으면 5를, 그렇지 않으면 원래 숫자에서 1을 뺀 값을 반환한다.

포스는 사용자가 새로운 단어를 정의하여 언어의 기능을 확장할 수 있는 높은 확장성을 제공한다.
대화형 개발 환경:포스는 컴파일러와 대화형 셸이 통합된 환경을 제공한다. 이는 LISP의 REPL과 유사하며, 사용자는 "워드"(words)를 대화식으로 정의하고 실행할 수 있다.

`+`나 `.`과 같은 연산자와 출력 기능도 모두 워드이며, 내장 워드와 사용자 정의 워드 사이에 본질적인 차이는 없다. 컴파일된 워드는 즉시 환경에 통합되어 인터프리터에서 단독으로 실행 가능하다.

포스는 공식적인 문법 사양이 없으며, 간단한 알고리즘으로 정의된다. 인터프리터는 입력된 단어를 사전에서 검색하고, 찾으면 실행하며, 찾지 못하면 숫자로 변환을 시도한다.
이식성과 효율성:포스는 이식성이 뛰어나 다양한 컴퓨터 아키텍처에서 사용될 수 있다. 초기에는 스레드 코드를 생성했지만, 최근에는 최적화된 목적 코드를 생성한다. 포스는 1978년 인텔 8086 칩의 최초 상주 소프트웨어였고, MacFORTH는 1984년 최초 애플(Apple Inc.) 매킨토시의 최초 상주 개발 시스템이었다.[44]

클래식 포스 시스템은 운영 체제나 파일 시스템을 사용하지 않고 소스 코드를 디스크 블록에 저장했지만, 최신 포스 시스템은 호스트 운영 체제의 파일 시스템을 사용한다.

컴퓨터 멀티태스킹은 협력적 라운드 로빈 스케줄링으로 사용 가능하다. `PAUSE` 단어는 현재 작업의 실행 컨텍스트를 저장하고, 다음 작업을 찾아 실행 컨텍스트를 복원한다.

3. 1. 스택 지향 프로그래밍과 역폴란드 표기법

포스는 데이터를 보관하는 데이터 스택과 함수의 호출 주소를 저장하는 리턴 스택을 활용하는 스택 지향 프로그래밍 방식을 사용한다. 연산은 역폴란드 표기법(후위 표기법)으로 이루어지는데, 이는 연산자가 피연산자 뒤에 오는 방식이다. 예를 들어, 일반적인 중위 표기법에서 `(25 * 10 + 50)`은 포스에서는 `25 10 * 50 +` 와 같이 표현된다.[26]

먼저 25와 10이 순서대로 스택에 들어간다.

`*` 연산자가 스택의 상위 두 숫자를 곱하여 250을 만들고, 이 값을 다시 스택에 넣는다.

이어서 50이 스택에 추가된다.

`+` 연산자가 스택의 상위 두 숫자를 더하여 300을 만들고, 이 값을 스택에 넣는다. 마지막으로 `.` 명령어가 스택의 맨 위 값(300)을 출력한다.[26]

이처럼 역폴란드 표기법은 연산의 순서를 명확하게 하고, 괄호 없이도 복잡한 계산을 표현할 수 있게 해준다. 또한, 포스는 스택 조작 명령어들을 통해 데이터의 위치와 상태를 변경한다. 예를 들어, `swap`은 스택의 맨 위 두 항목의 위치를 바꾸고, `dup`는 맨 위 항목을 복제하며, `drop`은 맨 위 항목을 제거한다.[25] 이러한 스택 조작 명령어들은 포스 프로그래밍의 기본적인 요소이다.

3. 2. 절차적 프로그래밍과 확장성

포스는 '단어(word)'라고 불리는 작은 서브루틴들을 조합하여 프로그램을 작성하는 절차적 프로그래밍 언어이다. 더 큰 작업을 위한 단어는 각각 별개의 하위 작업을 수행하는 더 작은 많은 단어를 호출한다. 큰 포스 프로그램은 단어들의 계층 구조이다. 스택 메커니즘을 통해 암묵적으로 통신하는 별개의 모듈인 이러한 단어는 독립적으로 프로토타입을 만들고, 빌드하고, 테스트할 수 있다. 포스 코드의 최상위 레벨은 애플리케이션의 영어 설명과 유사할 수 있다. 이러한 특징으로 포스는 문제 지향 언어를 만드는 데 사용할 수 있는 언어인 '메타 애플리케이션 언어'라고 불려 왔다.[25]

새로운 단어(words)는 `:` (콜론)으로 시작하고 `;` (세미콜론)으로 끝나는 정의를 통해 만들어진다. 예를 들어:

```forth

: ++ ( n -- n ) 1+ ;

```

위 코드는 `++`라는 새 단어를 정의한다. `++`는 스택에서 숫자 하나(`n`)를 가져와 1을 더한 후(`1+`) 다시 스택에 돌려놓는다.

단어 이름에는 공백을 제외하고는 특별한 제약이 없다. 만들어진 낱말은 방언을 제외하고는 ANS 포스를 따르는 이상 대소문자를 구별하지 않는다. 한번 만들어진 단어라도 정의를 시도하면 언제든지 재정의할 수 있다.

모든 낱말은 포스 사전에 들어가며, 사용자는 사용자 사전을 통해 자신이 만들어낸 낱말들을 저장하고 불러올 수 있다.

포스는 데이터 스택과 후위 표기법을 암묵적으로 사용한다. 후위 표기법은 언어를 더 쉽게 구문 분석하고 확장할 수 있게 해준다. 포스의 유연성 때문에 정적 BNF 문법은 부적절하며, 모놀리식 컴파일러가 없다. 컴파일러를 확장하려면 문법을 수정하고 기본 구현을 변경하는 대신 새 단어를 작성하기만 하면 된다.

포스에서는 "+"나 "."과 같은 연산자 및 출력 기능 등 모든 것이 단어이다. 이러한 내장된 단어와 사용자가 나중에 콜론 정의(컴파일러)로 추가한 단어 사이에는 본질적인 차이가 없다. 컴파일된 단어는 즉시 환경에 통합되어 인터프리터로부터 단독으로 실행할 수 있다. 즉, 해당 포스 처리 시스템을 확장하는 것이다. 이러한 점으로 인해 포스는 자기 확장성이 높다고 말한다.

프로그램 개발 과정에서 처리 단위를 단어로 순차적으로 구축해나가므로, 주의 깊게 진행하면 자연스럽게 깔끔하게 구조화된다. 단어는 단독으로 실행할 수 있으므로 부분별로 디버깅하는 것도 용이하다. 또한 이러한 단어들을 사용하여 테스트용 처리(단어)를 부담없이 생성하고 실행 및 테스트할 수 있다.

3. 3. 대화형 개발 환경

포스(Forth) 환경은 컴파일러와 대화형 셸이 통합된 형태를 띤다. 이는 LISP의 REPL과 유사하며, 사용자는 "워드"(words)라고 불리는 서브루틴을 대화식으로 정의하고 실행할 수 있다.

새로운 워드는 콜론(`:`)으로 시작하여 세미콜론(`;`)으로 끝난다. 예를 들어,



: X DUP 1+ . . ;



와 같이 정의하면, `X`라는 워드가 컴파일되어 사전에서 찾을 수 있게 된다. 콘솔에서 `10 X`를 입력하여 실행하면 `11 10`이 출력된다.[28]

`+`나 `.`과 같은 연산자 및 출력 기능도 모두 워드이다. 이러한 내장 워드와 사용자가 콜론 정의(컴파일러)로 추가한 워드 사이에는 본질적인 차이가 없다. 컴파일된 워드는 즉시 환경에 통합되어 인터프리터에서 단독으로 실행할 수 있다.

다음은 `EMIT-Q`라는 워드의 정의 예시이다. 실행 시 `Q` 문자를 출력한다.



: EMIT-Q 81 ( 문자 'Q'의 ASCII 값 ) EMIT ;



괄호 안의 텍스트는 주석이다. `EMIT` 워드는 데이터 스택에서 값을 가져와 해당 문자를 표시한다.

다음은 `EMIT-Q`를 재정의한 예시이다.



: EMIT-Q [ CHAR Q ] LITERAL EMIT ;



`[` 및 `]` 워드를 사용하여 인터프리터 상태로 전환하고, `CHAR` 및 `LITERAL` 워드를 사용하여 `Q` 문자의 ASCII 값을 계산하고 컴파일 상태로 돌아가 계산된 값을 현재 콜론 정의에 추가한다.

`[CHAR]` 워드를 사용하면 다음과 같이 다시 작성할 수 있다.



: EMIT-Q [CHAR] Q EMIT ; \ 단일 문자 'Q' 출력



이 정의는 설명 주석에 `\`(백슬래시)를 사용했다.

포스는 문법 사양이 없으며, 간단한 알고리즘으로 정의된다. 인터프리터는 사용자 입력 장치로부터 입력 행을 읽어 들인 후, 공백을 구분자로 하여 워드를 구문 분석한다.[27] 인터프리터가 워드를 찾으면 사전에서 검색하고, 찾으면 해당 워드와 관련된 코드를 실행한다. 찾을 수 없으면 숫자로 간주하여 변환을 시도하고, 성공하면 스택에 푸시한다. 검색과 숫자 변환 모두 실패하면 오류 메시지를 출력한다.

프로그램 개발은 처리 단위로 구분하여 워드로 순차적으로 구축해나가므로, 주의 깊게 진행하면 자연스럽게 구조화된다. 워드는 단독으로 실행할 수 있으므로 부분별로 디버깅하기 쉽다.

대부분의 포스 시스템에는 프로세서 기능을 사용하여 워드를 작성하기 위한 어셈블러가 포함되어 있다. 포스 어셈블러는 일반적으로 역 폴란드 표기법을 사용한다.[50]

3. 4. 이식성과 효율성

포스는 데이터 스택과 후위 표기법을 암묵적으로 사용하며, 이는 휴렛 팩커드의 계산기에서 흔히 사용된다. 후위 표기법에서 연산자는 피연산자 뒤에 위치한다. 후위 표기법은 언어를 더 쉽게 구문 분석하고 확장할 수 있게 해준다. 포스의 유연성 때문에 정적 BNF 문법은 부적절하며, 모놀리식 컴파일러가 없다. 컴파일러를 확장하려면 문법을 수정하고 기본 구현을 변경하는 대신 새 단어를 작성하기만 하면 된다.[25]

대부분의 포스 시스템은 마이크로소프트 윈도우, 리눅스 또는 유닉스 버전과 같은 호스트 운영 체제에서 실행되며 소스 및 데이터 파일에 호스트 운영 체제의 파일 시스템을 사용한다. ANSI 포스 표준은 I/O에 사용되는 단어를 설명한다. 모든 최신 포스 시스템은 임베디드된 경우에도 소스에 일반 텍스트 파일을 사용한다. 상주 컴파일러가 있는 임베디드 시스템은 직렬 라인을 통해 소스를 가져온다.

클래식 포스 시스템은 전통적으로 운영 체제도, 파일 시스템도 사용하지 않는다. 소스 코드는 파일을 저장하는 대신 물리적 디스크 주소에 기록된 디스크 블록에 저장된다. `BLOCK` 단어는 1K 크기의 디스크 공간 블록 번호를 해당 데이터를 포함하는 버퍼의 주소로 변환하는 데 사용되며, 이는 포스 시스템에 의해 자동으로 관리된다. 1990년대 중반 이후 블록 사용은 드물어졌으며, 호스팅된 시스템에서는 해당 블록도 어떤 경우든 일반 파일에 할당된다.

컴퓨터 멀티태스킹은 가장 일반적으로 협력적 라운드 로빈 스케줄링으로 사용 가능하다(멀티태스킹 단어 및 지원은 ANSI 포스 표준에서 다루지 않음). `PAUSE` 단어는 현재 작업의 실행 컨텍스트를 저장하고, 다음 작업을 찾고, 해당 실행 컨텍스트를 복원하는 데 사용된다. 각 작업에는 자체 스택, 일부 제어 변수의 개인 복사본 및 스크래치 영역이 있다. 작업 교환은 간단하고 효율적이다. 결과적으로 포스 멀티태스커는 인텔 8051, Atmel AVR, TI MSP430과 같은 매우 간단한 마이크로컨트롤러에서도 사용할 수 있다.[30]

기타 비표준 기능으로는 호스트 OS 또는 윈도우 시스템에 시스템 호출을 발행하기 위한 메커니즘이 있으며, 많은 기능은 운영 체제에서 제공하는 스케줄링을 사용하는 확장을 제공한다. 일반적으로 스탠드얼론 포스의 `PAUSE` 단어와는 다른 더 크고 다른 작업 생성, 일시 중단, 파괴 및 우선 순위 수정 단어가 있다.

초기 구현 및 이식성을 목적으로 한 구현에는 스레드 코드를 생성하는 것도 있지만, 최근 구현에서는 다른 언어의 컴파일러처럼 최적화된 목적 코드를 생성하는 것도 있다.

찰스 무어는 여러 직장을 옮겨 다녔기 때문에, 초기 언어 개발의 어려움은 서로 다른 컴퓨터 아키텍처로의 이식 용이성이었다. 포스 시스템은 종종 새로운 하드웨어를 육성하기 위해 사용되었다. 예를 들어, 포스는 1978년의 새로운 인텔 8086 칩 상의 최초의 상주 소프트웨어였고, MacFORTH는 1984년의 최초 애플(Apple Inc.) 매킨토시의 최초의 상주 개발 시스템이었다.[44]

4. 언어 구조

포스는 '낱말(word)'이라고 불리는 작고 단순한 함수들을 사용하며, 더 큰 작업을 위해 여러 작은 낱말들을 호출하는 계층 구조를 이룬다. 이러한 구조 덕분에 포스는 '메타 애플리케이션 언어'라고도 불린다.[25] 포스는 데이터 스택과 후위 표기법을 사용하는데, 이는 휴렛 팩커드 계산기에서 흔히 사용되는 방식이다. 후위 표기법은 연산자가 피연산자 뒤에 위치하는 방식으로, 언어를 더 쉽게 구문 분석하고 확장할 수 있게 해준다.

포스 컴파일러는 공식적인 문법 규격 없이 간단한 알고리즘으로 정의된다. 인터프리터는 입력 줄을 읽고 공백으로 단어를 구분하여 사전에서 찾는다. 단어를 찾으면 해당 코드를 실행하고, 찾지 못하면 숫자로 변환하여 스택에 넣는다. 실패하면 오류 메시지를 출력한다.[27] 포스는 유연하기 때문에 정적 BNF 문법은 부적절하며, 모놀리식 컴파일러가 없다. 컴파일러를 확장하려면 문법을 수정하거나 기본 구현을 변경하는 대신 새 단어를 작성하면 된다.

새 단어는 `:` (콜론)으로 시작하고 `;` (세미콜론)으로 끝난다. 예를 들어, `: X DUP 1+ . . ;` 코드는 `X`라는 새 단어를 정의하며, 실행하면 `10 X`는 `11 10`을 출력한다.[28]

대부분의 포스 시스템에는 어셈블러가 포함되어 있으며, 역 폴란드 표기법을 사용한다. 포스 어셈블러는 매크로 어셈블러와 유사하며, 레지스터 별칭을 쉽게 정의할 수 있다.[29] 포스 시스템은 자체적으로 컴파일할 수 있는 셀프 호스팅 기능을 갖추고 있다. 컴파일러는 메모리 버퍼를 사용하여 코드를 생성하고, 테스트 후 이전 버전을 덮어쓴다.[31] 임베디드 시스템에서는 크로스 컴파일을 통해 다른 컴퓨터에 코드를 기록할 수 있다.[32]

` :NONAME`은 익명 단어를 정의하고 ''실행 토큰''을 남긴다. `EXECUTE`는 실행 토큰을 받아 의미를 수행하고, `COMPILE,`은 실행 토큰을 컴파일한다. `'` (작은 따옴표)는 단어의 실행 토큰을 반환한다.[37] `(` (괄호)와 `\` (백슬래시)는 주석을 나타낸다.

Forth에서 데이터 객체는 `VARIABLE`, `CONSTANT`, `CREATE` 등의 정의 낱말을 사용하여 만들 수 있다.


  • `VARIABLE`: 초기화되지 않은 단일 셀 메모리 위치를 지정한다. `VARIABLE`로 정의된 낱말(인스턴스)을 실행하면 스택에 해당 메모리 주소가 반환된다.
  • `CONSTANT`: 특정 값을 나타낸다. `CONSTANT`로 정의된 낱말을 실행하면 해당 값이 스택에 반환된다.
  • `CREATE`: 특정 메모리 위치를 지정한다. `CREATE`로 정의된 낱말을 실행하면 해당 메모리 공간의 시작 주소가 스택에 반환된다. 이 위치에 문자열이나 다른 초기화된 값을 저장할 수 있다.


예시:

```forth

VARIABLE myVar \ myVar라는 이름의 변수를 생성

10 CONSTANT myConst \ myConst라는 이름의 상수를 10으로 정의

CREATE myArray 10 ALLOT \ myArray라는 이름의 10셀 공간을 생성

```

Forth는 또한 사용자가 직접 정의 낱말을 만들어 새로운 데이터 객체를 정의할 수 있는 기능을 제공한다. 이러한 방식으로 순환 버퍼, I/O 포트의 명명된 비트, 자동 인덱싱된 배열 등을 만들 수 있다.[38]

Forth에서 정의된 데이터 객체는 전역 범위를 가진다. 다른 프로그래밍 언어에서 지역 변수가 제공하는 기능은 주로 데이터 스택을 통해 제공된다. Forth 프로그래밍 스타일에서는 명명된 데이터 객체를 다른 언어에 비해 적게 사용하는 경향이 있다. 명명된 데이터 객체는 주로 여러 낱말이나 작업에서 공유되는 데이터를 저장하는 데 사용된다.[57]

Forth는 데이터 타입의 사용을 강제하지 않는다. 프로그래머는 값을 가져오고 저장하거나 데이터에 대한 다른 작업을 수행하기 위해 적절한 연산자를 사용해야 한다.[38]

4. 1. 낱말(Words)과 사전(Dictionary)

포스는 '낱말(word)'이라고 불리는 작고 단순한 함수를 사용하며, 더 큰 작업을 위한 낱말은 각각 별개의 하위 작업을 수행하는 더 작은 낱말들을 호출한다. 이러한 낱말들은 스택 메커니즘을 통해 암묵적으로 통신하는 별개의 모듈이며, 독립적으로 프로토타입을 만들고, 빌드하고, 테스트할 수 있다. 포스 코드의 최상위 레벨은 애플리케이션의 영어 설명과 유사할 수 있다. 포스는 문제 지향 언어를 만드는 데 사용할 수 있는 언어인 '메타 애플리케이션 언어'라고 불려 왔다.[25]

포스에서 사용되는 모든 낱말은 포스 사전에 들어가며, 사용자는 사용자 사전을 통해 자신이 만들어낸 낱말들을 저장하고 관리할 수 있다.

포스의 기본 데이터 구조는 "단어"를 실행 가능한 코드 또는 명명된 데이터 구조에 매핑하는 "사전"이다. 사전은 가장 최근에 정의된 낱말에서 가장 오래된 낱말까지 진행되는 연결 리스트의 트리로 메모리에 배치되며, 일반적으로 NULL 포인터인 센티넬 값이 발견될 때까지 연결된다. 컨텍스트 전환은 다른 리프에서 목록 검색을 시작하게 한다. 연결 리스트 검색은 분기가 주 트렁크로 병합되어 결국 센티넬, 즉 루트로 돌아가면서 계속된다.

여러 개의 사전이 있을 수 있으며, 메타 컴파일과 같은 드문 경우에 사전은 격리되어 독립적으로 존재할 수 있다. 이는 네임스페이스 중첩과 유사하며 컨텍스트에 따라 키워드를 오버로드할 수 있게 한다.

정의된 낱말은 일반적으로 '헤드'와 '바디'로 구성되며, 헤드는 '이름 필드'(NF)와 '링크 필드'(LF)로, 바디는 '코드 필드'(CF)와 '매개변수 필드'(PF)로 구성된다. 사전 항목의 헤드와 바디는 인접하지 않을 수 있으므로 별도로 처리된다. 예를 들어, 새로운 플랫폼에 맞게 포스 프로그램을 다시 컴파일할 때 헤드는 컴파일 컴퓨터에 남아 있을 수 있지만 바디는 새 플랫폼으로 이동한다. 임베디드 시스템과 같은 일부 환경에서는 헤드가 불필요하게 메모리를 차지한다. 그러나 일부 크로스 컴파일러는 대상 자체가 대화형 포스를 지원할 것으로 예상되는 경우 헤드를 대상에 넣을 수 있다.[33]

사전 항목의 정확한 형식은 규정되어 있지 않으며 구현에 따라 다르다.

4. 2. 컴파일러 구조

포스는 ''단어''라고 불리는 작고 단순한 함수들을 사용하며, 더 큰 작업을 위해 여러 작은 단어들을 호출하는 계층 구조를 이룬다. 이러한 특징 덕분에 포스는 ''메타 애플리케이션 언어''라고도 불린다.[25] 포스는 데이터 스택과 후위 표기법을 사용하는데, 이는 휴렛 팩커드 계산기에서 흔히 사용되는 방식이다. 후위 표기법은 연산자가 피연산자 뒤에 위치하는 방식으로, 언어를 더 쉽게 구문 분석하고 확장할 수 있게 해준다. 포스는 유연하기 때문에 정적 BNF 문법은 부적절하며, 모놀리식 컴파일러가 없다. 컴파일러를 확장하려면 문법을 수정하거나 기본 구현을 변경하는 대신 새 단어를 작성하면 된다.

예를 들어, `(25 * 10 + 50)`과 같은 수학식은 포스에서 다음과 같이 계산할 수 있다.

```forth

25 10 * 50 + CR .

300 ok

```

먼저 25와 10이 스택에 들어가고, `*`는 스택의 상위 두 숫자를 곱하여 그 결과를 다시 스택에 넣는다. 그 다음 50이 스택에 들어가고, `+`는 상위 두 값을 더하여 합계를 스택에 넣는다. `CR`은 새 줄에서 출력을 시작하고, `.`은 결과를 출력한다. 모든 것이 성공하면 포스 시스템은 `ok`를 출력한다.[26]

포스 컴파일러는 공식적인 문법 규격 없이 간단한 알고리즘으로 정의된다. 인터프리터는 입력 줄을 읽고 공백으로 단어를 구분하여 사전에서 찾는다. 단어를 찾으면 해당 코드를 실행하고, 찾지 못하면 숫자로 변환하여 스택에 넣는다. 실패하면 오류 메시지를 출력한다.[27]

새 단어는 `:` (콜론)으로 시작하고 `;` (세미콜론)으로 끝난다. 예를 들어:

```forth

: X DUP 1+ . . ;

```

위 코드는 `X`라는 새 단어를 정의하며, 실행하면 `10 X`는 `11 10`을 출력한다.[28]

대부분의 포스 시스템에는 어셈블러가 포함되어 있으며, 역 폴란드 표기법을 사용한다. 포스 어셈블러는 매크로 어셈블러와 유사하며, 레지스터 별칭을 쉽게 정의할 수 있다.[29]

포스 시스템은 자체적으로 컴파일할 수 있는 셀프 호스팅 기능을 갖추고 있다. 컴파일러는 메모리 버퍼를 사용하여 코드를 생성하고, 테스트 후 이전 버전을 덮어쓴다.[31] 임베디드 시스템에서는 크로스 컴파일을 통해 다른 컴퓨터에 코드를 기록할 수 있다.[32]

컴파일러는 단일 프로그램이 아니라 포스 단어들로 구성되어, 프로그래머가 특수 목적으로 컴파일러 단어를 변경할 수 있다. "컴파일 시간" 플래그가 설정된 단어는 컴파일 중에 실행된다. 대부분의 제어 구조(예: `IF`, `WHILE`)는 컴파일 시간 단어로 구현된다.[28]

`:` (콜론)은 새 정의를 시작하고 컴파일 상태로 들어가며, 인터프리터는 단어의 ''컴파일 의미''를 실행한다. `;` (세미콜론)은 정의를 종료하고 해석 상태로 돌아간다.[28]

인터프리터 상태는 `[` (왼쪽 대괄호)와 `]` (오른쪽 대괄호)로 수동으로 변경할 수 있다. `STATE` 플래그는 현재 상태를 나타낸다. `IMMEDIATE` 단어는 최근 콜론 정의를 ''즉시 단어''로 표시하여 컴파일 의미를 해석 의미로 대체한다.[36] `POSTPONE`은 즉시 단어의 컴파일 의미를 현재 정의에 추가한다. Forth-83은 `COMPILE`과 `[COMPILE]`을 사용하여 비 즉시/즉시 단어 컴파일을 강제한다.

` :NONAME`은 익명 단어를 정의하고 ''실행 토큰''을 남긴다. `EXECUTE`는 실행 토큰을 받아 의미를 수행하고, `COMPILE,`은 실행 토큰을 컴파일한다. `'` (작은 따옴표)는 단어의 실행 토큰을 반환한다.[37] `(` (괄호)와 `\` (백슬래시)는 주석을 나타낸다.

4. 3. 데이터 객체

Forth에서 데이터 객체는 `VARIABLE`, `CONSTANT`, `CREATE` 등의 정의 낱말을 사용하여 만들 수 있다.

  • `VARIABLE`: 초기화되지 않은 단일 셀 메모리 위치를 지정한다. `VARIABLE`로 정의된 낱말(인스턴스)을 실행하면 스택에 해당 메모리 주소가 반환된다.
  • `CONSTANT`: 특정 값을 나타낸다. `CONSTANT`로 정의된 낱말을 실행하면 해당 값이 스택에 반환된다.
  • `CREATE`: 특정 메모리 위치를 지정한다. `CREATE`로 정의된 낱말을 실행하면 해당 메모리 공간의 시작 주소가 스택에 반환된다. 이 위치에 문자열이나 다른 초기화된 값을 저장할 수 있다.


예시:

```forth

VARIABLE myVar \ myVar라는 이름의 변수를 생성

10 CONSTANT myConst \ myConst라는 이름의 상수를 10으로 정의

CREATE myArray 10 ALLOT \ myArray라는 이름의 10셀 공간을 생성

```

Forth는 또한 사용자가 직접 정의 낱말을 만들어 새로운 데이터 객체를 정의할 수 있는 기능을 제공한다. 이러한 방식으로 순환 버퍼, I/O 포트의 명명된 비트, 자동 인덱싱된 배열 등을 만들 수 있다.[38]

Forth에서 정의된 데이터 객체는 전역 범위를 가진다. 다른 프로그래밍 언어에서 지역 변수가 제공하는 기능은 주로 데이터 스택을 통해 제공된다. Forth 프로그래밍 스타일에서는 명명된 데이터 객체를 다른 언어에 비해 적게 사용하는 경향이 있다. 명명된 데이터 객체는 주로 여러 낱말이나 작업에서 공유되는 데이터를 저장하는 데 사용된다.[57]

Forth는 데이터 타입의 사용을 강제하지 않는다. 프로그래머는 값을 가져오고 저장하거나 데이터에 대한 다른 작업을 수행하기 위해 적절한 연산자를 사용해야 한다.[38]

5. 활용 분야

포스는 임베디드 시스템, 부트로더 및 펌웨어, 천문학 및 우주 개발 등 여러 분야에서 활용된다.

포스는 천문 및 우주 응용 분야에서 특별한 위치를 차지한다.[5] 1978년 인텔 8086 칩의 첫 상주 모니터가 포스였으며, 1984년 매킨토시 128K용 첫 상주 개발 시스템은 MacFORTH였다.[13]

스타워즈: 새로운 희망 제작에 포스가 사용되었다. 존 다이크스트라와 그의 팀은 인더스트리얼 라이트 & 매직에서 Dykstraflex 모션 제어 시스템을 제어하는 데 포스를 사용했는데, 이 시스템은 우주 전투 장면과 데스 스타에서의 참호 공격 시퀀스 등 복잡하고 정밀한 카메라 움직임을 만드는 데 중요한 역할을 했다. 포스는 이러한 복잡한 작업에 필요한 효율성과 실시간 처리 능력 때문에 선택되었다.

아타리는 포스로 작성된 애니메이션 데모를 통해 아타리 8비트 컴퓨터의 기능을 시연했다.[6] 일렉트로닉 아츠는 1980년대에 ''Worms?''(1983),[7] ''어드벤처 건설 세트''(1984),[8] ''Amnesia''(1986),[9] ''스타플라이트''(1986),[1] ''Lords of Conquest''(1986) 등 포스로 작성된 여러 비디오 게임을 출시했다. MacFORTH로 작성된 로봇 코딩 게임 ''ChipWits''(1984)도 있었다.[10]

애쉬튼-테이트의 RapidFile(1986)과 페이퍼백 소프트웨어 인터내셔널의 VP-Planner[11](1983)는 로터스 1-2-3와 경쟁하며 포스로 작성되었다.

캐논 캣(1987)은 시스템 프로그래밍에 포스를 사용했다. 록웰은 포스 커널이 내장된 단일 칩 마이크로컴퓨터를 생산했다. ASYST는 PC에서 측정 및 제어를 위한 포스 확장 기능이었다.[12]

5. 1. 임베디드 시스템

록웰은 포스 커널이 내장된 R65F11 및 R65F12와 같은 단일 칩 마이크로컴퓨터를 생산했으며[12], 이러한 칩들은 임베디드 시스템 개발에 널리 사용되었다.

5. 2. 부트로더 및 펌웨어

애플, IBM, , OLPC XO-1에서 사용된 Open Firmware 부트 롬에는 포스 환경이 포함되어 있다.[5] 포스는 새로운 하드웨어를 부팅하는 데 자주 사용되었다. 1978년 새로운 인텔 8086 칩의 첫 번째 상주 모니터였으며, MacFORTH는 1984년 매킨토시 128K용 첫 번째 상주 개발 시스템이었다.[13] FreeBSD 운영 체제의 [http://ficl.sourceforge.net/ FICL]-based first stage 부트 컨트롤러도 포스를 사용한다.

5. 3. 천문학 및 우주 개발

포스는 천문 및 우주 응용 분야에서 특별한 위치를 차지한다.[5] 임베디드 시스템 분야에서도 뚜렷한 발자취를 남겼으며, 애플, IBM, , OLPC XO-1에서 사용된 Open Firmware 부트 롬에는 포스 환경이 포함되어 있다.

포스는 새로운 하드웨어를 부팅하는 데 자주 사용되었다. 1978년 새로운 인텔 8086 칩의 첫 번째 상주 모니터가 포스였으며, 1984년 매킨토시 128K용 첫 번째 상주 개발 시스템은 MacFORTH였다.[13]

포스 프로그래밍 언어는 ''스타워즈: 새로운 희망'' 제작에도 사용되었다. 특히 존 다이크스트라와 그의 팀이 인더스트리얼 라이트 & 매직에서 제작한 Dykstraflex 모션 제어 시스템을 제어하는 데 사용되었는데, 이 시스템은 우주 전투 장면과 데스 스타에서의 참호 공격 시퀀스에 필요한 복잡하고 정밀한 카메라 움직임을 만드는 데 중요한 역할을 했다. Dykstraflex 시스템은 카메라 움직임을 미리 프로그래밍하여 여러 번의 촬영에서 정확하게 반복할 수 있게 했으며, 이는 실사 영상과 모델 샷 및 기타 시각 효과를 결합하는 데 매우 중요했다. 포스는 이러한 복잡한 작업을 위해 필요한 효율성과 실시간 처리를 처리할 수 있는 능력 때문에 선택되었다.

이러한 이식성, 효율적인 메모리 사용, 짧은 개발 기간 및 빠른 실행 속도로 인해 포스는 오늘날에도 여전히 많은 임베디드 시스템에서 사용되고 있다.

5. 4. 기타 응용 분야

포스는 임베디드 시스템 분야에서 활용되었으며, 애플, IBM, 의 Open Firmware 부트 롬에 사용되었다.[5] 1978년에는 인텔 8086 칩의 첫 상주 모니터였고, MacFORTH는 1984년 매킨토시 128K용 첫 상주 개발 시스템이었다.[13]

아타리는 포스로 작성된 애니메이션 데모를 통해 아타리 8비트 컴퓨터의 기능을 시연했다.[6] 일렉트로닉 아츠는 1980년대에 ''Worms?''(1983),[7] ''어드벤처 건설 세트''(1984),[8] ''Amnesia''(1986),[9] ''스타플라이트''(1986),[1] ''Lords of Conquest''(1986) 등 포스로 작성된 여러 비디오 게임을 출시했다. MacFORTH로 작성된 로봇 코딩 게임 ''ChipWits''(1984)도 있었다.[10]

애쉬튼-테이트의 RapidFile(1986)과 페이퍼백 소프트웨어 인터내셔널의 VP-Planner[11](1983)는 로터스 1-2-3와 경쟁하며 포스로 작성되었다.

캐논 캣(1987)은 시스템 프로그래밍에 포스를 사용했다.

록웰은 포스 커널이 내장된 단일 칩 마이크로컴퓨터를 생산했다. ASYST는 PC에서 측정 및 제어를 위한 포스 확장 기능이었다.[12]

포스는 ''스타워즈: 새로운 희망'' 제작에 사용되었다. 존 다이크스트라와 그의 팀은 인더스트리얼 라이트 & 매직에서 Dykstraflex 모션 제어 시스템을 제어하는 데 포스를 사용했다. 이 시스템은 우주 전투 장면과 데스 스타에서의 참호 공격 시퀀스 등 복잡하고 정밀한 카메라 움직임을 만드는 데 중요한 역할을 했다. Dykstraflex는 카메라 움직임을 미리 프로그래밍하여 여러 번 촬영해도 정확하게 반복할 수 있게 했다. 이는 실사 영상과 모델 샷, 기타 시각 효과를 결합하는 데 매우 중요했다. 포스는 이러한 복잡한 작업에 필요한 효율성과 실시간 처리 능력 때문에 선택되었다.

6. 구현체


  • Gforth - GNU 프로젝트에 의한 이식성이 높은 Forth 구현[39]
  • [http://www.forth.com/ Forth Inc.] - Forth 개발자들에 의해 설립되었으며, 데스크톱용 (SwiftForth) 및 임베디드용 (SwiftX) Forth 솔루션을 판매하고 있다.
  • [http://www.mpeforth.com/ MPE Ltd.] - 고도로 최적화된 데스크톱 (VFX) 및 임베디드 Forth 컴파일러
  • Open Firmware - Forth에 준거하는 부트 로더와 펌웨어의 규격
  • [https://home.hccnet.nl/anij/nof/noforth.html noForth] - 플래시 마이크로컨트롤러(MSP430 & Risc-V)용 Forth 구현
  • pForth - C로 작성된 이식 가능한 Forth
  • SP-Forth - 러시아 Forth 관심 그룹(RuFIG)의 Forth 구현
  • Swift Forth - Forth, Inc.의 머신 코드 생성 구현
  • VFX Forth - 네이티브 코드 Forth 최적화
  • [https://littlemanstackmachine.org/firth.html Firth] - Little Man Stack Machine 컴퓨터용 Forth의 어댑테이션.
  • [http://www.forth.org/compilers.html Freely available implementations]
  • [http://www.forth.org/commercial.html Commercial implementations]
  • 플랫폼별로 정리된 더 최신의 목록은 [http://wiki.forthfreak.net/index.cgi?ForthSystems Forth systems]

7. 관련 언어


  • Mind는 Forth를 기반으로 단어를 일본어로 기술할 수 있도록 만들어진 언어이다.
  • Mops는 Forth를 기반으로 객체 지향으로 개선한 Mac OS용 개발 시스템이다. Palo Alto Shipping Co.가 제작한 Mach1(まっはわん)은 객체 지향과 멀티 스레드를 지원한다.
  • Open Firmware의 셸 언어는 Forth 기반이다. Sun의 OpenBoot PROM(OBP) 및 CHRP 기반 Power Macintosh의 부팅용 펌웨어는 Open Firmware의 구현이다.
  • Ficl은 Forth를 기반으로 한 명령 언어이며, FreeBSD의 부트로더 구현에 사용된다.
  • 1985년경, 의류 회사인 JUN(주식회사 준)이 개발한 컴퓨터 그래픽 시스템 4D-Box의 운영 언어 0DL은 Forth였다.
  • 포스트스크립트는 제작자에 따르면 영향을 받은 것은 아니라고 하지만, Forth와 마찬가지로 후위 표기법으로 스택 지향적이며, 유사성이 지적되는 경우가 있다.
  • 텔레스크립트는 제너럴 매직사가 개발·제공했던 차세대 에이전트 지향의 통신용 프로그래밍 언어이며, Forth 아키텍처로 구현되었다.[1]

참조

[1] 웹사이트 Starflight https://www.filfre.n[...] 2014-10-28
[2] 웹사이트 NASA applications of Forth https://web.archive.[...]
[3] 웹사이트 Intersil's RTX processors and Forth software controlled the successful Philae landing https://mpeforth.com[...] 2014-10-13
[4] 웹사이트 Here comes Philae! Powered by an RTX2010 https://www.cpushack[...] 2014-10-12
[5] 웹사이트 Space Related Applications of Forth http://forth.gsfc.na[...] 2007-09-04
[6] 웹사이트 Atari In-Store Demonstration Program http://www.atarimani[...]
[7] 웹사이트 David Maynard: Software Artist https://www.software[...]
[8] 팟캐스트 Time Warp: Episode 9 - Stuart Smith https://appletimewar[...] 2020-09-23
[9] 서적 Amnesia Remembered: Reverse Engineering a Digital Artifact https://www.berghahn[...] Berghahn Books
[10] 웹사이트 FORTH Programming Language (Going FORTH) https://chipwits.com[...] 2023-04-08
[11] 웹사이트 FORTH GETS ITS OWN SPECIAL INTEREST GROUP https://techmonitor.[...] 1989-02-06
[12] 간행물 Up and Running with Asyst 2.0 MacMillan Software Co. 1987
[13] 서적 History of programming languages---II Association for Computing Machinery 1996
[14] 웹사이트 Forth - The Early Years http://www.colorfort[...] 2006-06-03
[15] 학술지 The Evolution of FORTH, an Unusual Language https://archive.org/[...] 1980-08
[16] 웹사이트 ANS 1994 Specification, Annex C ("Perspective") https://www.taygeta.[...]
[17] 학술지 The Forth Language https://archive.org/[...]
[18] 웹사이트 Forth family tree and timeline https://www.complang[...]
[19] 웹사이트 GraFORTH Language Manual https://archive.org/[...] Insoft 1982
[20] 웹사이트 The Forth-79 Standard https://www.physics.[...]
[21] 웹사이트 The Forth-83 Standard https://forth.source[...]
[22] 웹사이트 Programming Languages: Forth https://www.taygeta.[...] ANSI technical committee X3J14 1994-03-24
[23] 웹사이트 Standard Forth (ANSI INCITS 215-1994) Reference http://quartus.net/f[...] Quartus Handheld Software 2005-09-13
[24] 웹사이트 Restoring the original source code for FORTH on the IBM 1130 https://rescue1130.b[...] 2018-03-02
[25] 서적 Starting Forth https://www.forth.co[...] Prentice-Hall
[26] harvnb
[27] harvnb
[28] harvnb
[29] 웹사이트 Build Your Own Assembler, Part 2: a 6809 Forth Assembler https://www.bradrodr[...]
[30] 웹사이트 Multitasking 8051 CamelForth https://www.bradrodr[...]
[31] 웹사이트 MOVING FORTH, Part 8: CamelForth for the 6809 https://www.bradrodr[...] 1995-07
[32] 웹사이트 Motorola Background Debugging Mode Driver for Windows NT http://www.zeecube.c[...] 1998-12-21
[33] 학술지 Developing a tethered Forth model ACM Press 1991-03
[34] 웹사이트 Ulrich Hoffmann's preForth slides http://www.euroforth[...]
[35] 웹사이트 Ulrich Hoffmann's preForth http://www.euroforth[...]
[36] 간행물 1987
[37] 간행물 1987
[38] 서적 "{{harvnb|Brodie|1987}}"
[39] 논문 The ASYST Software for Scientific Computing 1987
[40] 웹사이트 NASA applications of Forth http://forth.gsfc.na[...]
[41] 웹사이트 Forth Success Stories http://www.forth.org[...] 2006-06-09
[42] 웹사이트 Space Related Applications of Forth http://forth.gsfc.na[...] 2007-09-04
[43] 웹사이트 Forth Chips Page http://www.ultratech[...] 2006-06-09
[44] 웹사이트 The Evolution of Forth http://www.forth.com[...] ACM SIGPLAN History of Programming Languages Conference 1993-04-01
[45] 웹사이트 Forth - The Early Years http://www.colorfort[...] 2006-06-03
[46] 웹사이트 The Forth-79 Standard https://mywebspace.w[...] 2010-03-19
[47] 웹사이트 The Forth-83 Standard http://forth.sourcef[...] 2010-03-19
[48] 웹사이트 Programming Languages: Forth http://www.taygeta.c[...] ANSI technical committee X3J14 2006-06-03
[49] 간행물 The Forth Language 1980
[50] 웹사이트 B.Y.O.ASSEMBLER http://www.zetetics.[...] 2006-06-19
[51] 웹사이트 MULTITASKING 8051 CAMELForth http://www.zetetics.[...] 2006-06-19
[52] 웹사이트 MOVING FORTH http://www.zetetics.[...] 2006-06-19
[53] 웹사이트 Motorola Background Debugging Mode Driver for Windows NT http://www.zeecube.c[...] 2006-06-19
[54] 웹사이트 Developing a tethered Forth model http://portal.acm.or[...] ACM Press 2006-06-19
[55] 문서 マルチスレッド・プログラミングとは異なる
[56] 웹사이트 Implementation Issues for Superinstructions in Gforth http://dec.bournemou[...] 2006-06-19
[57] 서적 Starting Forth Prentice-Hall 1987
[58] 서적 Thinking Forth Prentice-Hall 1984
[59] 웹사이트 washing machine example http://www.forth.com[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com