HP 시분할 베이직

**HP 시분할 베이직**(, **HP TSB**)은 휴렛 팩커드의 HP 2000 계열 미니컴퓨터 기반 시분할 시스템 컴퓨터 시스템을 위한 BASIC 프로그래밍 언어 인터프리터이다. TSB는 게임 스타 트렉의 첫 번째 공개 버전을 출시한 플랫폼으로서 역사적으로 주목할 만하다.

이 시스템은 BASIC 방언뿐만 아니라 여러 사람이 동시에 시스템을 사용할 수 있는 기본적인 사용자 계정 및 프로그램 라이브러리를 구현한다. 이 시스템은 1970년대 초중반에 큰 영향력을 발휘했으며, 수많은 프로그램을 만들어냈다. HP는 기여된 프로그램 데이터베이스를 유지했으며, 고객은 명목상의 비용으로 천공 테이프에 담긴 프로그램을 주문할 수 있었다.

1970년대의 대부분의 BASIC은 1960년대의 원조격인 다트머스 베이직에 그 역사를 두고 있지만 다트머스의 초기 버전은 문자열 변수를 처리하거나 문자열 조작 기능을 제공하지 않았다. 벤더들은 각자의 솔루션을 추가했다. HP는 포트란 및 기타 배열 슬라이싱을 사용하는 언어와 유사한 시스템을 사용한 반면, DEC는 나중에 `MID/LEFT/RIGHT` 함수를 도입했다.

1970년대 중반에 마이크로컴퓨터가 시장에 진입하기 시작하면서 DEC 또는 HP의 구문에 파서를 기반을 둔 많은 새로운 BASIC이 등장했다. 마이크로소프트 베이직의 원본 버전인 알테어 베이직은 DEC의 BASIC-PLUS를 모델로 했다. 애플의 정수 베이직, 아타리 베이직, 노스 스타 베이직을 포함한 다른 BASIC들은 HP 스타일을 모델로 했다. 이로 인해 문자열 처리 문제가 발생할 경우 이러한 플랫폼 간의 변환이 다소 어려웠다.

## 명칭
이 소프트웨어는 **HP 2000C 시분할 BASIC**과 같이 실행되는 하드웨어 버전과 연결된 버전 이름으로도 알려져 있었으며, 운영 체제는 2000A, 2000B, 2000C, 고속 2000C, 2000E, 2000F와 같이 다양한 종류가 있었다.

HP는 일부 출판물에서 이 언어를 "Access BASIC"이라고도 불렀다. 이는 일부 출판물에서 "2000/Access"로 알려진 실행 머신의 이름과 일치했다. 이 용어는 플랫폼이 처음 출시되었을 때 잠시 사용된 것으로 보인다.

## 플랫폼 세부 정보
2000A 및 2000E 시스템을 제외하고, 이 시스템은 이중 프로세서 아키텍처를 사용하여 구현된다. 완전히 구성된 HP 2100 시리즈 프로세서 하나는 대부분의 시스템 코드와 모든 사용자 코드를 실행하는 데 사용되며, 두 번째의 더 작은 HP 2100 시리즈 프로세서는 시분할 시스템 사용자가 연결되는 RS-232 직렬 라인을 처리하는 데 사용된다. 하드웨어 구성에 따라 이 시스템은 최대 16명 또는 최대 32명의 동시 원격 사용자를 지원한다.

TSB 시스템의 일반적인 터미널은 텔레타입 모델 33 ASR이었고, I/O 프로세서에 직접 연결되거나 모뎀 또는 음향 결합기를 통해 연결되었다. 계정 이름은 하나의 알파벳 문자와 세 자리 십진 숫자의 조합으로 구성되며, 예를 들어 B001과 같다. 특권 계정은 문자 "A"로 시작하며 일부 추가 명령 및 프로그램 저장 기능을 가졌다. 슈퍼유저 계정은 A000이다. 이 체계는 최대 26,000개의 사용자 계정을 허용한다.

