FOCAL(프로그래밍 언어)

FOCAL (programming language)
초점
패러다임필수적
가족JOSS
설계자리처드 메릴
개발자DEC
처음 등장한1968년, 54년(연장)
영향을 받다
JOSS
영향받은
기본 플러스

FORMUL CALCulator[2](대수적 [1]언어로 온라인 계산을 공식화하기 위한 Acronym)는 JOSS(Open Shop System) 기반인터랙티브프로그래밍 언어이며 주로 DEC(Digital Equipment Corporation) Programmed Data Processor(PDP) 시리즈에서 사용됩니다.

FOCAL은 지원되는 명령어와 언어의 일반적인 구문에서 JOSS와 매우 유사합니다.파서를 단순화하기 위해 범위나 사용자 정의 함수와 같은 JOSS의 많은 고급 기능이 제거되었다는 점이 다릅니다.일부 예약된 단어(키워드)는 고유한 첫 글자로 시작하도록 이름이 변경되었습니다.이것에 의해, 유저는 1 문자의 스테이트먼트를 사용해 프로그램을 입력할 수 있게 되어, 메모리의 필요성이 한층 경감됩니다.이것은 PDP-8에서 중요한 고려사항이었습니다.이러한 고려사항은 대부분의 경우 수 킬로바이트(KB)로 제한됩니다.

JOSS 및 이후 BASIC과 마찬가지로 PDP-8의 FOCAL은 라인 에디터, 인터프리터 및 입출력 루틴을 포함하는 완전한 환경이었다.패키지 전체의 이름은 FOCAL-8로, PDP-5PDP-12에서도 동작했습니다.PDP-11로 이식된 결과 FOCAL-11은 기본 운영 체제인 RT-11에 의존하여 파일 지원과 편집을 제공했습니다.언어 정의는 FOCAL-69와 매우 약간 수정된 FOCAL-71로 두 번 업데이트되었다.인텔 8080 포트도 사용할 수 있습니다.

FOCAL은 초기 비디오 게임 Hamurabi와 Lunar Lander의 오리지널 버전이 쓰인 언어로 유명하다.둘 다 나중에 BASIC으로 이식되었고, 거기서 훨씬 [3]더 많이 알려지게 되었습니다.FOCAL은 PDP 플랫폼 외부에서는 인기가 없었고 VAX-11로 이행하는 동안 거의 사라졌습니다.소련에서는 PDP-11 클론이 교육용 및 가정용 컴퓨터로 사용되면서 강력한 부활을 이루었습니다.

역사

JOSS

JOSS는 RAND Corporation의 일회성 JONNIAC 컴퓨터로 1963년 5월에 출시되었습니다.LAND에서는 사용이 급속히 증가하여 1953년에 제조된 이 기계는 곧 기능을 상실했습니다.JONNIAC는 1966년에 해체되었고, JOSS는 새로 구입한 PDP-6, Digital Equipment Corporation(DEC) 최초의 "대형" 머신에 재실장되었습니다.사용이 계속 증가하여 1970년에는 전국에서 500~600명의 사용자가 이 시스템을 사용하고 있었으며, 방에서 방으로 이동하거나 콘센트를 [4]꽂아 빠르게 접근할 수 있는 모바일 컴퓨터 단말기와 같은 몇 가지 혁신이 이루어졌습니다.

JOSS는 영향력이 컸다.그것은 바로 시분할이 도입되고 있을 때 나타났다.인간과 기계의 상호작용에 상당한 관심이 있었고 컴퓨터는 더 폭넓게 사용되고 있었다.당시의 대부분의 시분할 운영체제는 사용자 계정과 파일 관리에 중점을 두고 사용자가 직접 프로그래밍을 하도록 한 반면, JOSS는 파일 편집과 프로그래밍 언어를 하나의 패키지로 제공했습니다.RAND는 업계의 [4]많은 사람들에게 그 시스템을 보여 주었다.

초점

PDP-6는 DEC의 메인프레임으로 JOSS는 전력과 메모리 용량을 최대한 활용했습니다.DEC 프로그래머는 JOSS에 관심이 있었지만 대부분의 머신은 JOSS를 실행하는 데 필요한 전력 근처에도 없었습니다.Richard Merrill이 작성한 FOCAL은 PDP-8 및 DEC 라인업의 다른 12비트 머신의 훨씬 제한된 메모리 공간에서 실행할 수 있도록 필요에 따라 JOSS에서 기능을 삭제했습니다.이를 위해 문을 해석하는 데 필요한 임시 데이터(상태)의 양을 줄이기 위해 대대적인 변경이 이루어졌습니다.이 결정의 눈에 띄는 효과 중 하나는 조건부가 모든 문장에 적용될 수 있는 JOSS와 달리 브랜치에만 사용할 수 있다는 것이다.

또 다른 눈에 띄는 변화는 키워드를 재배치하여 각각 고유한 문자로 시작하는 것이었습니다.이것에 의해, 파서가 간략해졌습니다.파서는 코드의 행에서 명령어의 첫 글자만을 읽으면 되고, 그 후 다음 공백 문자로 넘어갈 수 있었습니다.그런 다음 각 엔트리에 1자씩 있는 내부 키워드 목록과 비교합니다.반면 JOSS는 명령어 전체를 읽고 완전한 단어를 포함하는 목록과 비교할 때까지 계속 읽어야 했다.이 변경으로 파서의 메모리가 절약되었을 뿐만 아니라 사용자는 해당 문자만 입력하여 메모리를 절약할 수 있게 되어 소스 코드의 크기가 작아졌습니다.

PDP-8 펀치 테이프(69년 7월 9일 FOCAL-69 테이프 포함)

FOCAL의 첫 번째 버전은 1968년에 PDP-8용으로 출시되었습니다.그 다음해에 업데이트된 버전이 나왔는데, 이것은 나중에 FOCAL-69로 알려지게 되었다.PDP-5PDP-12를 포함한 12비트 시리즈의 다른 머신에 이식되었을 때, 이 시스템 전체를 FOCAL-8이라고 부릅니다.메모리 사용이 매우 효율적이기 때문에 널리 사용되었으며, 이러한 시스템에서는 종종 수 킬로바이트(KB)로 크게 제한되었습니다.같은 FOCAL-11이 RT-11PDP-11 상에서 동작했습니다.

