BASIC-PLUS

**BASIC-PLUS**는 1970년대 초부터 1980년대까지 PDP-11 시리즈 16비트 미니컴퓨터용 RSTS/E 시분할 운영체제에서 사용하기 위해 디지털 이큅먼트 코퍼레이션(DEC)이 개발한 베이직 프로그래밍 언어의 확장 방언이다.

BASIC-PLUS는 TSS/8용 BASIC-8을 기반으로 했으며, 이는 다시 원본 다트머스 베이직을 매우 밀접하게 기반으로 했다. BASIC-PLUS는 여러 새로운 구조와 조건문 및 형식 지정과 관련된 JOSS의 기능을 추가했다. 결과적으로 BASIC-PLUS는 오리지널 마이크로소프트 베이직이 모방한 버전이었다.

BASIC-PLUS에 추가된 주목할 만한 기능 중 하나는 다트머스의 원래 다목적  명령 외에  및 와 같은 문자열 함수의 도입이었다. 미래 버전의 언어, 특히 마이크로소프트 버전에서는 가 제거되었고 BASIC-PLUS의 문자열 함수가 이러한 종류의 작업을 수행하는 유일한 방법이 되었다. 오늘날 대부분의 베이직은 이 규칙을 따른다.

이 언어는 나중에 **BASIC-Plus-2**라는 진정한 컴파일러로 다시 작성되었고, VAX-11 플랫폼에 해당 기계의 기본 베이직 구현으로 포팅되었다. 이 버전은 여러 플랫폼 변경을 거쳐 현재 VSI BASIC for OpenVMS로 알려져 있다.

## 역사
1960년대 중반, DEC는 대화형 JOSS 프로그래밍 언어를 실행할 더 빠른 기계를 찾고 있던 랜드 연구소에 PDP-6 메인프레임 판매를 성사시켰다. 다음 해, DEC는 훨씬 작은 PDP-8을 출시했는데, 이는 일반적으로 최초의 성공적인 미니컴퓨터로 간주된다. 이 기계를 위해 그들은 FOCAL로 알려진 JOSS의 축소 버전을 개발했고, 이는 당시 가장 많이 팔린 컴퓨터 중 하나인 PDP-8에서 인기를 얻었다.

랜드 연구소가 JOSS를 발표한 같은 해에 다트머스 대학교는 다트머스 베이직의 첫 버전을 발표했다. 이는 곧 여러 다른 플랫폼으로 이식되었고, 1960년대 후반에는 시분할 시스템에서 사용하도록 의도된 대화형 언어로 컴퓨터 산업에 크게 진출하고 있었다. 1960년대 후반에는 IBM과 Tymshare의 SUPER BASIC과 같은 주요 온라인 시분할 회사를 포함하여 대부분의 공급업체가 자사 플랫폼용 베이직을 출시하고 있었다.

DEC는 NIH 증후군 때문이든 기술적 우위 때문이든 FOCAL을 고객에게 계속 추진했다. 1968년 말, DEC의 교육 부서는 베이직이 지배하기 시작하면서 예비 고객에게 FOCAL을 홍보하는 것이 점점 더 어려워지고 있다는 것을 알게 되었다. 경영진은 관심이 없었고, 1969년에 데이비드 H. 알은 PDP-8용 BASIC-8을 작성할 프로그래머를 직접 고용했다. 이는 즉각적인 성공을 거두었고 DEC의 가장 큰 소프트웨어 판매 품목 중 하나가 되었다.

같은 해, DEC는 PDP-11로 출시된 새로운 컴퓨터의 설계 노력을 시작했다. 플랫폼의 첫 번째 운영체제는 DOS-11이었는데, 이는 나중에 일괄 처리를 위해 재대상화된 단일 사용자 시스템이었다. 시분할은 새로운 기계의 주요 목표였으므로, DOS를 기반으로 하는 두 번째 시스템인 MUM-1(Multi-User Monitor)이 그 위에 실행되는 BASIC-11과 함께 개발되었다. 그 결과는 매우 느렸다.