실행 중에 사용자 프로그램은 고정 헤드 드라이브로 스왑되는데, 이는 물리적으로는 디스크이지만 자기 드럼처럼 작동한다. 실행되지 않을 때 사용자 프로그램은 이동식 헤드 카트리지 또는 팩 로드 디스크 스토리지에 저장된다. 특권 사용자는 훨씬 빠른 드럼에도 프로그램을 저장할 수 있다. 하드 드라이브는 자기 테이프로 백업되었다.

프로그램 및 파일 이름은 최대 6개의 알파벳 문자(A-Z)와 숫자(0-9)의 조합으로 구성된다. 프로그램은 SAVE 명령을 사용하여 토큰화된 형식으로 저장된다. 또한 CSAVE 명령을 사용하여 반컴파일된 형식으로 저장할 수 있어 더 빠르게 시작할 수 있다. 시스템은 일반적으로 사용 가능한 텔레프린터 사용과 밀접하게 연관되어 있었기 때문에 파일의 줄 끝은 캐리지 리턴 문자(ASCII CR, 0D 16진수)와 줄 바꿈 문자(ASCII LF, 0A 16진수)로 구성되었다.

## 구문
이 언어는 통합된 편집 및 런타임 환경을 제공하는 상당히 표준적인 BASIC 구현이다. 문장은 입력될 때 올바른 구문인지 분석된 다음 토큰화된 형식으로 저장된다. 각 BASIC 문장은 고유하게 번호가 매겨진 줄에 있어야 한다. 예를 들어 다음과 같다.


```basic
10 PRINT "HELLO WORLD"
```


줄 번호는 필수이며, 문장은 자동으로 오름차순 숫자 순서로 배치된다. TSB 줄은 하나의 문장을 포함할 수 있다. MS BASIC처럼 콜론으로 여러 문장을 연결하는 것은 지원되지 않는다. 여러 변수 할당은 허용된다. 예를 들어, 
```basic
20 LET A=B=C=42
```
와 같다. 대부분의 BASIC 버전에서와 마찬가지로 "LET"이라는 단어의 사용은 선택 사항이었다.