프로세서 테크놀로지는 인텔 8080 기반의 Altair 8800 시스템용으로 Lunar Lander를 탑재한8k FOCAL 버전도 제공하고 있습니다.이것은 테이프 복사 비용용으로 제공되었으며, 소스 코드는 다른 [5]구매와 함께 무료로 제공되었습니다.

기본의

DEC 머신에서는 FOCAL이 인기를 끌고 있는 반면, 다른 플랫폼에서는 BASIC이 더 인기 있는 대안이 되고 있습니다.1960년대 후반에는 여러 회사가 DEC의 미니컴퓨터의 거점에 진출하여 BASIC의 시분할 버전을 실행하는 유사한 기계를 판매하였다.그 중 주목할 만한 은 HP Time-Shared [6]BASIC을 실행하는 HP 2100 시리즈입니다.

데이비드 H. Ahl은 최근 DEC의 PDP-8 그룹에 합류했는데, 이 회사는 이 기계를 교육 환경에 판매하는 데 관심을 갖게 되었다.교육 시장에서 BASIC의 인기로 인해, 특히 미네소타 교육 컴퓨팅 컨소시엄의 BASIC 프로그램 라이브러리가 증가함에 따라,[6] Ahl은 장점에도 불구하고 FOCAL을 사용하여 기계를 판매하는 것이 어렵다는 것을 알게 되었습니다.그가 나중에 언급했듯이:

DEC의 FOCAL 언어는 대부분의 면에서 BASIC과 동등하고 일부에서는 더 우수했지만, 한 가지 큰 단점이 있었습니다. DEC는 다른 컴퓨터 제조업체에 라이선스하기를 꺼렸습니다.FOCAL은 GE, 허니웰, HP 및 기타 컴퓨터에서 사용 가능한 BASIC과 힘겨운 싸움을 벌이고 있었다.
소니나 베타맥스 같은 상황으로 끝난 것 같아요.소니는 "베타맥스는 우리의 것이며 VHS보다 더 나은 포맷"이라고 말했다.하지만 JVC는 "VHS와 도시바가 있습니다.야, 너 그거 쓸래?좋아요. 거의 [6]공짜로 라이선스를 드리겠습니다."

Ahl은 플랫폼용 BASIC 시스템을 직접 제작하고 나중에 브루클린에서 싱글 프로그래머로 알게 된 회사를 고용하여 4kWord PDP-8 버전을 제작했습니다.DEC는 터미널을 갖춘 PDP-8 패키지 버전과 "EduSystem" 라인업으로 PDP-8 패키지 버전을 판매하기 시작했습니다.이 시리즈에서는 더 큰 시스템이 확장되었습니다.BASIC, 그리고 경우에 따라서는 FOCAL과 FORTRAN도 있습니다.또한 일부 PDP-11 기반의 EduSystems도 [7]작성되었습니다.

이후 Ahl은 프로그램을 FOCAL에서 BASIC으로 이식하기 시작했는데, 특히 Sumer Game(Hamurabi로 개명), Lunar Lander 버전 및 많은 소규모 FOCAL 데모입니다.그는 자신의 포트와 외부 프로그래머의 제출물을 조합하여 1973년 DEC가 101 BASIC 컴퓨터 게임을 퍼블리싱할 수 있는 충분한 자료를 모았습니다.그 책은 즉각적인 성공을 거두었고 [8][6]결국 1975년까지 세 권의 인쇄를 거쳤다.

1970년대 중반까지 BASIC은 모든 DEC 기계의 표준 기능이 되었고 FOCAL의 사용은 사라졌다.[8]

소비에트 연방의 부활

PDP-11은 1970년대 군사 목적으로 소련에서 복제되었다.1980년대에는 LSI-11과 유사한 단일 칩 변형이 생산되어 일련의 PDP-11 호환 가정용 컴퓨터가 탄생했습니다.여러 모델 중 가장 눈에 띄는 것은 1985년에 출시된 Electronika BK 시리즈이다.이것들은 처음에는 FOCAL과 함께 ROM [9]카트리지에 포함되어 있었지만, BASIC 카트리지는 옵션의 애드온이었습니다.이후 모델에서는 [10]기본적으로 BASIC이 제공되었습니다.

언어

다음 설명은 FOCAL-8 언어 참조 [11]설명서에서 볼 수 있는 FOCAL-69를 기반으로 합니다.

직접 및 간접 모드

FOCAL은 명령줄 인터페이스를 통한 상호작용을 위해 JOSS 모델을 따랐습니다.이것에 의해, 유저는 곧바로 「다이렉트 모드」로 커맨드를 입력할 수 있게 되었습니다.또, 유저가 고유하면 프로그램에 추가되고, 같은 번호가 이전에 [12]사용되고 있었을 경우는 기존의 코드를 덮어쓸 수도 있습니다.

작동 방법은 BASIC의 "즉시 모드" 대 "프로그램 모드"와 유사합니다.JOSS는 프로그램 및 다이렉트 명령을 모두 사용자 작업 공간의 일부로 저장하고 로드하는 것과 대조됩니다.이것에 의해, JOSS는 회선 번호가 없는 커맨드를 사용할 수 있게 되었습니다.Form정의 및 기타 작업입니다.FOCAL에는 이 기능이 없기 때문에 로드 및 저장해야 하는 명령어는 다음과 같은 다른 프로그램 모드명령어 옵션이 되었습니다.Type를 클릭합니다.[12]

프로그램 스테이트먼트