회사는 결국 완전히 새로운 시분할 OS가 필요하다고 결론 내리고 톰 바넷과 네이선 타이홀츠에게 개발을 맡겼다. 그들은 1970년 6월 11일 IOX(Input Output eXecutive)로 알려진 것을 개발하기 위해 새로운 팀을 구성했다. 기술 책임자인 타이홀츠는 이전에 PDP-8의 TSS-8 프로젝트에 참여했었다. IOX가 포함할 많은 새로운 개념 중 하나는 명령 셸 프로그래밍 시스템으로도 작동할 수 있는 프로그래밍 언어를 사용하는 아이디어였다. 어떤 언어를 기반으로 해야 하는지에 대해 회사 내에서 논쟁이 벌어졌다. 일부는 FOCAL을 제안했는데, 주로 DEC가 자체적으로 해야 한다고 느꼈기 때문이다. 다른 일부는 베이직을 지원하지 않는 것이 기계의 인기에 큰 문제가 될 것이라고 느꼈다. 기술적인 이유로 어느 쪽이든 압도적인 주장이 없는 것처럼 보였기 때문에 결정은 마케팅 부서에 맡겨졌고, 그들은 베이직을 선택했다. 결국, 그들은 둘 다 하기로 결정하고 FOCAL의 일부 기능도 추가할 베이직 방언을 만들기로 했다.

프로젝트의 OS 측면이 커지면서 엔지니어링 부담이 모든 가용 프로그래밍 시간을 차지했고 베이직 작업을 하는 사람이 아무도 없었다. 비행기를 사러 갔다가 우연히 만난 팀 하트(Tim Hart)는 판매원이 DEC에서 일한다는 것을 알게 되었고, DEC가 겪고 있는 문제에 대해 이야기하게 되었다. 이 기회를 통해 하트는 오랜 친구인 톰 에반스(Tom Evans)와 톰 그리피스(Tom Griffiths)와 함께 EGH Inc.를 설립했고, 8월 25일에 DEC로부터 입찰을 받았다. 그들은 재미있는 프로젝트가 될 것이라고 생각하여 9월 4일에 10,500달러라는 매우 낮은 입찰가를 제시했다. 놀랍게도 그들은 9월 18일에 계약을 따냈지만, DEC는 가격이 너무 낮다는 것을 깨닫고 3,000달러의 보너스 조항을 통해 이를 보충해 주겠다고 제안했다.

이전에 DEC는 여러 플랫폼에 대해 여러 다른 베이직 방언을 도입했었고, 이들은 기계 간 이동 시 변환이 필요할 정도로 달랐을 뿐만 아니라 다른 플랫폼에 비해 일반적으로 실망스러운 수준이었다. BASIC-PLUS는 행렬 수학, 파일 처리 및 이전에 메인프레임 시스템에서만 볼 수 있었던 기타 기능을 포함하여 더 완벽한 방언 중 하나로 만드는 많은 새로운 기능을 도입했다. BASIC-PLUS는 회사에서 미래의 모든 방언의 기반이 될 것이었다.

원래 개념은 EGH가 컴파일러와 관련 유틸리티만 작성하고, DEC는 별개의 런타임 시스템을 작성하는 것이었다. 메모리와 보조 기억 장치가 제한된 시스템에는 런타임만 제공되고 런타임의 작은 크기와 컴파일러의 중간 언어(IL) 코드가 실행을 허용한다는 아이디어였다. 개발에는 더 많은 리소스가 필요했지만, 결과 프로그램을 실행하는 것은 가장 작은 기계에서도 작동할 것이다. EGH는 처음에 컴파일러만 작성하도록 되어 있었지만, 시간이 지남에 따라 전체 시스템을 담당하게 되었고, 1971년 1월에 이를 납품했다. 런타임 전용 시스템 아이디어는 나중에 폐기되었다.

IOX는 결국 RSTS-11로 이름이 변경되었고, 1971년에 BASIC-PLUS와 함께 출시되었다.

## 작동 방식
사용자는 단말기에 앉아 프로그래밍 언어 문장을 입력했다. 문장은 시스템의 명령 해석기에 직접 입력하거나, 문서 편집기에 입력하여 파일로 저장한 다음 파일에서 명령 해석기로 로드할 수 있었다. 소스 코드의 오류는 줄을 입력한 직후 사용자에게 보고되었다.

커서 제어 기능이 있는 스마트 단말기를 보장할 수 없었으므로 BASIC-PLUS는 모든 소스 코드에 줄 번호를 접두사로 붙이는 일반적인 시스템을 사용했다. 코드는 번호를 입력한 다음 다음 코드의 내용을 변경하여 편집했다. 코드 줄은 줄 번호만 입력하고 다른 내용은 입력하지 않음으로써 제거할 수 있었고, 그렇게 함으로써 빈 줄로 설정되었다.