가장 초기 버전(2000A)에서는 언어가 다음 기능을 지원했다. 나중 버전에서는 더 많은 기능이 추가되었다.
*`[[베이직#예약어|GOTO]]` 문을 통한 무조건적 프로그램 흐름 제어, `[[베이직#예약어|GOSUB]]` 및 `[[Return 문|RETURN]]` 문을 통한 서브루틴
*`IF/THEN` 문을 통한 조건부 흐름 제어
*`GOTO/OF` 및 `GOSUB/OF` 문을 통한 계산된 흐름 제어
*변수 기반 블록 루프 `[[for 루프|FOR]]` 및 `NEXT` 문
*`DATA`, `READ` 및 `RESTORE` 문을 통한 코드 내 데이터 저장
*`INPUT`, `READ #`, `PRINT`, `PRINT #` 및 `IF END #` 문을 통한 사용자 또는 디스크 파일 입출력
*"A" 또는 "An"(A는 단일 문자이고 n은 단일, 선택적 숫자) 형식의 숫자 변수
*"A$"(A는 단일 문자) 형식의 문자열 변수, 차원 지정된 대로 1~255자 저장. (아래 참조.) (또는: 변수 이름 "A0$" 또는 "A1$"이지만 이 두 자리 이상은 아님.)
*"A[x]" 또는 "A[x,y]" 형식의 1차원 또는 2차원 행렬 (배열) 변수
*문(`MAT READ, MAT INPUT, MAT PRINT, MAT=`) 및 연산(`+, -, *, ZER, CON, IDN, INV, TRN`)을 통한 행렬 연산
*부울 연산자(`AND, OR, NOT`) 및 관계 연산자(`&lt;, &lt;=, =, #, &lt;&gt;, &gt;=, 및 &gt;`)
*삼각 함수(`SIN, COS, TAN, ATN`), 로그(`LOG, EXP`), 제곱근(`SQR`), 난수 생성기(`RND`), 기타(`ABS, INT, SGN, MIN, MAX)` 및 사용자 정의 함수를 포함한 내장 수학 함수
*텔레타입 모델 33 전자기계식 텔레프린터 원격 터미널을 사용한 천공 테이프 작업

## 문자열 처리
TSB에서 문자열은 단일 다중 문자 개체가 아닌 문자 배열로 취급된다. 기본적으로 메모리에는 한 글자가 할당되며, 더 긴 문자열이 필요한 경우 사용하기 전에 언급해야 한다. 예를 들어, 
```basic
DIM A$[10]
```
은 최대 10자의 문자열을 저장할 수 있도록 설정한다. TSB에서 문자열의 최대 길이는 255자이다.

문자열 내의 부분 문자열은 "슬라이싱" 표기법을 사용하여 접근한다: 
```basic
A$(L,R)
```
 또는 
```basic
A$[L,R]
```
는 인덱스 L로 지정된 가장 왼쪽 문자에서 시작하여 인덱스 R로 지정된 가장 오른쪽 문자까지 계속되는 부분 문자열을 의미하거나, 
```basic
A$[L]
```
 형식은 인덱스 L로 지정된 가장 왼쪽 문자에서 시작하여 문자열의 끝까지 계속되는 부분 문자열을 의미한다. TSB는 () 또는 []를 상호 교환적으로 허용한다. 배열 및 부분 문자열 인덱스는 1부터 시작한다.

이것은 부분 문자열에 접근하기 위해 `LEFT$()`, `MID$()`, `RIGHT$()`와 같은 함수를 사용하는 DEC 패턴을 따르는 BASIC과 극명한 대조를 이룬다. 비록 ANSI BASIC은 휴렛 팩커드가 도입한 것과 유사한 부분 문자열 구문을 계속 사용하고 있지만 말이다. HP의 표기법은 LET 또는 INPUT 문의 대상 쪽에서도 기존 문자열 값의 일부를 수정하는 데 사용될 수 있다. 예를 들어  또는 와 같은 방식으로, 이는 LEFT/MID/RIGHT의 초기 구현에서는 불가능했다.

이러한 스타일의 문자열 접근 방식의 주요 이점은 문자열 길이가 변경될 때 필요한 복잡한 메모리 관리의 필요성을 없앤다는 것이다. MS BASIC은 시스템 메모리가 부족할 때 문자열 힙에서 죽은 공간을 제거하여 메모리를 압축하는 긴 라이브러리를 가지고 있었다. 또한 이것은 매우 느린 것으로 악명 높았고, 성능을 향상시키거나 버그를 수정하기 위해 수명 동안 여러 번 수정되었다. TSB 스타일의 단점은 문자열이 비어 있더라도 항상 DIM으로 지정된 전체 공간을 차지한다는 점과, 연결과 같은 간단한 작업이 문자열이 처음부터 큰 크기로 설정되지 않으면 문자열 오버플로우를 일으킬 수 있다는 점이다.

다트머스 베이직의 이후 버전에는 BASIC-PLUS 및 MS BASIC에서 발견된 것과 동일한 패턴을 기반으로 한 문자열 변수가 포함되었다. 그러나 이 버전은 문자열 조작을 위해 LEFT/MID/RIGHT 함수를 사용하지 않고, 문자열을 동등한 ASCII 값으로 변환하는 `CHANGE` 명령을 사용했다. HP는 `CONVERT`로 이름만 변경하여 동일한 기능을 포함했다. 또한, 작은따옴표를 사용하여 숫자 상수를 ASCII 문자로 변환하여 문자열을 부분적으로 구성할 수 있었다. 
```basic
A$='23 '64 '49 "DEF"
```
는 `CHR$()` 함수 없이 "ABCDEF" 문자열을 생성했다.

## MAT 명령
다트머스 베이직의 이후 버전에는 단일 문장으로 전체 배열(행렬)에 대한 작업을 허용하는 `MAT` 명령군이 포함되었다. 이들은 TSB의 이후 버전에서도 사용할 수 있었다. 가장 간단한 형태에서 `MAT`는 `LET`의 대체 형태로 사용되어 배열의 모든 요소에 식을 적용한다. 예를 들어:

```basic
100 DIM A(20),B(20)
...
200 MAT A=A+B
```

는 A의 모든 항목에 B의 모든 값을 다음과 같은 방식으로 추가한다.

```basic
100 DIM A(20),B(20)
...
200 FOR I=1 TO 20
210 A[I]=A[I]+B[I]
220 NEXT I
```

이 명령은 코드를 더 짧고 명확하게 만들 뿐만 아니라, 고도로 최적화되어 FOR/NEXT 사용보다 훨씬 뛰어난 성능을 제공한다는 장점도 있다. 추가 함수 및 문장은 `PRINT` 및 `INPUT`을 수정하고, 배열을 반전시키고, 항등 행렬 등을 단일 문장으로 구축한다.

## 기타 차이점
TSB에는 다른 방언들과 몇 가지 사소한 차이점도 있다. 가장 중요한 것들은 다음과 같다.

*`#`는 같지 않음 비교의 선택적 형태로, `<>`와 동일하다.
*`ON...GOTO/GOSUB` 구문을 사용하는 계산된 GOTO는 지원되지 않는다. 대신 `GOTO expression OF 1,2,3...`는 서수 위치를 기반으로 목록에서 줄 번호를 선택하여 동일한 기능을 수행한다. 예를 들어, 
```basic
GOTO 1 OF 10,20,30
```
은 항상 10번 줄로 이동하는 반면, 
```basic
GOTO A OF 100,200,300
```
는 A의 값이 1, 2 또는 3이면 다른 줄로 분기한다.
*불리언 및 관계 연산자는 모든 수학 표현식에서 사용할 수 있으며, 거짓이면 0을, 참이면 1을 반환하는데, 이는 당시 BASIC 언어에서는 드물었지만 C와 같은 언어에서는 인기가 있었다. 예를 들어, 
```basic
IF C+D THEN 1600
```
은 C 또는 D가 0보다 크면 1600번 줄로 분기한다. 이는 `IF`에서 표현식 `C+D`가 '참'으로 평가되기 때문이다. C와 D가 모두 0이면 `IF`는 이를 '거짓'으로 평가하고 분기는 수행되지 않는다.
*TSB에는 표준 `INPUT` 문의 변형인 `ENTER`가 포함되어 있으며, 시간 제한에 도달하면 계속된다. `ENTER`는 초 단위 시간 제한, 실제 경과 시간을 포함하는 반환 변수(또는 상태 코드), 그리고 마지막으로 사용자 입력의 세 가지 입력을 가진다. 예를 들어, 
```basic
ENTER 15,T,A$[1,1]
```
는 사용자가 단일 문자를 입력할 때까지 15초를 기다린다. T는 사용자가 실제로 걸린 시간을 포함하고, 타이머가 만료되면 -256, 터미널 문제 발생 시 -257 또는 -258을 포함한다.
*문자열 상수(리터럴)를 출력할 때 줄 안에 세미콜론이 필요하지 않다. 예를 들어, 
```basic
PRINT "THE NUMBER IS"A", TRY A LARGER VALUE."
```
는 문자열 상수와 변수 A 사이에 세미콜론을 필요로 하지 않는다. MS를 포함한 일부 다른 BASIC도 이 구문을 지원했다. Atari 또는 Integer와 같은 다른 BASIC은 지원하지 않았다.
*`PRINT`의 쉼표는 15자마다 탭을 사용하여, 줄 끝에 총 72자를 만들기 위해 12자를 남긴다.
*`LIN` 함수는 `TAB`의 수직적 대응으로 작동한다. 
```basic
LIN(3)
```
은 후행 세미콜론이나 쉼표가 활성화된 경우 기존 줄에 세 개의 캐리지 리턴을 삽입할 수 있으며, 특수한 경우인 
```basic
LIN(-1)
```
은 항상 다음 줄로 이동한다. Integer BASIC에도 
```basic
VTAB
```
이라는 유사한 기능이 있었다.

## 같이 보기
* 로키 마운틴 베이직: 휴렛 팩커드에서 만들어진 또 다른 아주 다른 베이직 방언

## 내용주

## 각주
### 인용

### 참고 자료

* , Part No. 22687-90001
* , Part No. 22687-90009

## 외부 링크
* www.bitsavers.org&nbsp;— Archived HP documentation (scanned into PDF)
* HP 2000 compatible Basic Interpreter
* HP Computer Museum
* BTI Computer Systems History

분류:베이직 프로그래밍 언어 계열
분류:베이직
분류:시분할 운영체제
분류:베이직 인터프리터