FOCAL 프로그램의 모든 라인은 라인 번호로 시작해야 합니다.JOSS와 마찬가지로 회선번호는 마침표로 구분된2개의 2자리 정수로 이루어진 고정 소수점 번호입니다.FOCAL-8의 유효한 회선 번호는 1.01 ~31.99입니다인쇄 시, 사용WRITE, 베이직과 동등한 FOCALLIST선행 0이 추가되며 1.10은 다음과 같이 출력됩니다.01.10이것에 의해, 출력시에 모든 행 번호가 5 자리수가 되어, 모든 행 번호가 정렬됩니다.예를 들어, 이러한 행을 참조하는 문에는 선행 0이 필요하지 않습니다.GOTO 1.10를 클릭합니다.[13]

기간의 왼쪽에 있는 번호를 "그룹 번호"라고 합니다.그룹은 Fortran이나 BASIC과 같은 언어에는 없는 일정 수준의 코드 구성을 제공합니다.이러한 기능의 주된 용도는 서브루틴으로서 그룹을 사용하는 것으로, 이 서브루틴은 다음과 같이 호출할 수 있습니다.DO,예를들면,DO 5그룹 5에 기재된 서브루틴으로 이동합니다.편집자는 편집 시간 동안 이러한 기능을 사용하기도 했습니다. 예를 들어, 다음과 같은 작업을 수행할 수 있습니다.WRITE 2그룹 2의 코드 목록을 작성한다.ERASE 4그룹 [13]4의 모든 행을 삭제합니다.

모든 행은 행 [13]번호 뒤에 명령 키워드로 시작해야 합니다.옵션인 BASIC과 같이 "default 명령어"의 개념은 없습니다.LET진술.여러 문을 세미콜론으로 구분하여 한 줄에 배치할 수 있습니다.통상, FOR [14]루프의 경우를 제외하고, 스테이트먼트가 다른 행에 있었을 때와 동작은 다르지 않습니다.

명령어

물어보다

ASK명령어(약어 A)는 문자열 및 변수 목록을 가져와 문자열을 에코하고 사용자 입력을 [15]변수에 저장합니다.BASIC과 동등INPUT.

01.01 "이름", 01.02 "좌표", X, Y 01.03 "A1", "A1", "OMEGA", "W", "T0", "T0", "댐핑 팩터"

사용자가 숫자를 입력하지 않고 텍스트를 입력하면 시스템은 초기 문자를 "A"=1, "B"=2 등의 숫자로 변환합니다.

댓글

COMMENT명령어(약어 C)는 [16]주석을 작성합니다.BASIC과 동등REM.

01.01 코멘트: Richard Merrill의 Sumer 게임

하다

DO명령어(약어 D)는 실행을 서브루틴으로 분기합니다.BASIC과 동등합니다.GOSUB서브루틴은 그룹번호 또는 회선번호 중 하나로 참조됩니다.회선번호가 지정되어 있는 경우, 그 1개의 회선이 실행되고 나서, 그 후에 스테이트먼트로 돌아옵니다.DO행번호가 지정되지 않은 경우 블록의 첫 번째 행부터 실행이 시작되어 블록의 끝에 도달하거나 블록의 끝에 도달할 때까지 계속됩니다.RETURN가 검출되었습니다. RETURN가 필요한 것은 그룹으로부터의 조기 복귀뿐이며,[17] 그룹의 마지막에 필요한 것은 아닙니다.

01.15 DO 7.24 01.16 DO 8

위해서

FOR명령어(약어 F)는 for 루프를 구현합니다.3개의 인수를 지정하면 첫 번째 값은 루프 변수의 초기값, 두 번째 값은 증분값, 세 번째 값은 루프의 종료값입니다.값이 2개만 지정되어 있는 경우 첫 번째 값은 초기값이고 두 번째 값은 종료값이며 증분값은 1로 설정됩니다.이것은 FORTRAN의 패턴입니다.DOBASIC이 아닌 루프FOR여기서 increment는 존재하는 경우 마지막 값입니다.

한 줄에 여러 개의 문장이 독립되어 있는 언어의 다른 부분과 대조적으로,FOR는 항상 종료에 도달하기 전에 행에서 이어지는 문을 실행하고 다음 행으로 넘어갑니다.따라서 루프는 1개의 회선상에 존재해야 합니다.또는 다른 방법으로 서브루틴을 호출하여DOBASIC과 동등한 것은 없습니다.NEXT를 클릭합니다.[14]

01.01 X=1,10,X형! 01.02 X=0,10,100,DO 2

루프 예시:

01.10 "얼마나 빌리고 싶으십니까?", 01.20 "몇 년 동안?", 01.30 조건 = 4.0, 5.5, 10; DO 2.0 01.40 종료 02.10 이자 설정*(Rate/100)*기간 02.20 "금리", "이자", "이자", 이자!

에 가다

GOTO명령어(약어 G)는 지정된 행 번호로 [17]프로그램 실행을 점프합니다.이것은 BASIC의 같은 이름의 문장과 동일합니다.FOCAL에서GOTOBASIC과 같이 실행을 시작하기 위해서도 사용됩니다.RUN단, 이 사용법에서는 다음과 같이 기술하고 있습니다.GO대신GOTO기본 명령어가 동일함에도 불구하고 말입니다.

01.05 GOTO 1.01 02.90 타입!!"다시 시도하세요.GOTO 1.1

한다면

IF명령어(약어 I)는 식의 기호에 기초한 조건부 브랜치를 제공합니다.숫자식 뒤에 IF 명령어는 1 ~3 행의 번호를 사용할 수 있습니다.식이 0보다 작을 경우 실행은 첫 번째 줄 번호로 분기합니다.0과 같으면 두 번째 줄 번호로 분기합니다.0보다 크면 세 번째 줄 번호로 분기합니다.언어에는 보다 크거나 같거나 작거나 같은 상대 연산자가 없었습니다.X가 5를 넘으면 분기하려면 X와 [18]5를 비교해야 합니다.

02.20 IF (25-25) 2.4, 2.3, 2.4 03.01 IF (X) 3.1, 3.02, 3.1

IF는 첫 번째 줄 번호 뒤에 세미콜론(또는 줄의 끝)을 배치하여 짧은 형식으로 만들 수 있습니다.예를 들어 다음과 같습니다.