RSTS/E 사용자의 가상 주소 공간은 64KB 미만으로 제한되었다. BASIC-PLUS를 사용하면 이 가상 주소 공간의 약 절반이 결합된 명령 해석기와 런타임 라이브러리(RSTS/E에서는 런타임 시스템이라고 불림)에 의해 사용되었다. 이는 사용자 프로그램을 약 32 kB의 메모리로 제한했다.

대규모 프로그램은  문을 사용하여 별도의 실행 가능한 조각으로 분리되었고, 프로그램은 보조 프로그램의 특정 줄 번호로 체인하여 프로그램이 첫 줄부터 다른 지점에서 실행을 시작해야 함을 나타낼 수 있었다. 특정 줄 번호로 체인하는 이 기능은 프로그램이 서로 다른 프로그램에서 호출되었음을 서로에게 알릴 수 있도록 했다. 코어 공통이라는 공유 메모리 섹션을 사용하면 프로그램이 필요에 따라 서로 데이터를 전달할 수도 있었다. 디스크 파일도 사용할 수 있었지만 더 느렸다.

메모리를 절약하기 위해 시스템에는 문자열 데이터와 바이트 코드 모두에 사용되는 가비지 수집 메모리 관리자가 포함되어 있었다.

실행 중인 프로그램은 중단될 수 있었고, 변수를 검사하고 수정한 다음 다시 시작할 수 있었다.

## 구문 및 기능
BASIC-PLUS는 강력한 `MAT` 명령을 포함하여 다트머스 베이직의 후기 버전을 밀접하게 따르고 있다. 여기에 DEC는 여러 고유한 흐름 제어 구조를 추가했다.

### 편집
줄 번호는 1에서 32767까지의 양의 정수였다. 논리적 코드 줄은 일반적인 캐리지 리턴 문자 대신 줄 끝에 줄 바꿈을 사용하여 여러 실제 줄로 계속될 수 있었다. 소스 파일의 외부 편집을 쉽게 하기 위해 BASIC-PLUS의 후기 버전은  문자를 줄 계속 문자 로 허용하기도 했다.

를 문장 구분자로 사용하여 여러 문장을 한 줄에 배치할 수 있었다. 시스템은 탭을 인라인 공백으로 사용할 수 있도록 허용했으며, 현대 언어에서와 같이 루프를 더 명확하게 만드는 데 사용되었다. 주석은  키워드 또는  문자를 사용했는데, 이는 과 를 사용한 MS 베이직과 대조된다.

### 표준 문장
 명령은 화면을 14칸 너비의 영역으로 나누었고, 쉼표는 이 위치 사이를 이동하는 데 사용되었다. 은 1, 2, 3을 간격을 두고 출력했지만, 은 한 칸을 남기고 "1 2 3"을 생성했다. 은 프롬프트 문자열을 지정할 수 있도록 허용했지만, 쉼표 대신 세미콜론을 사용하여 구분했다. 

문자열은 작은따옴표나 큰따옴표로 구분할 수 있었다. 단일 문자를 문자열 형식으로 변환하거나 그 반대로 변환하는  및  함수 외에도, BASIC-PLUS는 다트머스의  명령도 지원했다. 는 문자열을 반복하고 각 문자의 ASCII 값을 숫자 배열의 슬롯으로 반환했다. 예를 들어, 는 요소 1부터 5까지에 110, 105, 114, 114, 105의 5개 ASCII 코드와 요소 0에 문자열의 길이인 숫자 5를 포함하는 배열을 반환한다. 역 연산도 가능했는데, 는 X 배열의 개별 숫자를 읽어 문자열로 변환했다.

### 문장 수정자
BASIC-PLUS는 어떤 문장에도 적용될 수 있는 JOSS와 유사한 조건인 "문장 수정자" 개념을 추가했다. 예를 들어, 은 와 동일하다. 반대도 제공되었다. 은 와 동일했다.

 루프는 다른 버전의 베이직과 동일하게 작동했으며,  명령은 조기에 종료하기 위한 표현식으로 사용될 수 없었다. 대신, 조기 종료를 제어하기 위해  및  키워드를 사용할 수 있었다. 예를 들어, 은 I=10이 될 때까지 루프를 계속하며, 뒤따르는 코드가 I의 값을 설정한다고 가정한다. 이는 10번의 반복 후가 아니라 코드가 I를 10으로 설정하는 즉시 종료될 수 있음을 의미한다. 수정자는 압축된 한 줄 루프를 구성하는 데도 사용될 수 있었다. 예를 들어, 은 X가 100이 될 때까지 루프를 실행했다.

