포스(프로그래밍 언어)
Forth (programming language)| 패러다임 | 절차적, 스택 지향적, 반사적, 연계적 |
|---|---|
| 설계자 | 찰스 H. 무어 |
| 첫 등장 | 1970; 전 ( |
| 타이핑 규율 | 무타입 |
| 파일 이름 확장명 | .fs, .fth, .fs |
| 주요 구현 | |
| 스위프트포스(Forth, Inc.) Gforth (GNU 프로젝트) VFX 포스(마이크로프로세서 엔지니어링) | |
| 영향을 받은 | |
| 대형 시스템, Lisp, APL의 Burroughs 대형 시스템 | |
| 영향받은 | |
| 요인, 기쁨, 포스트스크립트, RPL, REBOL | |
포스는 찰스 H. "Chuck" Moore가 디자인하고 1970년에 다른 프로그래머들이 처음 사용했던 절차적이고 스택 지향적인 프로그래밍 언어와 인터랙티브 환경이다.비록 약어는 아니지만, 초기에는 그 언어의 이름이 FOST로 모든 대문자로 표기되는 경우가 많았지만, 현재는 FOST가 더 흔하다.
포스는 컴파일러와 통합 멀티태스킹 명령 셸을 결합하여 사용자가 워드라고 불리는 서브루틴을 통해 상호작용한다.전체 프로그램을 다시 작성하거나 다시 시작하지 않고 단어를 정의, 테스트, 다시 정의 및 디버깅할 수 있다.변수와 기본 연산자를 포함한 모든 통사적 요소는 단어로 정의된다.스택은 단어 사이에 매개 변수를 전달하기 위해 사용되며, 폴란드어 역 표기법 스타일로 이어진다.
포스가 존재했던 대부분의 경우, 표준 기법은 바이트 코드보다 더 빨리 해석될 수 있는 스레드 코드로 컴파일하는 것이었다.Fort의 초기 이점 중 하나는 크기였다: 컴파일러, 편집자 및 사용자 프로그램을 포함한 전체 개발 환경이 8비트 또는 이와 유사하게 제한된 시스템에서 메모리에 맞을 수 있다는 것이었다.더 이상 공간에 제약을 받지 않고, 다른 언어 컴파일러처럼 최적화된 기계 코드를 생성하는 현대적인 구현이 있다.
포스는 오픈 펌웨어 부트 로더, 필라에 우주선과 같은 우주 응용[1] 프로그램 [2][3]및 하드웨어와의 상호작용을 수반하는 기타 임베디드 시스템에 사용된다.포스 기본 시스템을 만드는 상대적인 단순성은 포스가 1986년 베스트셀러 비디오 게임인 일렉트로닉 아츠 스타플라이트를 구현하는 데 사용한 관습과 같은 많은 개인적이고 독점적인 변형으로 이어졌다.[4]무료 소프트웨어 Gforth 구현은 상업적으로 지원되는 여러 시스템과 마찬가지로 적극적으로 유지된다.
후에 무어는 컴파일된 포스 유사 코드를 직접 실행하기 위한 일련의 마이크로프로세서를 개발했고, cmForth와 colorForth를 포함한 포스 개념에 기초하여 더 작은 언어들을 실험했다.
사용하다
포스는 임베디드 시스템의 역사뿐만 아니라 천문학적, 우주적 응용[5] 분야에서도 틈새를 가지고 있다.Apple, IBM, Sun 및 OLPC XO-1에서 사용하는 Open Firmware 부트 ROM에는 Forth 환경이 포함되어 있다.
포스는 종종 새로운 하드웨어를 생산하는데 사용되었다.포스는 1978년 신형 인텔 8086 칩에 대한 최초의 상주 소프트웨어였고, 맥포스는 1984년 매킨토시 128K의 최초의 상주 개발 시스템이었다.[6]
주식회사 아타리는 아타리 400대와 800대의 컴퓨터 기능을 백화점에서 선보이기 위해 포스(Fours)에 쓰인 정교한 애니메이션 데모를 사용했다.[7]1980년대에 출판된 Electronic Arts의 두 개의 가정용 컴퓨터 게임은 Forwes? (1983)[8]와 Starflight (1986)로 쓰여졌다.[4]캐논 캣(1987)은 포스(Forth)를 시스템 프로그래밍에 사용한다.
Rockwell은 상주하는 Forth 커널인 R65F11과 R65F12를 가진 단일 칩 마이크로컴퓨터를 생산했다.AUSEST는 PC의 측정과 제어를 위한 Force 확장이다.[9]
역사
포스는 1968년부터 지속적으로 발전해 온 찰스 H. 무어의 개인 프로그래밍 시스템에서 발전했다.[6]포스는 미국 국립 전파천문관측소(NRAO)에서 엘리자베스 라더(Elizabeth Later)를 시작으로 1970년대 초 다른 프로그래머들에게 처음 노출됐다.[6]NRAO에서 일한 후, 찰스 무어와 엘리자베스 라더는 1973년에 FOST, Inc.를 설립하여 향후 10년 동안 FOST 시스템을 수십 개의 다른 플랫폼으로 정제하고 포팅했다.
포스는 1968년 "4세대(차세대) 소프트웨어에 대해 통역기를 들고 있는 파일에 4번째(다음)라는 레이블이 붙었지만 IBM 1130 운영체제는 파일 이름을 5자로 제한했다"[10]는 이유로 그렇게 이름 붙여졌다.무어는 포스를 제3세대 프로그래밍 언어, 즉 "4세대" 하드웨어용 소프트웨어 컴파일-링크-고(link-lo-go)의 후계자로 보았다.
포스, Inc.의 마이크로 포스는 1976년부터 인텔 8080, 모토로라 6800, 질로그 Z80, RCA 1802 마이크로프로세서를 위해 개발되었다.마이크로 포스는 1978년 6502와 같은 다른 아키텍처들을 위한 포스 시스템을 개발하기 위해 취미 활동가들에 의해 나중에 사용되었다.포스 이익 그룹은 1978년에 결성되었다.[11]그것은 대부분의 가정용 컴퓨터 제조업체에 자체 버전인 FIG-Forth를 홍보하고 배포했다.
포스는 1980년대 초 마이크로컴퓨터의 제한된 메모리에 잘 맞았기 때문에 인기가 있었다.[12]언어를 쉽게 구현할 수 있어서 많은 구현이 가능했다.[13]영국 목성 ACE 가정용 컴퓨터는 포스 사를 ROM에 상주하는 운영체제에 탑재하고 있다.Insoft GraFORth는 Apple II용 그래픽 확장 기능을 갖춘 포스 버전이다.[14]
일반 관행은 1979년과 1983년에 각각 사실상의 표준 FOX-79와[15] FOX-83에서[16] 성문화되었다.이러한 표준은 ANSI에 의해 1994년에 통합되었고, 일반적으로 ANS Forward라고 불린다.[17][18]
2018년 현재, FOX의 원본 1130 버전에 대한 소스가 복구되었고, 현재 복원되거나 에뮬레이트된 1130 시스템에서 실행되도록 업데이트되고 있다.[19]
개요
포스는 단어라고 불리는 작고 단순한 기능의 사용을 강조한다.더 큰 작업에 대한 단어는 각각 뚜렷한 하위 작업을 수행하는 많은 작은 단어들을 요구한다.큰 포스 프로그램은 단어들의 계층 구조다.이러한 단어들은 스택 메커니즘을 통해 암묵적으로 통신하는 구별되는 모듈로서 독립적으로 프로토타입 제작, 구축 및 테스트될 수 있다.포스 코드의 최고 수준은 신청서에 대한 영어 설명과 유사할 수 있다.포스는 메타 어플리케이션 언어: 문제 중심 언어를 만드는 데 사용할 수 있는 언어라고 불려왔다.[20]
포스는 데이터 스택의 명시적 사용과 Hewlett-Packard의 계산기에서 일반적으로 사용되는 역폴란드 표기법에 의존한다.RPN에서 연산자는 피연산자 사이에 배치되는 보다 일반적인 인픽스 표기법과 반대로 피연산자 뒤에 배치된다.포스트픽스 표기법은 언어를 구문 분석하거나 확장하기 쉽게 만든다; 포스의 유연성은 정적 BNF 문법을 부적절하게 만들고, 단일 컴파일러를 가지고 있지 않다.컴파일러를 확장하려면 문법을 수정하고 기본 구현을 변경하는 대신 새로운 단어만 작성하면 된다.
RPN을 사용하면 수학 식 결과를 얻을 수 있다.(25 * 10 + 50)다음과 같은 방법으로:
25 10 * 50 + CR . 300 네 알겠습니다 먼저 숫자 25와 10을 스택에 넣는다.
그 단어.*스택에서 상위 2개의 숫자를 가져와 곱한 다음 제품을 스택 위에 다시 놓으십시오.
그리고 나서 50이라는 숫자가 쌓인다.
그 단어.+합계를 밀어내고 상위 두 값을 추가한다. CR(반복) 새 라인에서 출력을 시작하십시오.마지막으로.결과를 인쇄하다모든 것이 성공적으로 완료되었으므로, Fours 시스템은 인쇄한다.OK.[21]
포스의 구조적 특징도 스택 기반이다.예를 들면 다음과 같다.
: 플로어5 ( n - n' ) DUP 6 < IF 드롭 5 기타 1 - 그럼 ; 결장은 새로운 정의의 시작을 나타내며, 이 경우(again, 단어는 서브루틴에 사용되는 용어)라는 신조어가 있다.FLOOR5괄호 안에 있는 텍스트는 설명으로, 이 단어가 스택에 숫자를 기대하며 (스택에) 변경된 숫자를 반환할 것임을 알려준다.
서브루틴은 다음 명령을 사용한다.DUP스택의 번호를 중복한다.6스택 상단에 6을 미십시오.<스택의 상위 두 숫자 비교(6과)DUPed input) 및 해당 값을 참 또는 거짓 값으로 대체한다.IF참 또는 거짓 값을 사용하여 명령 직후 또는 명령으로 건너뛰도록 선택하십시오.ELSE;DROP스택의 값을 무시한다.5스택 상단에 5를 푸시한다.THEN조건을 달다
그FLOOR5워드는 3번째 연산자 '를 사용하여 C 프로그래밍 언어로 쓰여진 이 함수와 동등하다.:'
인트로 바닥5(인트로 v) { 돌아오다 (v < 6) ? 5 : (v - 1); } 이 함수는 다음과 같이 더욱 간결하게 쓰여진다.
: 플로어5 ( n - n' ) 1- 5 맥스. ; 이 작업은 다음과 같이 실행할 수 있다.
1 플로어5 CR . 5 네 알겠습니다 8 플로어5 CR . 7 네 알겠습니다 먼저 숫자(1 또는 8)를 스택에 밀어 넣는다.FLOOR5라고 불리는데, 이것은 다시 숫자를 터뜨리고 결과를 밀어낸다. CR출력을 새 라인으로 이동(하드웨어, 이것은 가독성을 위해 여기에 있을 뿐이다).마지막으로, 다음 연락처로 전화하십시오..결과를 뻥튀기해서 인화하다
시설.
포스의 문법은 공식적인 명세서가 없다.대신 단순한 알고리즘에 의해 정의된다.통역자는 사용자 입력 장치에서 입력된 줄을 읽고, 공백으로 구분 기호를 사용하여 단어를 구문 분석한다. 일부 시스템은 공백 문자를 추가로 인식한다.통역사가 단어를 찾으면 사전에서 단어를 찾아본다.단어가 발견되면 통역사는 단어와 연관된 코드를 실행한 다음 입력 스트림의 나머지 부분을 구문 분석하기 위해 돌아온다.단어가 발견되지 않으면 단어는 숫자로 간주되고 숫자로 변환하여 스택에 밀어넣기 위해 시도되며, 성공하면 통역자는 입력 스트림을 계속 구문 분석한다.그렇지 않으면 조회와 숫자 변환이 모두 실패하면 통역은 단어를 인식하지 못함을 나타내는 오류 메시지에 이어 단어를 출력하고 입력 스트림을 플러시하고 새로운 사용자 입력을 기다린다.[22]
새로운 단어의 정의는 단어로 시작한다.:단어로 끝나다;(상호-하드웨어).예를 들어,
: X DUP 1+ . . ; 그 말을 편찬할 것이다.X그리고 사전에서 그 이름을 찾을 수 있게 한다.입력하여 실행할 때10 X콘솔에서 이것은 인쇄할 것이다.11 10.[23]
대부분의 포스 시스템에는 프로세서의 설비를 이용하여 단어를 쓰는 조립자가 포함된다.포스 조립자는 지시보다 명령의 매개변수가 앞서는 역 폴란드어 구문을 사용하는 경우가 많다.일반적인 역방향 폴란드 조립자는 스택에 피연산자를 준비하고 니모닉은 마지막 단계로서 전체 명령을 메모리에 복사한다.포스 조립자는 본래 매크로 조립자여서 포스 시스템에서의 역할(예: 데이터 스택 포인터로 사용되는 레지스터의 "dsp")에 따라 레지스터의 별칭을 쉽게 정의할 수 있다.[24]
운영 체제, 파일 및 멀티태스킹
대부분의 포스 시스템은 마이크로소프트 윈도우즈, 리눅스 또는 유닉스 버전과 같은 호스트 운영 체제에서 실행되며 소스 및 데이터 파일에 호스트 운영 체제의 파일 시스템을 사용한다. ANSI 포스 표준은 I/O에 사용되는 단어를 설명한다.현대의 모든 Forth 시스템은 소스에 포함되더라도 소스에 대해 일반 텍스트 파일을 사용한다.상주 컴파일러가 있는 임베디드 시스템은 시리얼 라인을 통해 소스를 얻는다.
전통적인 Forth 시스템은 전통적으로 운영 체제나 파일 시스템을 사용하지 않는다.파일에 코드를 저장하는 대신, 소스 코드는 실제 디스크 주소에 쓰여진 디스크 블록에 저장된다.그 단어.BLOCK1K 크기의 디스크 공간 블록의 수를 데이터를 포함하는 버퍼의 주소로 변환하기 위해 사용되며, 이는 포스 시스템에 의해 자동으로 관리된다.1990년대 중반 이후 블록 사용이 드물어졌다.호스트 시스템에서 이러한 블록도 어떤 경우에도 일반 파일에 할당된다.
멀티태스킹(Multitasking)은 일반적으로 사용할 수 있지만(멀티태스킹 단어와 지원은 ANSI 포스 표준에서 다루지 않는다).그 단어.PAUSE현재 태스크의 실행 컨텍스트를 저장하고, 다음 태스크를 찾고, 실행 컨텍스트를 복원하는 데 사용된다.각 작업에는 자체 스택, 일부 제어 변수의 개인 복사본 및 스크래치 영역이 있다.교환 작업은 간단하고 효율적이다. 그 결과 포스 멀티태스커는 인텔 8051, 아트멜 AVR, TI MSP430과 같은 매우 단순한 마이크로컨트롤러에서도 사용할 수 있다.[25]
기타 비표준 시설은 호스트 OS나 윈도우 시스템에 대한 호출을 위한 메커니즘을 포함하며, 많은 시설은 운영체제가 제공하는 스케줄링을 채용하는 확장을 제공한다.전형적으로 그들은 독립형 포스의 단어들과 더 크고 다른 단어들을 가지고 있다.PAUSE태스크 생성, 중단, 파괴 및 우선 순위 변경에 대한 단어.
자체 컴파일 및 교차 컴파일
모든 소스 코드를 가진 완전한 기능을 갖춘 Forth 시스템은 Forth 프로그래머들에 의해 일반적으로 메타 컴파일이나 자기호스팅이라고 불리는 기술인 자신을 컴파일할 것이다(이 용어가 일반적으로 정의되는 메타 컴파일화와 정확히 일치하지는 않지만).일반적인 방법은 컴파일된 비트를 메모리에 저장하는 소수의 단어들을 재정의하는 것이다.컴파일러의 단어는 메모리의 버퍼 영역으로 리디렉션될 수 있는 특별히 명명된 버전의 가져오기 및 저장 버전을 사용한다.버퍼 영역은 코드 버퍼와 다른 주소에서 시작되는 메모리 영역을 시뮬레이션하거나 액세스한다.이러한 컴파일러는 대상 컴퓨터의 메모리와 호스트(컴파일링) 컴퓨터의 메모리에 모두 액세스하는 단어를 정의한다.[26]
코드 공간에 대해 가져오기 및 저장소 작업이 재정의된 후, 컴파일러, 조립자 등은 가져오기 및 저장이라는 새로운 정의를 사용하여 다시 컴파일된다.이것은 컴파일러와 통역기의 모든 코드를 효과적으로 재사용한다.그러면 포스 시스템의 코드가 컴파일되지만, 이 버전은 버퍼에 저장된다.메모리의 버퍼는 디스크에 기록되며, 테스트를 위해 메모리에 임시로 로드할 수 있는 방법이 제공된다.새 버전이 효과가 있을 것으로 보이면 이전 버전에 걸쳐 작성된다.
그러한 컴파일러의 수많은 변화는 다양한 환경에 존재한다.임베디드 시스템의 경우, 원래 컴파일 컴퓨터에서 단어 이름과 기타 실행되지 않는 부분을 유지하면서 크로스 컴파일이라고 알려진 기술인 다른 컴퓨터에 코드를 대신 쓸 수 있다.그러한 포스 컴파일러의 최소 정의는 바이트를 가져오고 저장하는 단어와 포스 워드를 실행하도록 명령하는 단어다.원격 포트를 작성할 때 종종 가장 많은 시간이 소요되는 부분은 가져오기, 저장 및 실행을 구현하기 위한 초기 프로그램을 구축하는 것이지만, 현대의 많은 마이크로프로세서는 이 작업을 제거하는 통합 디버깅 기능(예: Motorola CPU32)을 가지고 있다.[27]
언어의 구조
포스의 기본 데이터 구조는 "단어"를 실행 가능한 코드나 명명된 데이터 구조에 매핑하는 "사전"이다.사전은 일반적으로 NULL 포인터인 센티넬 값이 발견될 때까지 최신(가장 최근에) 정의된 단어에서 가장 오래된 단어로 이어지는 링크와 함께 링크된 목록의 트리로 메모리에 배치된다.컨텍스트 스위치는 목록 검색을 다른 리프에서 시작하게 한다.연결된 목록 검색은 분기가 주 트렁크로 병합되어 결국 루트인 보초까지 되돌아갈 때 계속된다.몇 개의 사전이 있을 수 있다.메타 컴필레이션과 같은 드문 경우 사전이 분리되어 독립적일 수 있다.그 효과는 네임스페이스의 네임스페이스와 유사하며 문맥에 따라 키워드를 과부하할 수 있다.
정의된 단어는 일반적으로 이름 필드(NF)와 링크 필드(LF)로 구성된 헤드와 본문으로 구성되며 코드 필드(CF)와 파라미터 필드(PF)로 구성된 본문으로 구성된다.
사전 항목의 머리와 본문은 서로 인접하지 않을 수 있으므로 별도로 취급한다.예를 들어, 포스 프로그램이 새로운 플랫폼에 대해 재컴파일될 때, 몸은 새로운 플랫폼으로 가는 동안 머리는 컴파일된 컴퓨터에 남아 있을 수 있다.일부 환경(예: 임베디드 시스템)에서는 헤드가 불필요하게 메모리를 점유한다.그러나 일부 교차 컴파일러는 대상 자체가 대화형 포스를 지원할 것으로 예상될 경우 표적에 헤드를 넣을 수 있다.[28]
사전 항목
사전 항목의 정확한 형식은 규정되어 있지 않으며, 구현은 다양하다.그러나 정확한 크기와 순서는 다를 수 있지만 특정 구성 요소는 거의 항상 존재한다.구조로 설명되는 사전 항목은 다음과 같이 보일 수 있다.[29]
구조화하다 바이트: 깃발을 꽂다 \단어 이름 길이 문자 배열: 이름을 붙이다 \ 이름의 런타임 길이를 컴파일 시 알 수 없음 주소: 이전의 \ 링크 필드, 이전 단어의 역방향 ptr 주소: 암호어 \ 이 단어를 실행하는 코드 ptr 모든 어레이: 매개 변수 필드 \ 알 수 없는 길이의 데이터, 단어 또는 opcode 종말의 직언 이름 필드는 단어 이름의 길이를 나타내는 접두사로 시작한다.단어 이름의 문자 표현은 그 접두사를 따른다.포스의 특정 구현에 따라 정렬을 위한 NUL('\0') 바이트가 하나 이상 있을 수 있다.
링크 필드에는 이전에 정의된 단어에 대한 포인터가 포함되어 있다.포인터는 상대적 변위 또는 다음 맏형제를 가리키는 절대 주소일 수 있다.
코드 필드 포인터는 매개변수 필드의 코드 또는 데이터를 실행할 단어의 주소 또는 프로세서가 직접 실행할 기계 코드의 시작이 될 것이다.콜론 정의 워드의 경우, 코드 필드 포인터는 반환 스택에 현재 포스 명령 포인터(IP)를 저장할 워드를 가리키고, 워드의 실행을 계속하기 위해 IP를 새 주소로 로드한다.이것은 프로세서의 통화/반환 지침과 동일하다.
컴파일러의 구조
컴파일러 자체는 단일화된 프로그램이 아니다.시스템에서 볼 수 있고 프로그래머가 사용할 수 있는 포스 단어로 구성된다.이것은 프로그래머가 특별한 목적을 위해 컴파일러의 말을 바꿀 수 있게 해준다.
이름 필드의 "컴파일 시간" 플래그는 "컴파일 시간" 동작이 있는 단어에 대해 설정된다.대부분의 간단한 단어들은 명령행에 입력되어 있든, 코드에 내장되어 있든 간에 동일한 코드를 실행한다.컴파일러는 이것을 컴파일할 때 단순히 단어에 코드나 나사형 포인터를 배치한다.[23]
컴파일 시간 단어의 전형적인 예로는 다음과 같은 제어 구조가 있다.IF그리고WHILE. 포스의 거의 모든 제어 구조와 컴파일러의 거의 모든 컴파일러는 컴파일 타임 워드로 구현된다.조건부 리턴과 같이 몇 가지 구현에서만 발견되는 일부 드물게 사용되는 제어 흐름 단어와는 별도로 포스의 모든 제어 흐름 단어들은 편집 중에 실행되어 분기 주소와 함께 원시 단어의 다양한 조합을 컴파일한다.예를 들어.IF그리고WHILE, 그리고 그것들과 일치하는 단어들은 설정한다.BRANCH(각각 분기) 및?BRANCH(스택에서 값을 입력하고 잘못된 경우 분기를 실행).계수된 루프 제어 흐름 단어는 유사하게 작동하지만 카운터와 함께 작동하는 원시 단어의 조합을 설정하는 등의 작업을 한다.컴파일 중에 데이터 스택은 분기 주소의 제어 구조 밸런싱, 내포 및 백패치를 지원하는 데 사용된다.코드 조각:
... DUP 6 < IF 드롭 5 기타 1 - 그럼 ... 정의 내에서 다음과 같은 순서로 컴파일될 것이다.
... DUP 불을 켰다. 6 < 브랜치 5 드롭 불을 켰다. 5 지점 3 불을 켰다. 1 - ... 다음 이후의 숫자BRANCH상대 점프 주소를 나타냄 LIT데이터 스택에 "csv" 숫자를 밀어넣기 위한 원시 단어 입니다.
컴파일 상태 및 해석 상태
그 단어.:(iii) 이름을 매개 변수로 구문 분석하여 사전 항목(대장 정의)을 만들고 컴파일 상태를 입력한다.통역사는 사용자 입력 장치에서 공간 구분 단어를 계속 읽는다.단어가 발견되면 통역자는 해석 의미론 대신 단어와 연관된 컴파일 의미론을 실행한다.단어의 기본 컴파일 의미론들은 해석 의미론을 현재의 정의에 추가하는 것이다.[23]
그 단어.;(1998년) 현재 정의를 완료하고 해석 상태로 복귀한다.컴파일 의미와 디폴트가 다른 단어의 예다.해석의 의미론;(semi-colon), 대부분의 제어 흐름 단어 및 몇 개의 다른 단어는 ANS Forwards에서 정의되지 않았으며, 이는 상호 작용 명령행에서가 아니라 정의의 내부에서만 사용되어야 함을 의미한다.[23]
통역자 상태는 단어로 수동으로 변경할 수 있다.[(좌측) 및]각각 해석 상태 또는 컴파일 상태로 들어가는 (우측).이 단어들은 단어와 함께 사용될 수 있다.LITERAL컴파일 중에 값을 계산하고 계산된 값을 현재 콜론 정의에 삽입한다. LITERAL데이터 스택에서 개체를 가져오고 데이터 스택에 개체를 배치하기 위해 현재 콜론 정의에 의미론을 추가하는 컴파일 의미론을 가지고 있다.
ANS 포스에서는 통역관의 현재 상태를 국기에서 읽을 수 있다. STATE컴파일 상태에 있을 때 참 값을 포함하고 그렇지 않을 경우 거짓 값을 포함한다.이를 통해 통역자의 현 상태에 따라 변하는 행동을 가진 이른바 국가 스마트 어구의 구현이 가능하다.
즉문
그 단어.IMMEDIATE가장 최근의 결장 정의를 즉시 단어로 표시하여, 편찬 의미론을 해석 의미론으로 효과적으로 대체한다.[30]즉석 단어는 일반적으로 컴파일되지 않고 컴파일 중에 실행되지만, 이것은 어느 상태나 프로그래머에 의해 오버라이드될 수 있다. ;단어의 예다.ANS 포스에서는,POSTPONE이름을 매개 변수로 삼고 명명된 단어의 컴파일 의미 체계를 현재 정의에 추가한다. 단어가 즉시 표시되었더라도 말이다.포스-83에 정의된 별개의 단어COMPILE그리고[COMPILE]비문어 및 직언어 편찬을 각각 강제한다.
이름 없는 단어 및 실행 토큰
ANS 포스에서는 이름 없는 단어들을 단어로 정의할 수 있다.:NONAME다음 단어들을 다음 단어까지 요약한다.;실행 토큰을 데이터 스택에 남겨두십시오.실행 토큰은 컴파일된 의미론에 대해 C 프로그래밍 언어의 함수 포인터와 유사한 불투명한 핸들을 제공한다.
실행 토큰은 변수에 저장할 수 있다.그 단어.EXECUTE데이터 스택에서 실행 토큰을 가져오고 관련 의미 체계를 수행한다.그 단어.COMPILE,(1998년) 데이터 스택에서 실행 토큰을 가져오고 관련 의미론을 현재 정의에 추가한다.
그 단어.'(iiii) 단어의 이름을 매개 변수로 사용하고 데이터 스택의 해당 단어에 연결된 실행 토큰을 반환한다.해석 상태에서,' RANDOM-WORD EXECUTE와 같다RANDOM-WORD.[31]
단어 및 주석 구문 분석
그 단어들은:(iii),POSTPONE,'(iiii)는 데이터 스택 대신 사용자 입력 장치에서 자신의 인수를 가져가는 단어의 구문 분석 예다.또 다른 예는 단어다.((파렌) 다음 오른쪽 괄호까지 다음 단어를 읽고 무시하며, 콜론 정의에 주석을 넣는 데 사용된다.비슷하게, 그 단어는\(백슬래시)는 현재 줄의 끝까지 이어지는 코멘트에 사용된다.정확하게 구문 분석하려면((파렌) 및\(백슬래시)는 다음 주석 텍스트에서 공백으로 구분해야 한다.
코드 구조
대부분의 포스 시스템에서 코드 정의 본문은 기계 언어 또는 스레드 코드의 어떤 형태로 구성된다.비공식 FIG 표준(Forth Interest Group, Forth Interest Group)을 따르는 원래 포스는 TIL(Threaded Derificationive Language)이다.이것을 간접 스레드 코드라고도 부르지만, 직사 스레드 및 서브루틴 스레드 포스츠도 근대에 유행하게 되었다.SwiftForth, VFX Fors, iForth와 같은 가장 빠른 현대식 Forts는 Forth를 기본 기계 코드로 컴파일한다.
데이터 객체
단어가 변수 또는 다른 데이터 객체인 경우, CF는 단어를 만든 정의 단어와 연관된 런타임 코드를 가리킨다.정의 단어는 특징적인 "defining action"(사전 항목 작성+데이터 공간 할당 및 초기화 가능)을 가지며, 또한 이 정의 단어에 의해 구성된 단어 클래스의 인스턴스(instance)의 동작을 명시한다.예를 들면 다음과 같다.
VARIABLE- 초기화되지 않은 단일 셀 메모리 위치 이름 지정.의 인스턴스 동작
VARIABLE스택에 주소를 반환한다. CONSTANT- 값 이름 지정(인수로 지정됨)
CONSTANT인스턴스 동작은 값을 반환한다. CREATE- 위치 이름 지정, 이 위치에 공간 할당 또는 문자열 또는 기타 초기화된 값을 포함하도록 설정할 수 있음.인스턴스(instance) 동작은 이 공간의 시작 주소를 반환한다.
Force는 또한 프로그래머가 새로운 응용 프로그램 특정 정의 단어를 정의할 수 있는 기능을 제공하며, 사용자 정의 행동과 인스턴스 행동 모두를 명시한다.일부 예로는 원형 버퍼, I/O 포트의 명명된 비트, 자동 인덱싱된 어레이 등이 있다.
이러한 단어와 유사한 단어로 정의되는 데이터 개체는 범세계적이다.다른 언어로 로컬 변수에 의해 제공되는 함수는 포스(Forth)의 데이터 스택에 의해 제공된다(Forth(Forth)도 실제 로컬 변수를 가지고 있다.포스 프로그래밍 스타일은 다른 언어에 비해 명명된 데이터 객체를 거의 사용하지 않는다. 일반적으로 그러한 데이터 객체는 여러 단어나 작업(다중 작업 구현에서)에 의해 사용되는 데이터를 포함하는데 사용된다.[32]
포스는 데이터 유형 사용의 일관성을 강요하지 않는다; 데이터를 가져오고 저장하거나 다른 작업을 수행하기 위해 적절한 연산자를 사용하는 것은 프로그래머의 책임이다.
예
"안녕, 월드!"
: 안녕 ( -- ) CR ." 안녕, 월드!" ; HELLOY <cr> 안녕, 월드!
그 단어.CR(캐리지 리턴)은 다음과 같은 출력이 새 라인에 표시되도록 한다.구문 분석 단어."(점-점-점)은 이중으로 구분된 문자열을 읽고 현재 정의에 코드를 추가하여 구문 분석된 문자열이 실행 시 표시되도록 한다.단어를 구분하는 공간 문자."현악기서Hello, World!문자열의 일부로 포함되지 않음.파서가 인지할 수 있도록 해야 한다.."포스어로
표준 포스 시스템도 통역이 되며, 포스 콘솔에 다음과 같은 코드 파편을 입력하면 동일한 출력을 얻을 수 있다.
CR .(안녕, 월드!) .((dot-paren)은 괄호 안에 있는 문자열을 구문 분석하여 표시하는 단어로,라는 말과 같이."공백 문자 구분.(로부터Hello, World!문자열의 일부가 아니다.
그 단어.CR인쇄할 텍스트보다 먼저 온다.관례상, 포스 통역관은 새로운 라인에서 출력을 시작하지 않는다.또한 관례에 따라 통역은 앞줄 끝에서 입력을 기다린다.ok즉석의포스 사에는 묵시적인 "부시 버퍼(flush-buffer)" 작용이 없다.CR때때로 다른 프로그래밍 언어에서 그렇듯이.
컴파일 및 해석의 혼합 상태
여기 단어의 정의가 있다.EMIT-Q실행될 때 단일 문자를 방출되는 경우Q:
: EXPORT-Q 81 ( 'Q' 문자에 대한 ASCII 값 ) 방출 ; 이 정의는 의 ASCII 값을 사용하기 위해 작성되었다.Q문자(81) 직접.괄호 사이의 텍스트는 주석이며 컴파일러에 의해 무시된다.그 단어.EMIT데이터 스택에서 값을 가져와서 해당 문자를 표시한다.
다음 재정의:EMIT-Q그 말을 사용하다.[(좌측 방향),](우측).CHAR그리고LITERAL임시로 인터프리터 상태로 전환하려면 의 ASCII 값을 계산하십시오.Q문자, 컴파일 상태로 돌아가 계산된 값을 현재 콜론 정의에 추가하십시오.
: EXPORT-Q [ CHAR Q ] 리터럴 방출 ; 구문 분석 단어CHAR공백으로 구분된 단어를 매개변수로 사용하고 첫 문자 값을 데이터 스택에 배치한다.그 단어.[CHAR]의 즉각적인 버전이다.CHAR. 사용[CHAR], 에 대한 정의 예EMIT-Q다음과 같이 다시 쓰일 수 있다:
: EXPORT-Q [CHAR] Q 방출 ; \ 단일 문자 'Q' 표시 사용된 정의\(백슬래시) 설명 코멘트.
둘 다CHAR그리고[CHAR]ANS 포스(Ans Forward)에 사전 정의되어 있다.사용.IMMEDIATE그리고POSTPONE,[CHAR]다음과 같이 정의될 수 있었다.
: [CHAR] CHAR 연기하다 리터럴 ; 즉시 완전한 RC4 암호 프로그램
1987년에 Ron Rivest는 RSA Data Security, Inc.를 위한 RC4 암호 시스템을 개발했다.코드는 매우 간단하며 대부분의 프로그래머가 다음 설명에서 쓸 수 있다.
우리는 256바이트의 배열을 가지고 있는데, 모두 다르다.어레이를 사용할 때마다 2바이트를 스와핑하여 변경된다.스왑은 각각 초기 0인 카운터 i와 j에 의해 제어된다.새 i를 얻으려면 1을 추가하십시오.새 j를 얻으려면 새 i에 배열 바이트를 추가한다.i와 j에서 어레이 바이트를 교환하십시오.코드는 i와 j의 배열 바이트 합계의 배열 바이트다.이것은 암호화할 일반 텍스트의 바이트 또는 암호 해독할 암호 텍스트로 XORed된 것이다.배열을 먼저 0 ~ 255로 설정하여 초기화한다.그런 다음 i와 j를 사용하여 단계를 밟아, i에서 어레이 바이트와 키 바이트를 추가하고, i와 j에서 어레이 바이트를 스와핑하여 새 j를 얻는다.마지막으로, i와 j는 0으로 설정된다.모든 추가는 modulo 256이다.
다음 Standard Force 버전은 코어 및 코어 확장 단어만 사용한다.
0 가치를 매기다 ii 0 가치를 매기다 jyj 0 가치를 매기다 키애드르 0 가치를 매기다 키렌 만들다 SARay 256 할당하다 \ 상태 배열 256바이트 : 키어레이 키렌 모드의 키애드르 ; : get_byte + c@ ; : set_byte + c! ; : as_byte 255 그리고 ; : reset_ij 0 토 ii 0 토 jyj ; : i_update 1 + as_byte 토 ii ; : j_update ii SARay get_byte + as_byte 토 jyj ; : swap_s_ij jyj SARay get_byte ii SARay get_byte jyj SARay set_byte ii SARay set_byte ; : rc4_init (KeyAddr KeyLen -- ) 256 분 토 키렌 토 키애드르 256 0 DO i i SARay set_byte 루프 reset_ij 시작 ii 키어레이 get_byte jyj + j_update swap_s_ij ii 255 < 그러는 동안 ii i_update 반복 reset_ij ; : rc4_byte ii i_update jyj j_update swap_s_ij ii SARay get_byte jyj SARay get_byte + as_byte SARay get_byte xor ; 이는 코드를 테스트하는 여러 방법 중 하나이다.
육각의 만들다 AKey 61 c 8A c 63 c D2 c FB c : 시험하다 크래그 0 DO rc4_byte . 루프 크래그 ; AKey 5 rc4_init 2C F9 4C EE DC 5 시험하다 \ 출력: F1 38 29 C9 DE 구현
포스는 구현이 간단하고 표준 참조 구현이 없기 때문에 수많은 버전의 언어가 있다.데스크탑 컴퓨터 시스템의 표준 품종(POSIX, Microsoft Windows, MacOS)을 지원하는 것 외에도, 이들 Forth 시스템 중 다수는 다양한 임베디드 시스템을 대상으로 한다.1994년 ANS 포스 표준에 부합하는 시스템 중 몇 가지가 여기에 열거되어 있다.
- AZEST, 데이터 수집 및 분석을 위한 포스톱 시스템
- 문명 붕괴를 통해 마이크로컨트롤러를 프로그래밍하기 위한 OS, A Forth 운영 체제 및 도구 축소
- Gforth, GNU 프로젝트의 휴대용 ANS Forward 구현
- Mecrisp-Stellaris, MSP430, ARM(다양한 맛), 사이프레스 PSOC, ESP8266, RISC-V 및 J1과 같은 사용자 지정 CPU를 포함한 다수의 마이크로컨트롤러에 대한 네이티브 코드 포스.소개 및 도커 기반 데모를 참조하십시오.
- ANS Force 기반 부팅 로더 및 펌웨어 표준인 Open Firmware
- pForth, C로 쓰여진 휴대용 포스
- SP-Forth, ANS Forst 구현 러시아 포스 이익 그룹(RuFIG)
- Swift Fors, Inc.의 기계 코드 생성 구현.
- VFX Forth, 기본 코드 Forth 최적화
- Win32Forth, Windows 지향, XP 이후 모든 Windows 버전에서 실행
참고 항목
- RTX2010, 기본 실행 CPU
참조
- ^ 포스 NASA 애플리케이션(원래 NASA 서버가 더 이상 실행되지 않음, archive.org에서 복사)
- ^ "Intersil's RTX processors and Forth software controlled the successful Philae landing" (PDF). MicroProcessor Engineering Limited. October 13, 2014.
- ^ "Here comes Philae! Powered by an RTX2010". The CPU Shack Museum. October 12, 2014. Retrieved May 23, 2017.
- ^ a b Maher, Jimmy (October 28, 2014). "Starflight". The Digital Antiquarian. Retrieved May 23, 2017.
- ^ "Space Related Applications of Forth". Archived from the original on 2010-10-24. Retrieved 2007-09-04.
- ^ a b c Rather, Elizabeth D.; Colburn, Donald R.; Moore, Charles H. (1996) [1993]. "The Evolution of Forth". In Bergin, Thomas J.; Gibson, Richard G. (eds.). History of Programming Languages—II. Association for Computing Machinery. pp. 625–670. doi:10.1145/234286.1057832. ISBN 0201895021.
- ^ "Atari In-Store Demonstration Program". Atari Mania.
- ^ Maynard, David S. "David Maynard: Software Artist".
- ^ Campbell 외 연구진, "Astest 2.0으로 업 앤 런닝", MacMillan Software Co., 1987
- ^ Moore, Charles H (1991). "Forth - The Early Years". Archived from the original on 2006-06-15. Retrieved 2006-06-03.
- ^ "ANS 1994 Specification, Annex C ("Perspective")". taygeta.com.
- ^ "The Forth Language", BYTE Magazine, 5 (8), 1980
- ^ M. Anton Ertl. "Forth family tree and timeline".
- ^ Lutus, Paul (1982). "GraFORTH Language Manual". archive.org. Insoft.
- ^ "The Forth-79 Standard" (PDF). Archived (PDF) from the original on 2019-04-12.
- ^ "The Forth-83 Standard".
- ^ "Programming Languages: Forth". ANSI technical committee X3J14. 24 March 1994. Retrieved 2006-06-03.
- ^ "Standard Forth (ANSI INCITS 215-1994) Reference" (PDF). Quartus Handheld Software. 13 September 2005. Retrieved 2013-04-14.
- ^ Claunch, Carl (2018-03-02). "Restoring the original source code for FORTH on the IBM 1130". rescue1130. Retrieved July 30, 2018.
- ^ Brodie, Leo. "Starting Forth". Forth dot com. Forth, Inc. Retrieved July 14, 2020.
- ^ 브로디 1987, 페이지 20
- ^ 브로디 1987 페이지 14
- ^ a b c d 브로디 1987 페이지 16
- ^ Rodriguez, Brad. "B.Y.O.ASSEMBLER". Archived from the original on 2006-06-23. Retrieved 2006-06-19.
- ^ Rodriguez, Brad. "MULTITASKING 8051 CAMELFORTH" (PDF). Archived from the original (PDF) on 2006-06-22. Retrieved 2006-06-19.
- ^ Rodriguez, Brad (July 1995). "MOVING FORTH". Archived from the original on 2006-06-23. Retrieved 2006-06-19.
- ^ Shoebridge, Peter (1998-12-21). "Motorola Background Debugging Mode Driver for Windows NT". Archived from the original on 2007-06-06. Retrieved 2006-06-19.
- ^ Martin, Harold M. (March 1991). "Developing a tethered Forth model". ACM Sigforth Newsletter. ACM Press. 2 (3): 17–19. doi:10.1145/122089.122091. S2CID 26362015.
- ^ 브로디 1987 페이지 200–2
- ^ 브로디 1987, 페이지 273
- ^ 브로디 1987 페이지 199
- ^ "Under The Hood". Brodie 1987. p. 241.
To summarize, there are three kinds of variables: System variables contain values used by the entire Forth system. User variables contain values that are unique for each task, even though the definitions can be used by all tasks in the system. Regular variables can be accessible either system-wide or within a single task only, depending upon whether they are defined within
OPERATORor within a private task. - ^ Hary, David; Oshio, Koichi; Flanagan, Steven D. (1987). "The ASYST Software for Scientific Computing". Science. 236 (4805): 1128–32. doi:10.1126/science.236.4805.1128. JSTOR 1699106. PMID 17799670. S2CID 30463062.
추가 읽기
- Biancuzzi, Federico; Warden, Shane (2009). "4. [A conversation with Chuck Moore]". Masterminds of Programming, Conversations with the Creators of Major Programming Languages. O'Reilly. ISBN 978-0-596-51517-1.
- Brodie, Leo (1987). Starting Forth (2nd ed.). Prentice-Hall. ISBN 978-0-13-843079-5.
- Brodie, Leo (2007). Marcel Hendrix (ed.). Starting Forth. Marlin Ouverson (Web ed.). FORTH, Inc. Retrieved 2007-09-29.
- Brodie, Leo (2004). Paysan, Bernd (ed.). Thinking Forth (PDF Online book). ISBN 978-0-9764587-0-8. Retrieved 2008-09-15.
- Conklin, Edward K.; Rather, Elizabeth D.; et al. (8 September 2007). Forth Programmer's Handbook (3rd ed.). BookSurge Publishing. p. 274. ISBN 978-1-4196-7549-2.
- Rather, Elizabeth D. (2000). Forth Application Techniques (spiral bound). Forth Inc. p. 158. ISBN 978-0-9662156-1-8.
- Pelc, Stephen F. (2005). Programming Forth (spiral bound). MicroProcessor Engineering Ltd. p. 188.
- Kelly, Mahlon G.; Spies, Nicholas (1986). FORTH: A Text and Reference. Prentice-Hall. ISBN 978-0-13-326331-2.
- Koopman, Jr, Philip J. (1989). Stack Computers: The New Wave. Ellis Horwood. ISBN 978-0-7458-0418-7.
- Pountain, Dick (1987). Object-oriented Forth: Implementation of Data Structures. Harcourt Brace Jovanovich. ISBN 978-0-12-563570-7.
- Payne, William (19 December 1990). Embedded Controller Forth for the 8051 Family. Elsevier. p. 528. ISBN 978-0-12-547570-9.
- Winfield, Alan (1983). The Complete Forth. John Wiley. ISBN 978-0471882350.
- Baglioni, Gio Federico (1983). Forth per VIC20 e CBM64. Jackson. ISBN 978-88-7056-141-8.
| 위키미디어 커먼즈에는 포스(프로그래밍 언어)와 관련된 미디어가 있다. |
| Wikibooks에는 다음과 같은 주제의 책이 있다.포스 |