02.20 IF (X) 1.8; 타입 "Q" 02.30 IF (X) 1.8, 2.50 02.40 타입 "P"

이 경우 2.20의 테스트에서는 테스트가 음성이면 프로그램이 1.8행으로 점프하고, 그렇지 않으면 계속하여 콘솔에 "Q"를 입력합니다.2.30 행은 값이 음수 또는 0인 경우 1.8 또는 2.5로 점프하고,[18] 그렇지 않은 경우 콘솔에 "P"를 계속 입력합니다.

멈춰

QUIT명령어(약어 Q)는 프로그램 실행을 종료하고 편집 [16]환경으로 제어를 되돌립니다.BASIC과 동등STOP또는END.

01.10 X=-10, 1, 10의 경우;타입 X 01.20 종료

돌아가다

RETURN명령어(약어 R)는 서브루틴에서 발신 [16]로케이션으로 실행을 분기합니다.의 사용RETURN서브루틴의 마지막 행은 옵션입니다.서브루틴은 그룹 내 마지막 행으로 반환됩니다.다음으로 yes/no 프롬프트를 값으로 변환하기 위한 서브루틴 예를 나타냅니다.[1]

22.78 주석: 'YES OR NO' 서브루틴 22.80 "YES OR NO?"라고 질문합니다.AN 22.82 IF (AN-0YES) 22.84, 22.86 IF (AN-0NO) 22.84, 22.88 22.86 SET X.88; 22.88 SET.

세트

SET명령어(약어S)는 지정한 [19]변수에 식 결과를 할당합니다.BASIC과 동등LET.

01.30 SET PI=3.14156 01.60 SET Interest=SET*(RATE/100)*용어

유형

TYPE명령어(약어 T)는 [20]콤마로 구분된1개 또는 여러 항목의 출력을 제공합니다.BASIC과 동등PRINT.

항목은 변수, 큰따옴표로 둘러싸인 리터럴 문자열 또는 다양한 제어 문자일 수 있습니다.제어 문자에는!캐리지 리턴 및 라인 피드를 출력합니다.#혼자 돌아오는 마차 때문에:탭 문자입니다.예를 들어 제어 문자를 함께 문자열로 만들 수 있습니다.!!!는 3개의 CR/LF를 [15]쉼표로 구분하지 않고 출력합니다.