### 변수, 표현식 및 행렬
BASIC-PLUS 초기 버전의 변수 이름은 단일 문자이거나 단일 문자 뒤에 단일 숫자가 오는 형태였다. 나중 버전에서 "확장 모드"가 포함되면서 변수 이름은 최대 29자까지 허용되었고, 마침표(.)가 허용되는 문자로 추가되었다. 모든 변수 이름은 여전히 문자로 시작해야 했다. 대부분의 베이직 버전과 마찬가지로 변수 할당을 위한  키워드는 선택 사항이었다. 이는 처럼 여러 변수를 단일 값으로 설정할 수 있었다.

이 언어는 세 가지 데이터 유형을 지원했다: 부동소수점 숫자, 정수, 문자열. 접미사가 없는 변수는 부동소수점(8바이트, 범위 0.29 ~ 1.7, 최대 16자리 정밀도)이었다. 정수 변수(16비트, 범위 &minus;32768 ~ +32767)는  접미사로 표시되었고, 문자열 변수(가변 길이)는  접미사로 표시되었다.

수학 및 논리 연산자 목록은 대부분의 베이직과 유사했지만 몇 가지 확장 기능이 있었다. 수학 연산자로는 , , , , 가 지원되었고, 해당 문자가 없는 단말기를 위한 의 대체 형식으로 도 지원되었다. 표준 논리 비교 연산자로는 , , , , , 가 있었다. 흥미로운 추가 기능 중 하나는 "거의 같음"을 나타내는  연산자였다. 이는 두 숫자가 동일하게 인쇄될 경우, 즉 가장 중요한 6자리 숫자가 동일할 경우 참을 반환했다. 논리 연산자에는 일반적인 , ,  외에 , A와 B가 모두 참이거나 모두 거짓일 경우 참을 반환하는 , A가 참이고 B가 거짓일 경우 거짓이고 그렇지 않으면 항상 참을 반환하는 가 포함되었다.

 문은 세 가지 데이터 유형 중 하나로 1차원 및 2차원 배열을 할당할 수 있었다. 하위 첨자의 범위는 항상 0으로 시작했다(그러나  문은 행 0 또는 열 0의 요소를 설정하지 않았다).

이 언어에는 전체 배열(또는 행렬)과 함께 작동하는 여러  명령도 포함되어 있었다.  명령은  문으로 행렬을 값으로 채웠고, 은 사용자가 입력한 값으로 배열을 채웠으며, 은 1D 또는 2D 형식으로 요소를 출력했다. 는 관련 키워드를 사용하여 행렬의 기본값을 설정하는 데도 사용될 수 있었다. 예를 들어, 은 A 배열을 0으로 채웠다. 은 전체 행렬을 전치했고, 는 이를 반전시켰다. 또한, , , 는 행렬에 사용되어 관련 행렬 연산을 수행할 수 있었다.

### 파일 처리
 "가상 DIM" 문은 "가상 데이터 배열" 또는 "가상 배열"을 디스크 파일에 매핑할 수 있었는데, 이는 컴퓨터의 가용 메모리(또는 심지어 주소 공간)보다 큰 배열을 허용하고, 배열 요소를 사용하여 디스크 파일(영구 저장소)을 읽고 쓰고 확장할 수 있도록 했다. 그들은 이러한 배열을 "가상 데이터 저장소" 및 "가상 코어"라고 불렀지만, 메모리 맵 파일을 할당하는 현대적인 접근 방식을 사용하지 않았다. 대신, 단일 버퍼가 한 번에 512바이트의 데이터를 저장하는 데 사용되었고, 가상 배열의 항목에 접근할 때 해당 데이터가 읽히고, 필요에 따라 이전 데이터가 기록되었다.  문은 파일을 닫기 전에 버퍼가 다시 기록되도록 했다(필요한 경우). 추가 섹터가 캐시되지 않았기 때문에 "잘못된" 순서로 데이터에 접근하면 디스크 접근 횟수가 늘어날 수 있었다. 가상 배열에는 추가 규칙이 적용되었는데, 하나의 데이터가 레코드 경계를 넘을 수 없다는 것이었다. 각 데이터 유형은 크기의 배수에 맞춰 정렬되었다. 가상 문자열은 고정 길이 ASCIIZ 데이터로 저장되었으며, 크기는 2, 4, 8, 16, 32, 64, 128, 256 또는 512바이트로 제한되었고,  및 을 사용하여 접근되었다.