타입 [NUMBRS, E1, "TEXT", !, #, :, $OR %]...출력 01.10 타입 "안녕하세요, 예쁜이. 얼마의 돈을 빌리고 싶으세요?", 01.50 타입 "이자", "이자", "이자", 01.80 타입 "이자", "기간", "년", "IS", 관심사, "달러",! 01.90 타입 "뉴욕","워싱턴!애틀랜타!댈러스", 02.10 타입 "X", "X^2", "X^2", "SQRT", "FSQT(X) 03.20 타입 ".# 02.20 타입!!! 

TYPE또한 형식을 사용하여 지정된 선택적 형식 지정자를 포함했습니다.%x.yz여기서 x는 소수점 왼쪽에 있는 자리수, yz는 마침표 오른쪽에 있는 자리수입니다.기본 포맷은 다음과 같습니다.%8.4([21]최대 8자리, 오른쪽 4자리)를 나타냅니다.예를 들어 다음과 같습니다.

설정 A=67823 유형 %6.01, A = 67823.0 유형 %5, A = 67823 유형 %8.03, A = 67823.000 유형 %, A = 6.7823E4

일부 예에서는 정의된 전체 너비를 채우면서 추가 선행 공백에 주의하십시오.%만 사용하면 출력이 [22]E를 사용하여 "부동소수점 형식"으로 인쇄됩니다.

특수 컨트롤 캐릭터는$정의된 모든 변수와 값의 표를 출력합니다.필요한 경우 이름의 처음 두 글자만 0으로 채워 인쇄됩니다.배열 요소는 별도의 행에 인쇄되며 요소가 하나만 있는 변수는 색인화됩니다(00).예를 [23]들어 다음과 같습니다.

타입 $A0(00)=67823

변수

변수 이름은 F를 제외한 임의의 문자로 시작할 수 있으며(F는 함수용으로 예약됨), 임의의 문자와 숫자를 포함할 수 있습니다.그러나 중요한 것은 처음 두 글자뿐입니다.예를 들어, FOCAL의 코드 샘플: A New Conversational[24] Language는 DESTION과 DES와 동일한 변수를 참조합니다.내부적으로는 두 레퍼런스 모두 DE로 지정된 변수를 나타냅니다.

01.80 수신처 문의 02.30 IF (DES-14) 2.4, 3.1, 2.4

모든 변수는 배열로 처리될 수 있으며 -2048 ~ 2047의 첨자를 사용할 수 있습니다.[2]

수학

FOCAL-69에는 5개의 수학적 [25]연산자가 포함되어 있다.

  • ^experts: 12비트 정수로 변환됩니다.
  • *곱셈용
  • /분할을 위해
  • +추가용으로
  • -뺄셈을 위해서

FOCAL의 한 가지 궁금한 점은 위의 순서와 같이 운영자 모두가 독립적인 우선 순위를 가지고 있다는 것입니다.그 말은 공식은SET T=2-3+1는 2-(3+1)의 순서로 평가되어 -2가 됩니다.이는 +와 -가 동일한 우선순위를 가지며 (2-3)+1을 평가하여 [25]0을 생성하는 대부분의 언어와는 매우 달랐습니다.이로 인해 FOCAL 소스 코드를 다른 시스템으로 변환할 때 미묘한 오류가 발생할 수 있습니다.

FOCAL은 수학식이 [25]() [] 및 <>를 일치 쌍으로 교환 가능하게 사용하여 우선순위를 설정할 수 있다는 점에서 특이했습니다.예를 들어, 다음은 유효한 표현입니다.

01.30 SET A=<10*[5+1]*(1+5)>

이들 모두 같은 우선순위 수준이며 동일한 레벨일 경우 왼쪽에서 오른쪽으로 읽히기 때문에 이 문장은 [], [>], [>] 순으로 평가되어 [25]360이 생성됩니다.

언어에는 다음과 같은 기능이 [26]내장되어 있습니다.

  • FABS()– 절대값
  • FATN()– 아크탄젠트
  • FCOS()– 라디안 인수의 코사인
  • FEXP()– 논의의 힘에 대한 자연스러운 근거
  • FITR()– 인수의 정수 부분
  • FLOG()– Naperian 로그
  • FRAN()– 난수
  • FSGN()– 인수의 부호; FSGN(0)=FOCAL-69에서는 1이지만 FSGN(0)=FOCAL-71 이후 버전에서는 0
  • FSIN()– 라디안 단위로 주어진 각도의 사인
  • FSQT()– 제곱근

기타 기능

또한 FOCAL에는 다음과 같은 몇 가지 특수 목적 [27]기능이 포함되어 있습니다.

  • FDIS두 개의 값을 가져다가 그래픽 단말기의 화면에 점을 그렸습니다.
  • FADC번호가 매겨진 아날로그 입력에서 값을 읽고 정수 값을 반환하다

환경 명령어

프로그램 실행 중

사용된 FOCALGOTO프로그램을 시작할 수 있습니다.단, 일반 규칙은 이것을 다음과 같이 단축하는 것이었습니다.GO이것은 에 상당합니다.RUN기본입니다. GOTO또한 에디터에서 사용하여 지정된 행에서 실행을 시작할 수도 있습니다.

명령 편집

줄 번호로 명령어를 시작하는 것만으로 프로그램에 새 줄이 입력됩니다.편집 명령어는ERASE(약자 E),[25] MODIFY(약자 M)[28]WRITE(약자 W):[15]

  • ERASE– 모든 변수를 0으로 설정합니다.이거는 프로그램에서 변수를 리셋하기 위해 사용되는 경우가 있습니다.
  • ERASE line number– 지정된 행의 스테이트먼트를 삭제합니다.
  • ERASE group number– 지정된 그룹의 모든 스테이트먼트를 삭제합니다.
  • ERASE ALL– 프로그램 전체를 삭제합니다.
  • MODIFY line number– 지정된 행을 편집할 수 있습니다.
  • WRITE line number– 지정된 행에 스테이트먼트를 표시합니다.
  • WRITE group number– 지정된 그룹의 모든 스테이트먼트를 표시합니다.
  • WRITE ALL– 지정된 프로그램 표시

파일 명령어

file 명령어는 OPEN(약어 O):

  • OPEN INPUT [device:][file][,ECHO]– 파일 시작부터 읽을 준비를 합니다.
  • OPEN OUTPUT [device:][file][,ECHO]– 파일 시작부터 쓰기 준비
  • OPEN RESTORE INPUT[,ECHO]– 입력 재개
  • OPEN RESTORE OUTPUT[,ECHO]– 출력 재개
  • OUTPUT CLOSE– 버퍼를 출력하고 파일을 닫습니다.

라이브러리 명령어

FOCAL은 코드 라이브러리로 FOCAL 프로그램 컬렉션을 관리하는 기능을 포함했습니다.프로그램은 다음을 사용하여 체인 방식으로 다른 프로그램을 호출할 수 있습니다.LIBRARY CALL또는 를 사용하여 다른 프로그램의 단일 서브루틴을 호출합니다.LIBRARY GOSUB. 프로그램 이름은 6자까지 사용할 수 있습니다.LIBARY 명령어(약어 L)에는 다음 서브 명령어가 있습니다.

  • LIBRARY DELETE [device:]program name– 프로그램 삭제
  • LIBRARY LIST [device:][file name]– 카탈로그
  • LIBRARY RUN [device:]program name [line number]– 프로그램을 체인(옵션으로 지정된 회선번호로 재개)
  • LIBRARY SAVE [device:]program name– 프로그램 저장
  • LIBRARY EXIT– PDP-8 모니터 프로그램으로 돌아가다

FOCAL-71 추가:

  • LIBRARY CALL [device:]program name– 프로그램 로드
  • LIBRARY GOSUB [device:]program name [group number]– 외부 프로그램에서 서브루틴을 호출합니다.

에러 코드

인터프리터는 오류 메시지 또는 오류 번호 테이블을 저장하기에 충분한 메모리 공간이 없었기 때문에 FOCAL에서는 오류 검출 코드의 주소를 고정 소수점 번호로 보고함으로써 회피책을 사용했습니다.예를 들어, 0으로 나누기 오류가 검출되어 보고됩니다.?28.73 @ 01.10여기서 28.73은 메모리페이지 28에서 이 에러를 체크하는 코드와 오프셋73 워드를 더한 것을 나타내고 01.10은 에러가 발생한 회선번호를 나타냅니다.PDP-8 의 페이지의 길이는 128 바이트이므로, 이 주소는 로케이션 3657 로 변환됩니다.

버전 간 변경

DEC는 PDP-8 시리즈용 FOCAL의 3가지 버전(단순히 FOCAL로 알려진 원본)과 2가지 업데이트 버전(FOCAL, 1969 및 FOCAL, 1971)을 발표했습니다. FOCAL, 1969는 원본과 거의 동일하지만 FOCAL, 1971은 파일 처리, 새로운 수학 및 기타 다양한 변경 사항을 추가한 주요 업데이트입니다.스탠드아론 시스템이었던 최초의 2가지 버전과는 달리 FOCAL, 1971은 새로운 OS/8(당시 PS/8)을 기반으로 하고 있으며 파일 처리 및 편집에 있어 해당 운영체제에 대한 의존도가 높아졌습니다.

초점, 1971년

새 버전의 한 가지 변경 사항은 정밀도를 높이기 위한 10자리 산술 패키지였다.FSGN입력 식이 0으로 평가된 경우 함수는 0을 반환했습니다.이전에는 이것이 1개를 반환했습니다.FRAN이제 더 나은 알고리즘을 사용하여 더 많은 랜덤하게 분포된 숫자를 생성했습니다.또한 새로운 기능이 추가되었습니다.FIN문자열을 받아 ASCII 값을 반환하는 함수(BASIC에 입력)ASC)와FOUT번호를 취득하고, 그 ASCII 문자의 문자열을 반환했습니다( ).CHR).

이 모든 옵션이 제한된 메모리를 사용했기 때문에 시작 시 FOCAL, 1971은 사용자에게 사용하고자 하는 기능을 묻는 대화 상자에 들어갔습니다.

JOSS와의 비교

FOCAL은 모든 의도에서 구문을 보다 쉽게 해석할 수 있도록 변경된 JOSS를 정리한 버전입니다.거의 모든 FOCAL 명령은 JOSS와 일대일로 대응하며 세부 사항만 다릅니다.가장 명백한 변화는 JOSS는 대소문자를 구분하지 않고 키워드를 대소문자로 출력하는 반면 JOSS는 대소문자만 출력한다는 것입니다.또한 JOSS 문은 마침표로 끝나기 때문에 쓰여진 문처럼 보이지만 JOSS에는 줄 바꿈이 없습니다.

한 가지 중요한 차이점은 JOSS가 완전한 비교 연산 세트와 부울 논리 시스템을 포함하고 있다는 것입니다.if그리고.for구성.또한 분기 및 루프는 어느 문에도 적용할 수 있으며, 두 문 모두 수행할 수 있는 유일한 연산은 goto와 동등합니다.예를 들어, JOSS에서는, 다음과 같이 할 수 있습니다.

1.10 X > 10. 1.20 i = 1 (1) 10일 경우 A형. 

첫 번째 행은 옵션에서 X 값을 기준으로 A를 인쇄하고 두 번째 행은 숫자 1 ~ 10을 인쇄합니다.반면, FOCAL은 값을 비교하는 기능이 부족하여 루프가 완료되면 다음 행으로 건너뛰어 적용되었습니다.FOCAL의 등가 코드는 다음과 같습니다.

1.10 IF (X-10) ,1.30 1.20 타입 A! 1.30 (I=1,1,10의 경우)타입 I!

JOSS의 구현은 실행 시간을 더 복잡하게 만드는 대신 공통 구조를 더 쉽게 만들고 프로그래머의 의도와 더 가깝게 일치시킵니다.예를 들어 JOSS에서는 루프 내의 범위를 1,2,3,10(5)50,75,78과 같이 유연하게 기술할 수 있습니다.이러한 유연성에는 비용이 듭니다.FOCAL에서는 시작, 중지 및 스텝을 커스텀 인메모리 구조로 작성할 수 있으며 루프가 실행되면 쉽게 갱신할 수 있습니다.한편 JOSS에서는 복잡하지만 실제로는 복잡하지 않은 표현을 재평가할 필요가 있습니다.

FOCAL에서 코드 테서를 만들기 위해 변경은 비교적 미미했습니다.예를 들어 JOSS' 등입니다.Do part 20.약간 작은 FOCAL이 됩니다.DO 20,하는 동안에Do step 20.1된다DO 20.1명령어 키워드도 가능한 한 단축하여 JOSS'DemandFOCAL이 되다ASK문자 D를 하나의 의미로 사용할 수 있도록 하기 위해서입니다.DO.

파서를 단순화하기 위해 일부 FOCAL 옵션이 제거되었습니다.예를 들어, JOSS는 다음 명령을 사용하여 여러 개의 할당을 수행할 수 있습니다.Set S=P, P=Q, Q=S.FOCAL에서는 개별적인 진술을 해야 했습니다.SET S=P; SET P=Q; SET Q=S. 마찬가지로 JOSS.Form출력 포맷에 사용되었으며, FOCAL의TYPE와 함께%.

BAS와의 비교IC

FOCAL과 BASIC의 비교는 필연적으로 이루어졌습니다.두 언어는 같은 시대의 미니컴퓨터에서 공통적으로 사용되고 구문과 구조에서 많은 공통점을 가지고 있기 때문입니다.대부분의 경우 FOCAL 코드가 BASIC에서 직접 변환됩니다.예를 들어, 사용자에게 값 입력을 요청하려면 FOCAL에서 다음을 수행합니다.

"몇 살이에요?"라고 묻습니다.나이

BASIC에서는 다음과 같습니다.

INPUT "몇 살이에요?",나이

둘 중 하나에서 누락된 몇 가지 기능과 구문에서 비교적 작은 차이를 제외하면 두 언어는 매우 유사합니다.

한 가지 주목할 만한 예외는IFBASIC에서는, 모든 스테이트먼트를 다음에 배치할 수 있습니다.THENJOSS의 제어 구조와 더 유사합니다.BASIC은 JOSS와 비교하여 코드 순서를 반대로 하여 조건식을 끝부분이 아닌 줄의 선두에 배치합니다.BASIC에서는 다음과 같이 사용합니다.IF this THEN that반면 FOCAL은 사용됩니다.that IF thisBASIC 버전은 식이 참이 아닐 경우 실행 시 나머지 문 읽기를 즉시 중단할 수 있다는 장점이 있습니다.반대로 FOCAL의IF베이직의 컴퓨터 기교에 가까웠는데ON X GOTO 10,20,30단,ON...GOTOJOSS 및 FOCAL에서와 같이 음, 영, 양의 3개만 사용할 수 있는 반면, 임의의 수의 행을 대상으로 사용할 수 있습니다.

두 가지 주요 차이점은 FOCAL이 변수에 할당할 수 있는 데이터 요소로서 문자열을 본질적으로 지원하지 않았다는 것입니다.스트링을 추가하기 전의 초기 BASIC 또는 FORTRAN 버전에서와 마찬가지로 (F77에서) 이 제한은 일반적으로 입력 및 출력 명령에서 리터럴 스트링을 사용함으로써 회피되었습니다.이것이 중대한 문제가 된 것은 개별 문자열 또는 문자열 내의 문자를 조작하는 경우뿐입니다.