## 가상 머신
BASIC-PLUS는 인터프리터가 아니라 컴파일-앤-고 시스템이었다. 각 BASIC 줄은 입력될 때 "PPCODE"(Push-Pop Code)로 번역되어 가상 머신에서 빠르게 실행되었다. 이러한 번역은 BASIC 줄을 토큰화하지 않고 스택 머신에서 사용하도록 다시 작성했다. 이러한 표현을 BASIC 문장으로 다시 번역할 수는 없었다. 이는 키워드를 문자열로 반복적으로 디코딩할 필요를 피했다. PPCODE로 변환되면 키워드는 해당 함수를 실행하는 루틴을 가리키는 숫자였다(즉, 스레드 코드였다). BASIC-PLUS에는  명령이 포함되어 있었지만, 이것은 진정한 컴파일러가 아니었다. 이는 단순히 프로그램의 PPCODE 표현을 저장하여 BASIC 프로그램이 다음에 메모리로 로드될 때 다시 컴파일할 필요가 없도록 했다. 시스템은 사용자의 프로그램을 두 가지 형식으로 저장했다. 하나는  명령으로 생성되고 일반적으로 .BAS 파일에 저장되는 편집 가능한 텍스트 형식의 소스 코드였다. 다른 하나는  명령으로 생성되고 .BAC 파일에 저장되는 프로그램의 PPCODE 버전이었다. .BAC 파일은 더 작고 더 빨리 로드되고 실행되었지만 편집할 수는 없었다.

## BASIC Plus 2

**Basic Plus 2**("BP2" 또는 **BASIC-Plus-2**)라는 관련 제품은 나중에 DEC에서 추가 기능과 향상된 성능을 추가하기 위해 개발되었다.

이는 스레드 코드로의 진정한 컴파일을 사용했으며 어셈블러 및 기타 언어 시스템이 생성한 기계어 개체 파일과 호환되는 개체 파일에 출력을 기록했다. 이러한 개체 파일은 라이브러리에 보관될 수 있었다. 링커(TKB, 태스크 빌더라고도 함)는 개체 파일과 라이브러리에서 실행 파일을 생성했다. TKB는 오버레이도 지원했다. 이를 통해 개별 루틴을 필요에 따라 가상 주소 공간으로 스와핑하여 현재 사용되지 않는 루틴을 오버레이할 수 있었다.

또한 BP2 프로그램은 RSX 런타임 시스템에서 실행되었다. 이 RTS는 사용자 가상 주소 공간의 8KB만 차지하여 사용자 프로그램에 56KB를 남겨두었다. (RSTS/E 버전 9는 별도의 명령 및 데이터 공간과 "사라지는" RSX 런타임 시스템을 도입하여 최대 64KB의 명령 코드 및 데이터를 허용했다.) 이 두 가지 요소로 인해 개별 BP2 프로그램이 BASIC-PLUS 프로그램보다 훨씬 커질 수 있었고, 종종 여러 프로그램 간의 CHAINing 필요성을 줄였다.

BASIC-PLUS(RSTS/E에서만 사용 가능)와 달리 BP2는 RSX-11 운영체제에서도 사용할 수 있었다. BP2 프로그램은 나중에 VAX BASIC과도 더 호환되었다.

## MS 베이직과의 비교
마이크로소프트 베이직은 BASIC-PLUS를 매우 밀접하게 모방했다. MS 베이직의 초기 버전인 1.x 시리즈는 정수 변수가 없었지만, 이들은 코모도어 PET 및 코모도어 64의 후기 모델을 포함하여 많은 기계에서 발견된 2.x 시리즈에 추가되었다. 과 같이 논리 및 루프 명령을 인라인으로 배치하는 기능은 복사되지 않았으며 마이크로컴퓨터 베이직의 어떤 공통 버전에서도 나타나지 않는다. MS 베이직은 또한 행렬 명령이 없었다.

## 같이 보기
* 명령 셸 비교

## 내용주

## 각주
### 인용

### 참고 문헌
*
* 
* 
* 

분류:베이직 프로그래밍 언어 계열
분류:셸
분류:베이직 인터프리터