문자열 변수가 지원되지 않아 문자열을 입력할 때 사용자가 입력한 문자를 숫자 값으로 변환하는 크러지를 사용했습니다.예를 들어, 입력문에 「HELLO」라고 입력했을 경우, FOCAL은 H를 PDP-8의 6비트 문자 코드의 숫자치 「H」(「H」는 8번째 문자)인 「8」로 변환합니다.그런 다음 "E"를 지수를 시작하는 것으로 해석하고 "LO"의 거듭제곱에 대해 "8"을 계산하려고 합니다. 몇 초의 CPU 시간이 걸리고 값이 0.76593020E+103이 됩니다.이것은 도움이 되지 않습니다.단, 다음과 같은 단일 문자 응답을 사용하여 응답할 수 있는 질문을 합니다.Do you need instructions, Y or N", 프로그래머들은 문자 입력처럼 보이는 것을 만들기 위해 알려진 문자 값과 비교해서 결과를 테스트할 수 있다.

FOCAL의 PDP-8 구현에서는 숫자를 4개의 12비트 워드, 총 48비트로 나타내는 부동소수점 표현을 사용했으며 36비트의 가수와 12비트의 지수를 사용했습니다.이는 대부분의 동시대의 통역기보다 상당히 높은 정밀도와 상당히 넓은 값의 범위를 가능하게 하여, FOCAL은 심각한 수치 작업을 위한 합리적인 선택이 되었다.이 높은 정밀도로 기본 10진수 출력 포맷을 선택할 수 있기 때문에 초기 사용자에게는 바이너리에서 10진수로의 반올림 문제가 명확하지 않습니다.비교를 위해 Microsoft BASIC은 처음32비트 포맷을 사용했지만 이후 버전에서는 40비트로 확장했습니다.대부분의 BASICs는 간단한 방정식으로 이어지는 반올림 문제가 있어 0이 아닌 작은 잔여물이 생성되었습니다.

일반적으로 FOCAL이 동등한 BAS보다 자원 사용에 더 효율적이었다는 데 동의한다.IC 시스템보통 6~24킬로바이트의 자기 코어 메모리를 탑재한 일반적인 머신에서는 FOCAL은 BASIC보다 크고 복잡한 프로그래밍 태스크를 처리할 수 있습니다.

버전 및 스핀오프

Coca-Cola Corporation은 [citation needed]COKE라고 불리는 맞춤형 버전의 FOCAL을 사용했습니다.

이후 PDP-7, PDP-9, PDP-10, PDP-11, PDP-12, PDP-5 및 LINC-8에 FOCAL이 실장되었습니다.

FOCAL 매뉴얼에서는 FOCAL 파서에 명령어를 추가하는 방법을 보여 주었기 때문에 많은 사이트에서 커스텀 하드웨어를 조작하기 위한 특별한 명령어를 추가했습니다.

디지털 기기 컴퓨터 사용자 협회는 FOCAL을 위한 많은 패치 및 개선 사항을 수집했습니다.FOCAL-W와 같은 FOCAL의 주요 기능 확장 오프스팟은 대용량 스토리지 파일 I/O, 가상 가변 메모리 등 많은 기능을 추가했습니다.

1970년대 중반에는 Delta가 더 정교한 버전의 FOCAL이었다.프로그램 행 번호는 영숫자 순서로 00에서 99 "부품" 및 000000에서 999999 "단계"가 실행되었습니다.DELTA에는 Tektronix 4010/14 디스플레이 스코프 전용 명령어가 몇 가지 있었습니다.

러시아에서는 1990년대 초반까지만 해도 일렉트로니카 BK 시리즈의 양산형 가정용 컴퓨터에 쓰였다.

코드 예시

원래의 Lunar Lander는 언어의 대부분의 기능을 사용하기 때문에 FOCAL 코드를 검사하는 데 훌륭한 예가 됩니다.이 코드는 짐 스토어의 루나 [29]랜더 페이지에 있는 원본에서 나온 것입니다.

01.04T "달 착륙선을 제어한다. 수동 제어가 필요하다!" 01.06T "각 10초마다 연료율 K를 0 또는 임의의 값으로 재설정할 수 있다!" 01.08T "8~200LBS/초 사이"연료는 16,000파운드입니다.추정! 01.11T "프리폴 임팩트 타임-120SECS.캡슐 중량-32500파운드!" 01.20T "최초 레이더 체크"!!;E 01.30 T "착륙 절차 시작!"시간, SECS 고도", 01.40T "마일즈+피트 속도, MPH 연료, LBS 연료비!" 01.50S A=120;S V=1;S M=32500;S N=16500;S G=.001;S Z=1.8 T% "T"LE";F X=1,51;T "." 02.73 T "K=";A K;G 2.7 03.10 I (M-N-.001) 4.1;I (T-001) 2.1;S S=T 03.40 I ((N+S*K)-M) 3.5, 3.5;S S=(M-N)/K 03.50 D 9;I (I) 7.1, 7.1;I (V) 3.8, 3.8;I (0.1);S W=3600*V 05.20 T "충격 속도",W,"M.P.H."!""연료 좌측:"M-N", LBS!" 05.40 I(1-W)5.5, 5.5:T "완벽 착륙!"-(LUKY) i.509!";G 5.9 05.70 I (40-W) 5.81, 5.81;T "CRAFT DAMAGE. GOOD LUCK!";G 5.9 05.81 I (60-W) 5.82,5.82;T "충돌 착륙-당신의 5시간 산소!";G 5.9 05.82T "죄송합니다만 생존자가 없었습니다. 당신이 망쳤습니다!""05.83T "당신이 새로운 달 크레이터를 폭파한 사실", W**27777", FT.DEEP. 05.90 T!!!"재시도!" 05.92 A (ANS. YES OR NO)" P;I (P-0NO) 5.94, 5.98 05.94 I (P-0YES) 5.92, 1.2, 5.92 05.98 T "CONTROL OUT"!!Q 06.10 S L=L+S;S T=T-S;S M=M-S*K;S A=I;S V=J 07.10I (S.005) 5.1;S S=2*A/(V+FSQT(V*V+2*A*(G-Z*K/M))) 07.30 D9;D6;G7.1 08.10 S W=(1-M*G/(Z*K)/2M=S)

이 프로그램은 여러 서브루틴으로 확실하게 분리되어 있습니다.이는 FOCAL 프로그램(및 JOSS)에서 거의 보편적으로 사용되었으며, 회선 번호 체계로 인해 이러한 구조를 사용하기 쉬웠습니다.이 프로그램은 9개의 루틴을 사용합니다.첫 번째 그룹 1은 단순히 다음 명령어를 사용하여 출력합니다.Type 문을 지정하고 실행을 위한 초기 값을 설정합니다.연료량은 직접 기록되지 않고 전류를 사용합니다.M엉덩이와 빈 덩어리,N그래서 남은 연료는 M-N이고 M-N이 0일 때 착륙선은 연료가 다 떨어져요.또, 다음의 점에 주의해 주세요.E1.20 행의 끝에 rase를 지정하면 모든 변수 값이 리셋됩니다.

메인 게임 루프는 그룹 2에 의해 구동됩니다.첫 번째 실행 중에 코드가 그룹 1을 통해 그룹 2로 "하락"되면 첫 번째 두 줄에 초기 값이 인쇄됩니다.2.20 행의 말미에 가까워지면 사용자는Asked를 사용하여 번트 레이트를 입력합니다.K를 사용하여 루프 타이머를 리셋합니다.S T=10. Line 2.70은 사용자의 입력을 몇 가지 가능성에 대해 테스트하고, 200을 초과하거나 8을 밑돌면 "NOT PASSUBLE"과 마침표를 입력하고, 다시 루프백하여 사용자에게 재시도하도록 요구합니다.값이 이들 값 사이에 있으면 그룹 3으로 이동합니다.FOCAL의 제한된 기능은IF명령어는 여기에 명시되어 있습니다.BASIC에서는 이것이 1개로 축소될 수 있습니다.IF K>200 OR K<8 THEN...

그룹 3은 연료 고갈 여부를 먼저 테스트하고 연료가 고갈된 경우 그룹 4로 점프합니다.그런 다음 10초 동안 테스트합니다.T유효기간이 지났습니다만, 유효기간이 지났을 경우, 모든 것을 다시 인쇄하기 위해서 루프백 합니다.그 때문에, T와 S가 10으로 리셋 되는 부작용이 있습니다.라인 3.40은 이 기간 동안 연소된 연료의 양 S*K가 차량 전체의 질량을 빈 중량 N을 넘어 감소시킬지 여부를 테스트한다. 그렇지 않을 경우 남은 연료가 연소되는 시간으로 대신 루프 타이머를 설정하여 루프를 조기에 종료한다.어느 경우든 그룹 9를 호출하여 속도와 위치를 업데이트합니다.그런 다음 I 값이 수렴될 때까지 그룹 7, 8, 9를 루프합니다.

10초 타이머가 고갈되거나 3.10라인의 연료 시험 또는 7.10라인의 고도 시험으로 인해 종료에 도달한 경우.후자의 경우 그룹 4로 점프하여 그룹 5로 넘어가거나 그룹 5로 직접 점프합니다.그룹 5는 게임 종료 결과를 입력하고 다시 시도할지 여부를 사용자에게 묻습니다.이 경우 값이 1.20으로 점프하여 모든 값을 지우고 헤더를 다시 인쇄합니다.그렇지 않으면 5.98로 떨어집니다.Quits (유트)

「 」를 참조해 주세요.

  • FOCAL에 영감을 준 랜드 언어인 JOSS
  • MUMPs, JOSS 및 FOCAL 개념을 기반으로 하는 데이터 조작 언어

레퍼런스

  1. ^ 수동 1968, 1.1페이지
  2. ^ DEC, 1957 to the Present (PDF). DEC. 1978. p. 38.
  3. ^ McCracken, Harry (2014-04-29). "Fifty Years of BASIC, the Programming Language That Made Computers Personal". Time. Archived from the original on 2016-02-05. Retrieved 2016-02-12.
  4. ^ a b Marks, Shirley (December 1971). The JOSS Years: Reflections on an experiment (PDF) (Technical report). Rand.
  5. ^ "Watch Your Altair Grow!". Byte. April 1976. p. 48.
  6. ^ a b c d Szczepaniak 2014.
  7. ^ EduSystem Handbook (PDF). Digital. 1973. p. V.
  8. ^ a b Savetz 2013.
  9. ^ Stapleton, R.A.; Goodman, S.E. (June 1988). The Soviet Union and the Personal Computer "Revolution" (PDF) (Technical report). University of Arizona. p. 8.
  10. ^ "Elektronika BK-0010". Old Computer Museum.
  11. ^ 수동 1968.
  12. ^ a b 수동 1968, 2.1페이지.
  13. ^ a b c 수동 1968, 2.7페이지
  14. ^ a b 수동 1968, 3.7페이지
  15. ^ a b c 수동 1968, 3.2페이지
  16. ^ a b c 수동 1968, 3.6페이지
  17. ^ a b 수동 1968, 3.4페이지
  18. ^ a b 수동 1968, 3.5페이지
  19. ^ 수동 1968, 3.3페이지
  20. ^ 수동 1968, 3.1페이지
  21. ^ 수동 1968, 2.2페이지
  22. ^ 수동 1968, 2.3페이지
  23. ^ 수동 1968, 2.5페이지
  24. ^ FOCAL: A New Conversational Language. Digital.
  25. ^ a b c d e 수동 1968, 2.4페이지
  26. ^ 수동 1968, 3.10페이지
  27. ^ 매뉴얼 1968, 페이지 A.3
  28. ^ 수동 1968, 3.8페이지
  29. ^ "Lunar Lander". Lunar Landing Game Related Documents.

참고 문헌

외부 링크