다트머스 베이직

operating_system = 다트머스 시분할 시스템 **다트머스 베이직**(Dartmouth BASIC)은 베이직 프로그래밍 언어의 원본 버전이다. 다트머스 대학교의 두 교수인 존 조지 케메니와 토마스 E. 커츠가 설계했다. 기본 다트머스 시분할 시스템(DTSS)과 함께 모든 학부생뿐만 아니라 더 넓은 대학 공동체에 대화형 프로그래밍 환경을 제공했다. 다트머스에서 여러 버전이 생산되었는데, 학부생들이 구현했고 컴파일 앤 고 시스템으로 작동했다. 첫 번째 버전은 1964년 5월 1일에 실행되었고, 6월에 일반 사용자에게 공개되었다. 이후 업그레이드가 계속되어 1979년에 일곱 번째이자 최종 버전이 출시되었다. 다트머스는 1975년에 **구조화된 베이직**(Structured BASIC, 또는 **SBASIC**)으로 알려진 크게 업데이트된 버전을 도입했는데, 여기에 다양한 구조적 프로그래밍 개념이 추가되었다. SBASIC은 1980년대 초 미국 국가표준 협회 표준 표준 베이직 노력의 기반이 되었다. 대부분의 베이직 방언은 4판(예: 대부분의 베이직 사용자가 당연하게 여기는 문자열 변수를 추가했지만, 원본은 문자열만 인쇄할 수 있었다)에 그 역사를 두고 있지만, 일반적으로 행렬 계산과 같은 더 난해한 기능은 제외한다. 다트머스 컴파일러와 달리 대부분의 다른 베이직은 인터프리터로 작성되었다. 이러한 결정 덕분에 초기 마이크로컴퓨터의 제한된 주 기억 장치에서 실행될 수 있었다. 마이크로소프트 베이직이 한 예로, 단 4KB의 메모리에서 실행되도록 설계되었다. 1980년대 후반에는 수천만 대의 가정용 컴퓨터가 MS 인터프리터의 변형 버전을 실행하고 있었다. 이것은 베이직의 사실상 표준이 되었고, ANSI SBASIC 노력의 중단으로 이어졌다. 케메니와 커츠는 나중에 SBASIC 버전인 트루 베이직을 개발하고 홍보하는 회사를 설립했다. 많은 초기의 메인프레임 게임이 다트머스 베이직과 DTSS 시스템에 그 역사를 두고 있다. 이들 중 일부는 HP 시분할 베이직 버전으로 피플스 컴퓨터 컴퍼니의 책 『What to Do After You Hit Return』에 수록되었다.publisher= People's Computer Company 베이직 컴퓨터 게임 및 관련 작품의 많은 원본 소스 목록 또한 다트머스 베이직에 그 역사를 두고 있다.
# 개발 역사

## 초기 작업
존 조지 케메니는 1953년 다트머스 대학교 수학과에 합류하여 나중에 학과장이 되었다. 1956년 그는 MIT의 뉴잉글랜드 지역 컴퓨터 센터 노력을 통해 IBM 704에 접근할 수 있게 되었다. 그 해에 그는 수학 연산 프로그래밍을 단순화한 어셈블러 버전인 DARSIMCO 언어를 작성했다. 그는 그 해에 학과에 합류한 토마스 E. 커츠의 도움을 받았다.p=516 DARSIMCO는 1957년에 첫 FORTRAN 컴파일러가 기계에 설치되면서 잊혀졌다. FORTRAN의 등장은 중요한 교훈을 주었다. FORTRAN이 느리다는 교육을 받았던 커츠는 704 어셈블러로 프로그램을 작성하는 데 몇 달을 보냈는데, CPU 시간 한 시간 정도가 디버깅에 소요되었지만 여전히 실행되지 않았다. 포기하고 그는 FORTRAN으로 다시 작성했고 5분 만에 실행시켰다. 이 교훈은 측정된 성능에 관계없이 고수준 언어가 시간을 절약할 수 있다는 것이었다.p=516 1959년, 학교는 첫 번째 컴퓨터인 자기 드럼 기반 LGP-30을 받았다. 한 학생이 이 기계를 위해 FORTRAN에서 영감을 받은 DART라는 언어를 작성했다. 이는 알골 58 컴파일러를 제작하려는 노력으로 이어졌고, 정의가 확정되자 알골 60으로 전환되었다. 매우 작은 메모리 크기(현대 용어로 32KB)와 드럼 속도 3600rpm으로 인해 컴파일러 작성이 어려웠고 매우 느렸다. 그럼에도 불구하고 그들은 ALGOL 30으로 알려진 기능적 축소 버전을 제작할 수 있었다.pp=516-516 추가 개발로 "자체 포함 알골 프로세서"인 SCALP가 탄생했는데, 이는 천공 테이프가 소스를 읽는 즉시 컴파일된 프로그램을 실행할 준비가 된 원패스 컴파일러였다. 프로그램 결과 또는 오류 메시지는 즉시 나타났다. 이러한 컴파일-앤-고 방식의 작동은 나중에 베이직에 의해 사용되었다.pp=516-516p=7 1962년, 케메니와 고등학생 시드니 마샬p=8은 새로운 언어인 DOPE (Dartmouth Oversimplified Programming Experiment)를 실험하기 시작했다. 이것은 명령어를 나타내기 위해 번호가 매겨진 줄을 사용했는데, 예를 들어 두 숫자를 더하려면 DOPE는 다음과 같이 사용했다. 5 + A B C 이는 "5번 줄에서 변수 A와 B의 값을 더하고 그 결과를 C에 넣으라"는 의미였다. 다소 암호 같은 배치였지만, 미래 베이직 언어의 기초를 엿볼 수 있다.p=517 기본 수학 연산 외에도 이 언어는 SQR, EXP, LOG, SIN 및 간단한 분기 구문을 포함했다.p=518
## 인문학 분야에서의 컴퓨팅
케메니와 커츠는 전통적인 STEM 분야 이외의 학생들 사이에서 프로그래밍 지식의 필요성에 동의했다. 다트머스 학생 중 25%만이 STEM 관련 과정을 수강했지만, 거의 모든 분야에서 어느 정도의 수학이 사용되었다. 더욱이, 컴퓨터가 사회에서 점점 더 중요해지면서 그들은 "컴퓨팅과 그 사용에 대한 합리적인 결정을 본질적으로 그것을 모르는 사람들이 어떻게 내릴 수 있을까?"라고 궁금해했다.p=518 케메니는 나중에 "우리의 비전은 캠퍼스의 모든 학생이 컴퓨터에 접근할 수 있어야 하고, 모든 교수진이 적절할 때마다 강의실에서 컴퓨터를 사용할 수 있어야 한다는 것이었다. 그렇게 간단했다."라고 언급했다.2014 그러나 당시 그들이 가지고 있던 것으로는 그렇게 하는 것이 거의 불가능했을 것이다. 일반적인 SCALP 실행의 처리 시간은 약 15분이었고, 비STEM 사용자가 기본 작업을 위해 사용하기에는 언어가 너무 어려웠다.p=518 문제는 단순히 복잡성뿐만이 아니라 일괄 처리의 전체 개념이었다. 학생들은 천공 카드나 종이 테이프에 프로그램을 준비하고 컴퓨터 운영자에게 제출한 다음, 미래의 어느 시점에 출력을 받았다. 이것은 종종 전체 프로세스를 반복해야 하는 오류를 드러냈다. 그들이 나중에 말했듯이, "한 번 시도하는 데 약 하루가 걸린다면, 학생은 흥미를 잃거나 문제가 무엇이었는지 잊어버릴 것이다. 기껏해야 하루의 결과가 나올 때까지 기다리느라 시간을 낭비할 것이다."p=3이 경우 "he"라는 용어의 사용은 당시 다트머스가 여학생을 받지 않았기 때문에 유일한 가능성이었다는 점에 유의하라. 1959년, 주로 케메니의 수학 교육 혁신가로서의 명성 덕분에 학과는 앨프리드 P. 슬론 재단으로부터 50만 달러의 기부금을 받아 새 학과 건물을 지을 수 있었다.magazine=Time
## 개념 개발
1961년 MIT를 방문하는 동안 그들은 PDP-1과 최근 완료된 실험적인 시분할 운영체제를 소개받았다. 존 매카시는 커츠에게 대중에게 컴퓨팅을 제공하려는 노력에 왜 시분할을 사용하지 않는지 물었다. 커츠는 다트머스로 돌아와 케메니에게 "시분할을 해야 합니다"라고 말했고, 케메니는 즉시 "알겠습니다"라고 답했다.p=3 개념이 작동 가능한지 테스트하기 위한 실험에서 학생들은 5명씩 그룹으로 나뉘어 SCALP를 사용하여 LGP-30을 번갈아 사용했다.p=7 컴퓨터 시간은 15분 세션으로 나뉘었고, 5명으로 구성된 각 그룹은 한 세션을 부여받은 다음 다음 그룹에게 넘겨주었다. 학생들은 일반적으로 단일 세션 동안 두세 번의 "턴어라운드"로 프로그램을 완료할 수 있다는 것을 발견했다. 이는 대화형 시스템이 수백 명의 사용자가 단일 기계를 성공적으로 사용할 수 있도록 할 것임을 분명히 시사했다.p=4 새로 도입된 ASCII를 전화선을 통해 사용하는 텔레타입 모델 33 전신타자기의 등장은 접근성 문제를 해결했다. 더 이상 프로그래머가 카드나 종이 테이프에 프로그램을 제출할 필요 없이 모델 33을 사용하여 컴퓨터에 직접 입력할 수 있게 되었다. 필요한 것은 시분할 시스템을 호스팅할 수 있을 만큼 빠른 새로운 기계와 프로그래머가 사용할 간단한 언어뿐이었다.p=519 간단한 언어에 대한 논의가 진지하게 고려되기 시작했을 때, 케메니는 즉시 새로운 언어를 작성할 것을 제안했다. 커츠는 FORTRAN이나 ALGOL의 축소 버전에 더 관심이 있었다.p=6 그러나 이 언어들은 너무 많은 특이성을 가지고 있어서 커츠는 케메니에게 동의하게 되었다. p=9 시간이 지나면서 네 가지 핵심 요소가 부상했다. 시스템은 시분할을 사용할 것이고, 새로운 언어가 필요할 것이며, 사용자를 시스템에 참여시키기 위해 새로운 과정이 다른 과목의 보조적인 형태로 프로그래밍을 소개할 것이고, 마지막으로 터미널은 모든 사용자에게 개방될 것이다.pp=519-520
## 초기 버전
이 프로젝트는 1963년 9월에 공식적으로 시작되었다. 목표는 상용 컴퓨터에서 언어와 운영 체제를 개발하는 것이었다.p=9 1964년 초, 그들은 미국 국립과학재단(NSF)에 자금 지원을 요청했다. NSF는 시분할 시스템에 대한 제안과 언어에 대한 제안을 동료 검토를 위해 보냈다. 검토자들은 그들이 시도하는 것의 어려움을 이해하지 못한다고 invariably 제안했다. 이러한 부정적인 의견에도 불구하고 NSF는 두 가지 보조금을 모두 진행했다. 제너럴 일렉트릭에서 제공하는 교육 할인으로 인해 GE-225 컴퓨터를 구매하게 되었는데, 이는 "IBM을 사용하지 않는" 것이 여전히 위험했던 시대였다.p=5 GE-225는 훨씬 더 간단한 DATANET-30(DN-30) 기계와 두 기계에 연결된 하드 드라이브와 짝을 이루어 프로그램을 공유했다.p=520 DN-30은 당시 프로그래밍 설명서가 전혀 없었는데, 공장에서 프로그램이 미리 설치되지 않은 상태로 출하될 의도가 없었기 때문이다.p=5 여기에는 한 가지 핵심 기능인 더 큰 GE 기계에 대한 직접 메모리 접근(DMA) 접근이 포함되었다. 이는 작은 메시지를 기계들 사이에 빠르게 주고받을 수 있게 하여 사용자가 입력한 명령을 225가 즉시 수행할 수 있도록 했다.url=http://dtss.dartmouth.edu/scans/D-30%20Manuals/D-30manual.pdf 시스템은 DN-30이 터미널을 실행하고 사용자의 작업을 디스크에 저장하는 방식으로 작동했다. 사용자가 `RUN`을 입력하면 DN-30은 DMA를 사용하여 해당 명령을 GE-225로 보냈다. 225는 해당 파일을 읽고 컴파일하고 실행하며 결과를 DN-30으로 다시 전달하여 터미널에 출력을 인쇄한다.Dartmouth Time Sharing System (DTSS). March 1995. Retrieved 27 May 2016 1963년 여름, 컴퓨터 구매를 기다리는 동안 GE는 GE-225 중 하나에 대한 접근을 제공했다. 케메니는 프로토타입 컴파일러 작업을 시작했다. 마이클 부시와 존 맥게치는 그해 가을에 운영 체제 설계를 시작했다. 이 기간 동안 언어와 OS는 광범위하게 수정되었지만, 기본적인 목표는 동일하게 유지되었고 그해 11월 초안 형태로 발표되었다.p=520 학교의 기계는 1964년 2월 마지막 주에 도착했고,p=224 3월 중순에 작동했으며,p=10 4월 1일에 공식적으로 인계되었다. 그 시점에는 운영 체제 설계가 이미 잘 개발되어 있었다. 운영 체제 작업을 하던 대부분의 학생 프로그래머들은 평소 수업 외에 주 50시간씩 일했다.p=224 언어는 다른 225 기계에서 빌린 시간으로 병렬로 개발되었다.p=225 OS는 4월에 완성되었고, 3대의 모델 33 터미널에서 실행되는 전체 시스템은 월말까지 준비되었다. 존 케메니와 존 맥게치는 1964년 5월 1일 오전 4시 ET에 첫 번째 베이직 프로그램을 실행했다.p=10 첫 프로그램이 무엇이었는지는 완전히 명확하지 않다. 다트머스를 포함한 많은 출처는 이것이 간단한 프로그램이었다고 주장한다.website=Dartmouth ITS PRINT 2 + 2 나중에 이 언어의 역사는 두 개의 프로그램이 동시에 입력되었는데, 하나는 케메니가, 다른 하나는 익명의 프로그래머가 입력했다고 말한다. 그들은 프로그램을 입력하고 동시에 RUN을 입력했으며 정확한 결과를 받았다.pp=16,22 커츠는 일찍 일어나는 사람이어서 이미 집에 갔고 "모든 재미를 놓쳤다"고 한다.p=16 다음 한 달 동안 시스템은 수치 해석 수업에서 시스템에서 프로그램을 테스트하는 방식으로 테스트되었다. 이 기간 동안 기계는 평균 5분 동안 제대로 작동했다.p=226 문제는 빠르게 해결되었고, 6월에는 터미널 수를 11개로 늘리기로 결정했다. 이 시기에 더 빠른 GE-235가 225를 대체했다. 가을에는 20개의 터미널이 사용되었다.p=520 GE는 GE-235와 DN-30의 조합을 GE-265라고 부르기 시작했으며,p=21 모델 번호를 합쳤다. GE는 GE-265를 약 75대 더 만들었고,p=22 그 중 많은 수가 서비스 뷰로 사업용이었다. GE는 이들을 Mark I 시분할 시스템이라고 불렀다.pp=532,534
## 새로운 시스템
프로그램의 원래 목표 중 하나는 다른 수업 과정에 프로그래밍을 통합하는 것이었다. 이것은 성공적이었지만, 시스템에 상당한 부담을 주었고 미래 성장을 위한 여지가 없다는 것이 분명해졌다.p=11 1965년, 팀은 GE에 지속적인 개발 지원을 요청했다. 9월에 루이스 레이더 부사장은 약 10배 더 빠르고 두 개의 CPU를 포함하는 새로운 GE-635를 제안했다. 또한, 두 번째 DN-30이 추가되어 더 많은 회선을 처리할 수 있게 되었으며, 동시에 150명의 사용자를 지원할 수 있게 되었다.p=11 이를 수용하기 위해서는 265가 실행되던 칼리지 홀 지하보다 더 큰 시설이 필요했다. 1922년 졸업생인 피터 키위트가 NSF의 추가 지원과 함께 키위트 컴퓨팅 센터 건설을 주도했으며, 이 센터는 1966년 12월에 문을 열었다.p=11 이 기계가 도착하기를 기다리는 동안, 1966년 여름과 가을에 로마 항공 개발 센터의 GE-635가 MOLDS, 즉 "다중 사용자 온라인 디버깅 시스템"을 개발하는 데 사용되었다. GE-635는 1967년 초에 작동되었고, MOLDS를 사용하여 새로운 운영 체제는 9월에 완전히 작동되었으며, 이때 GE-265는 매각되었다.p=533 GE는 다트머스가 새로운 베이직 버전을 개발하고 GE는 운영 체제 버전의 새로운 릴리스를 개발하는 더 넓은 계약의 일환으로 3년 동안 기계를 무상으로 제공했다.p=533 이 협력은 성공적임이 입증되었다. GE는 이 기계들을 Mark II 시분할 시스템으로 배포하기 시작했고,p=534 10년이 끝날 무렵에는 세계에서 가장 큰 시분할 공급업체 중 하나가 되었다.p=11 이 "1단계" 시스템이 작동된 후, 다트머스 팀은 "2단계", 즉 이상적인 운영 체제 개발을 시작했다. 이것은 1969년 3월에 설치되었고, 그 직후 다트머스 시분할 시스템으로 이름이 변경되었다. 3년 기간이 만료되자 GE는 이 기계를 대학에 기증했다. 두 팀은 계속 연락을 유지했고, 관계를 지속하기 위한 여러 성실한 시도가 있었지만, 추가 협력은 거의 이루어지지 않았고 파트너십은 1972년 9월 20일에 공식적으로 종료되었다.p=533
## 사용자층 확대
1968년 보고서에 따르면 학생의 80%, 교수진의 70%가 시스템을 어느 정도 사용하고 있었다. 병원에서 경영 대학원까지 캠퍼스 곳곳에 수백 대의 단말기가 설치되었다. CPU 시간의 57%는 수업 과정에, 16%는 연구에, 나머지 27%는 "여가 활동"에 사용되었다. 다트머스는 사용자들이 컴퓨터를 직접 사용하고 컴퓨터에 대한 두려움을 극복하는 방법으로 게임을 적극적으로 장려했다.p=17 또 다른 NSF 보조금을 시작으로, 1967년 다트머스는 지역 고등학교를 포함한 캠퍼스 밖 장소에도 단말기를 배치하기 시작했다. 사용자 수 면에서는 이 단말기들이 전체 사용자의 69%를 차지했지만, 컴퓨터 시간은 더 적게 사용했다.p=17 1971년까지 뉴저지주와 뱅고어 (메인주)만큼 멀리 떨어진 곳에도 79개의 원격 단말기가 있었다. 이들은 단일 음성 등급 전화선을 통해 최대 12개의 단말기를 지원할 수 있는 멀티플렉서 시스템의 지원을 받았다. 또한, 여러 회선은 모뎀을 사용하여 다이얼업으로 사용할 수 있었다.p=18
## 영향
시분할 시스템은 1960년대 주요 연구 분야였으며, 컴퓨터 산업의 많은 사람들이 컴퓨팅 파워가 저렴하고 광범위하게 보급될 것이라고 예측했다. 이는 존 매카시가 "언젠가 전화 시스템이 공공 서비스이듯이 컴퓨팅도 공공 서비스로 조직될 수 있다"고 가장 유명하게 말했다.location=Cambridge DTSS에서는 다른 언어도 사용 가능했지만, lc=y DTSS 프로그램의 98%는 BASIC으로 작성되었다.lccn=72-1176 BASIC 덕분에, 작업을 코딩하는 데 너무 오래 걸려 컴퓨터로 해결하기 어려웠던 최종 사용자들에게 컴퓨터 서비스가 훨씬 더 접근하기 쉬워졌다. 이는 작은 또는 중간 규모의 작업을 해결하기를 원하고 성능 자체에는 크게 신경 쓰지 않는 사용자 시장을 위해 특별히 설계된 컴퓨터를 도입하는 많은 제조업체로 이어졌다. 특히, 이 시장을 직접 겨냥한 두 대의 기계는 "지금까지 개발된 가장 널리 사용되는 소규모 시분할 시스템"이 되었다.p=534 HP 2000은 HP 시분할 베이직을 실행했는데, 이는 DTSS 설정과 거의 동일한 BASIC과 시분할 운영 체제의 조합이었다. 이 시스템은 최대 32명의 동시 사용자를 지원했으며, 저가형 HP 2100 CPU를 사용하여 원래 GE-265 설정의 Datanet-30과 동일한 방식으로 터미널을 실행했고, 프로그램은 동일한 기계의 고급 모델에서 실행되었는데, 일반적으로 더 많은 코어 메모리를 가지고 있다는 점에서 차이가 있었다. HP의 BASIC은 프로그램을 저장하기 위해 반컴파일된 토큰화된 형식을 사용했는데, 이는 로딩 시간을 개선하고 "컴파일" 시간이 0초임을 의미했다.publisher=Hewett Packard 디지털 이큅먼트 코퍼레이션은 기존 PDP-11 라인에 새로운 RSTS/E 운영 체제와 BASIC-PLUS를 기반으로 한 단일 기계 제공이라는 다른 접근 방식을 취했다. BASIC-PLUS는 5판을 더 면밀히 따랐으며, `MAT` 명령을 포함했지만, 다트머스 컴파일러나 HP의 토큰화된 형식과 달리 순수한 인터프리터로 구현되었다. 또한 JOSS 모델을 따르는 여러 제어 구조를 포함했는데, 예를 들어 PRINT I IF I > 10과 같았다.publisher=DEC Tymshare SUPER BASIC도 JOSS 스타일 구조와 행렬 계산을 지원했지만, 원래의 컴파일-앤-고 작동을 유지했다. 이 시대의 거의 모든 공급업체가 이 동일한 문제에 대한 어떤 해결책을 제시했지만, 원래와 그렇게 밀접하게 유사하지는 않았을 수 있다. 1973년 커츠가 BASIC에 대한 ANSI 표준 제정을 고려하기 시작했을 때, BASIC을 사용할 수 있는 시분할 서비스 뷰로의 수가 다른 어떤 언어보다 많다는 것을 발견했다. 불행히도, 이 성공은 또한 문제이기도 했다. 그 시점에는 너무 많은 변형이 있어서 표준이 불가능해 보였다.p=534
## BASIC의 게임
케메니는 DTSS 플랫폼에서 게임을 적극적으로 장려했으며, DTSS 시스템 성공의 주요 이유 중 하나로 간주했다. 그는 초기의 메인프레임 게임의 저자였을 가능성이 높다. 케메니는 자신의 공로를 인정하지 않았지만, 나중에 FTBALL에 대해 "1965년 특정 다트머스-프린스턴 경기에서 다트머스가 램버트 트로피를 획득한 후 일요일에 작성된 것이다. 기념 프로그램의 일종이다"라고 언급했다. 이 게임은 강력한 우승 후보였던 프린스턴에 대한 이변이었다.url-status=deadp=64 시스템이 확장되면서, 특히 베이직에 문자열 처리 기능이 추가된 후, DTSS 시스템은 많은 텍스트 기반 게임 개발의 주요 플랫폼이 되었다. 1970년대 초, 피플스 컴퓨터 컴퍼니는 이들을 잡지에 게시하기 시작했으며, 일반적으로 더 널리 사용되는 HP 베이직으로 변환되었다. 이 목록 중 다수는 1975년 저서 『What to do after you hit return』에 수록되었다. 비록 이들은 HP 베이직 형태로 출판되었지만, 대부분은 DTSS 또는 캘리포니아의 로렌스 과학관에 설치된 유사한 기계인 DECISION에 그 역사를 두고 있다.title= What to do after you hit return 더 유명한 컬렉션은 1978년의 베이직 컴퓨터 게임으로, 책에 있는 프로그램의 절반가량은 다트머스에서 작성되었거나(케메니의 또 다른 프로그램인 Batnum 포함), 1968년 이후 연결된 많은 고등학교 중 하나에서 작성되었다. 특히 다작한 고등학교는 렉싱턴 고등학교였지만, 다른 많은 학교들도 나타난다. 많은 프로그램은 원본 위치를 나열하지 않지만, 학교나 프로젝트 SOLO와 같은 공공 프로젝트를 통해 시스템에 연결되었을 가능성이 있는 저자들의 것이다.1978 스티븐 J. 갈랜드와 존 맥게치가 DTSS용 MOTIF 다중 온라인 터미널 인터페이스를 개발했을 때 다인용 비디오 게임이 BASIC에서 가능해졌다. 게임을 시작하려면 사용자는 RUN 대신 LINK와 세션 이름을 입력했고, 다른 사용자는 JOIN과 세션 이름을 입력하여 게임에 연결할 수 있었다. 그런 다음 MOTIF는 BASIC 프로그램의 입력 및 출력을 다중화하여 각 입력 및 출력 줄의 시작 부분에 문자열 식별자를 추가했다. 이 인터페이스로 개발된 첫 번째 프로그램은 2인용 FTBALL 버전과 5인용 포커 게임이었다. 더 진지한 것은 아모스 턱 경영대학원 학생들이 단일 제품의 생산 및 마케팅에서 경쟁할 수 있도록 한 경영 게임이었다.John S. McGeachie, "Multiple terminals under user program control in a time-sharing environment", Communications of the ACM 16:10, October 1973, pages 587&-590.
# 버전

## 1판
소급하여 버전 1로 알려진 원래 버전은 `LET`, `PRINT`, `END`, `FOR...NEXT`, `GOTO`, `GOSUB...RETURN`, `IF...THEN`, `DEF`, `READ`, `DATA`, `DIM`, `REM` 명령을 지원했다. 기본 수학 명령인 +, -, *, /와 함께 지수를 위한 위쪽 화살표도 포함했다("...전신타자기에서 위첨자를 인쇄하는 것이 불가능했기 때문").p=523 현대 버전에서는 위쪽 화살표가 일반적으로 "모자" 문자 ^로 대체된다. 지수는 계산 전에 숫자의 절대값을 취했으므로, -X^3을 계산하려면 X*X*X를 사용해야 했다. 지수 함수에 또 다른 문제가 있었는데, -X^2를 올바른 연산의 우선순위인 -(X^2)와 달리 (-X)^2로 처리했으며, 이는 세 번째 릴리스까지 수정되지 않았다.p=523 `INT()` 함수는 항상 0으로 잘랐다.p=524 이 언어는 자체적인 몇 가지 특이점을 가지고 있었다. 나중 버전과 달리, `LET` 명령은 다른 명령이 없는 모든 문장에 필수였으므로 1=10 A=5*5는 이 버전에서 유효하지 않았다.p=524 `PRINT` 문은 여러 변수를 인쇄할 때 쉼표를 사용하여 다섯 개의 "영역" 중 다음 영역으로 이동했다. 프롬프트와 단일 값을 인쇄하는 경우에는 쉼표가 필요하지 않았으므로 PRINT "value of A is "A는 유효했다. 다소 숨겨진 기능은 모든 변수가 `DIM`을 사용하여 그렇게 선언하지 않아도 최대 10개의 요소(1부터 10까지의 첨자, 2판에서는 0부터 9까지로 변경됨)의 배열(벡터)을 나타낼 수 있었다는 것이다. `DIM`은 다른 벡터 크기가 필요한 경우에만 필요했다.p=525이 기능은 다트머스를 기반으로 한 대부분의 BASIC에서 발견되었지만, 독립적으로 생성된 BASIC에서는 드물었다. 변수 이름은 단일 문자 또는 숫자 뒤에 문자가 오는 형태로 제한되었다(286개의 가능한 변수 이름). 사용자 함수는 단일 문자만 가질 수 있었으므로 FNA부터 FNZ까지였다. 모든 연산은 부동소수점으로 수행되었다. GE-225 및 GE-235에서는 약 30비트(대략 10자리)의 정밀도를 생성했으며, 밑 2의 지수 범위는 -256에서 +255였다.url=https://www.dartmouth.edu/basicfifty/commands.html#:~:text=All%20arithmetic%20was%20done%20in,of%20%2D256%20to%20%2B255.&text;=Ten%20numeric%20functions%20were%20provided. 또한, GE-235의 워드 크기가 20비트이고 6비트 문자 코드를 사용했기 때문에, 언어는 3글자 함수 이름 사용을 고수했는데, 이는 20비트 워드에 3개의 6비트 문자를 저장할 수 있었기 때문이었다(18비트 사용). 이것이 BASIC 함수가 `INT` 또는 `SQR`와 같이 3글자인 이유이며, 이는 GE-235를 떠난 후에도 오랫동안 여러 BASIC 언어에서 유지되었다.p=524
## 2판, CARDBASIC
BASIC의 2판(당시에는 그렇게 불리지 않았지만)은 최소한의 변경만 이루어졌다. 1964년 10월에 출시되었으며, 배열을 1이 아닌 0에서 시작할 수 있었고(다항식을 나타내는 데 유용함), `PRINT` 문에 세미콜론(;)을 추가했다.p=526 항목 사이에 공백을 두는 나중 구현과 달리, 세미콜론은 인쇄를 다음 세 문자 배수로 이동시켰는데, 이는 기존 쉼표 구분자보다 한 줄에 더 많은 숫자를 "압축"하는 데 유용했다.Man4 세 문자 크기는 GE-235의 20비트 워드 크기의 부작용으로, 세 개의 6비트 문자를 저장했다. 다음 세 문자 열로 건너뛰는 것은 단순히 메모리의 다음 워드로 이동함으로써 이루어졌다.p=24 10월 버전에는 CARDBASIC에 대한 별도의 정의도 포함되어 있었는데, 이는 단순히 카드 기반 워크플로에서 사용하기 위한 BASIC 버전이었다. CARDBASIC은 대화형 버전과 거의 동일했지만, 0 기반 배열을 포함하지 않는다는 점이 예외였다. 언어의 미래에 더 중요한 것은 CARDBASIC이 숫자 행렬과 함께 작동하는 `MAT` 명령을 추가했다는 것이다. CARDBASIC은 더 이상 개발되지 않았는데, BASIC의 전체 아이디어가 대화형이었기 때문이었다.p=526
## 3판
1966년에 출시된 3판은 "판(edition)" 명칭을 처음 사용했으며, 곧 출시될 새로운 GE-635 컴퓨터에서 실행될 목적으로 특별히 설계되었다. 이 버전에는 CARDBASIC의 `MAT` 함수가 포함되어 있으며, 이제 0을 첨자로 사용할 수 있다.p=527 새로운 `SGN` 함수는 인수의 부호(양수?0, 음수?1)를 제공했으며, `RESTORE`는 `READ/DATA`의 위치를 "되감기"하기 위해 추가되었다. 지수화 문제가 해결되어 -X^2는 -(X^2)로 해석되었다.p=527 또한, `INT` 함수는 0으로 잘라내는 것과 달리 진정한 바닥 함수로 변경되어 `INT(X+0.5)`로 반올림을 구현할 수 있게 되었다.p=524 이 버전의 주요 변경 사항은 새로운 `INPUT` 문이었다. 이 문은 숫자 값을 구문 분석하여 처음으로 실행 중에 언어를 진정으로 대화식으로 만들었다. 이전에는 실행 중에 제어할 수 있는 유일한 방법은 모니터에서 `STOP`을 입력하는 것이었다. 또한, 시스템은 이제 루프 들여쓰기를 허용하고 장려했는데, 이 기능은 다른 대부분의 BASIC 버전에서는 볼 수 없었다.p=528
## 4판
3판은 GE-235의 수명 동안 1967년 가을까지 사용되었다. 그러나 GE-635를 받을 계획이 세워지면서 1967년 봄에 635에서 실험적인 버전이 만들어졌다. 이 버전은 GE와 다트머스의 파트너십으로, GE는 자체 Mark 1 BASIC 노력에서 새로운 운영 체제와 BASIC의 여러 기능을 기여했다.p=528 이 버전은 처음에는 3판의 보충 자료로 출판되었으며, `RND` 함수를 "시드"하는 `RANDOMIZE` 명령과 FORTRAN의 유사한 기능과 밀접하게 일치하는 `ON...GOTO` "계산된 goto"를 추가했다. 이 버전은 또한 `ON...THEN`을 허용했는데, `IF...THEN`이 `GOTO`를 요구하지 않는다면 여기에서도 요구되지 않을 것이라고 주장했다. 새로운 `TAB` 함수는 인쇄를 0에서 74까지 주어진 열로 이동시켰다.p=528 또 다른 내부 변경 사항은 `MAT`를 다시 1 기반으로 변경하는 것이었다. 0번째 인덱스를 사용할 수는 있었지만, 일반적으로 다양한 명령에 의해 무시되었다.p=529 이 버전의 주요 추가 기능은 문자열 변수였으며, 문자열을 저장할 수 있는 `READ/DATA` 문 변경과 대화식으로 문자열을 읽을 수 있는 `INPUT` 문 변경이 있었다. 문자열 시스템의 한 가지 특징은 비교에서 후행 공백이 의도적으로 무시되어 "YES"와 "YES "가 동일하게 간주되었다는 것이다.p=66 이는 나중에 심각한 오류로 인식되었다.p=529 문자열 변수는 달러 기호, 예: A$로 표시되었는데, 이는 단순히 대부분의 키보드에서 찾을 수 있는 문자가 부족했기 때문이다. 누군가 $가 "String"의 S처럼 보인다고 지적했고, 그것으로 결정되었다.p=28 문자열 조작은 새로운 CHANGE 명령을 통해 처리되었다. 이 명령은 변수 내의 문자열 값을 해당 ASCII 값 세트로 변환했다. 그런 다음 숫자 배열을 조작하고 문자열로 다시 변환할 수 있었다. 예를 들어, 이 코드는 콘솔에 "is"를 출력한다. 1= 100 LET S$ ="Now is the time" 110 CHANGE S$ TO S 120 LET T(1) = S(5) 130 LET T(2) = S(6) 140 LET T(0) = 2 150 CHANGE T TO T$ 160 PRINT T$ 140번 줄은 문자열 길이를 2로 설정하는데, 이는 사용자가 관리해야 한다. 첫 번째 문자는 T(1)에 있다. 이 시스템은 유연하지만, 사용하기에 결코 편리하지 않았다. 나중 버전에서는 새로운 기능으로 이를 해결했다.p=29 이 버전의 사소한 변경 사항은 `PRINT` 문에서 세미콜론을 공백 없이 출력을 "밀착 포장"하도록 변경했고,p=24p=64 아포스트로피를 짧은 형식의 `REM`으로 사용했다.p=52아포스트로피가 이전 버전에서 사용되었는지는 명확하지 않으며, 4판 매뉴얼에서 처음으로 명시적으로 언급되었다. 공식 4판은 1968년이 되어서야 나왔는데, 이전 추가 기능 외에 몇 가지 새로운 기능을 추가했다. 여기에는 `DEF` 명령으로 여러 줄 함수를 정의하는 기능과 ASCII와 유사한 코드를 배열로 취급하여 전체 문자열을 반복하지 않고 개별 문자를 조작할 수 있는 강력한 `CHANGE` 문이 포함되었다.p=529 이것은 또한 유일한 문자열 조작 함수였다. 단일 문자나 부분 문자열을 추출하려면 `CHANGE`를 사용하여 숫자 배열로 변환하고, 해당 배열을 조작한 다음 다시 변환해야 했다. 이것이 MAT가 다시 1 기반이 된 이유였다. 문자열의 길이는 0 위치에 배치되었고, 일반적으로 무시되어야 했다.p=67
## 5판
1970년 후반의 5판은 1969년 2월과 4월의 4판에 대한 두 가지 보충 자료로 다시 시작되었다.p=529 주요 변경 사항은 파일 처리 기능의 도입이었다. 이전에는 프로그램에서 사용해야 하는 사전 정의된 모든 데이터는 DATA 줄에 배치된 다음 READ 명령을 사용하여 한 번에 하나씩 읽어야 했다. 이 기능은 유사한 방식으로 파일을 읽는 데 사용될 수 있었다. INPUT 명령은 이제 파일에서 단일 항목을 읽을 수 있었고 PRINT는 하나를 쓸 수 있었다.p=31 파일은 새로운 FILES 키워드를 통해 열렸으며, 그 뒤에 파일 이름을 설명하는 문자열 상수의 목록이 이어졌다. 이들은 상수였으므로 파일 이름을 변경하려면 코드도 변경해야 했다. 이름에는 숫자가 할당되었고, 첫 번째 이름이 파일 #1이 되는 식이었다. 두 가지 파일 형식(임의 접근 및 선형)이 지원되었다. 선형 파일은 오늘날 텍스트 파일과 동일하게 취급되었으며, LINPUT #1: A$를 사용하여 텍스트 한 줄을 문자열 변수로 읽은 다음 PRINT A$를 사용하여 터미널에 출력할 수 있었다.p=31 나중 버전에서는 FILE $1,name$을 추가하여 문자열로 파일을 지정할 수 있었지만, 한동안 이 형식으로 사용하고 있음을 나타내기 위해 프로그램 상단에 FILES *가 필요했다.p=32 랜덤 액세스 파일의 경우, 이름은 내부 데이터 유형을 지정해야 했다. %는 이진 데이터를 포함함을 나타내고, $num은 최대 길이가 num인 문자열로 읽어야 함을 나타냈다.p=31 READ 및 WRITE는 RESET 명령으로 랜덤 액세스 파일의 어느 위치에서나 위치를 지정할 수 있었고, 현재 위치는 LOC 함수로, 파일 길이는 LOF로 반환되었다. 순차 읽기 중에는 `IF END THEN...`을 사용하여 파일 끝에 도달했는지 여부를 테스트할 수도 있었다.p=530 또 다른 주요 변경 사항은 하나의 BASIC 프로그램이 CHAIN 명령을 사용하여 다른 프로그램을 호출하고, COMMON 목록을 사용하여 변수를 전달할 수 있게 된 것이었다. 나중에 이 기본 개념에 여러 문제가 있다는 것이 밝혀졌지만, 그럼에도 불구하고 일부 큰 프로그램을 작성하는 데 사용되었다.p=530 문자열 처리 기능이 크게 업데이트되었다. 새로운 SEG$ 명령은 다른 문자열에서 잘라낸 새로운 문자열을 반환했다. 위 예시에서 "is" 문자열은 더 큰 문자열에서 추출된다. 새로운 명령을 사용하면 이를 basic으로 줄일 수 있는데, 이는 대부분의 방언에서 볼 수 있는 MID$ 함수(MID$(S$,5,2))와 유사하게 작동한다. SEG$는 첫 번째 및 마지막 인덱스를 사용하고, MID$는 첫 번째 인덱스와 길이를 사용한다. LEN은 문자열의 길이를 반환했는데, 이는 이제 내부적으로 처리되었고 대부분의 경우 계산이 필요하지 않았으며, POS는 다른 문자열 내에서 한 문자열의 위치를 반환했는데, 이는 대부분의 방언에서 SUBSTR로 처리되었다. 문자열 연결을 위해 앰퍼샌드(&)가 도입되었다.p=29 그 외에도 사소한 변경 사항이 많이 추가되었다. 이 중에는 이전 버전의 1차원 배열과 달리 2차원 문자열 배열, 그리고 DEF를 사용하여 수학 함수뿐만 아니라 문자열 기반 함수도 정의할 수 있는 기능이 있었다. 새로운 시스템 지향 함수로는 시간 및 날짜를 다루는 CLK$, DAT$, 경과 시간을 반환하는 TIM, 오늘날의 사용자 이름에 해당하는 사용자 번호를 반환하는 USR$가 포함되었다. 새로운 문자열 함수로는 STR$, VAL, ASC가 포함되었는데, 이는 현대 BASIC 방언에서 흔히 볼 수 있다. REM의 줄임말로 '도 이 버전에 나타났다.p=530
## 6판
6판 작업은 5판이 확정되기 전인 1969년 가을에 시작되었다. 새로운 버전에 대한 완전한 사양이 미리 작성되었다. 이는 사양 문서가 컴파일러의 변경 사항을 기반으로 했던 이전 버전과 대조된다. 이 버전은 케메니와 커츠뿐만 아니라 교수진으로 돌아온 전 학생들인 스티븐 갈랜드, 존 맥게치, 로버트 하그레이브스 등 여러 명이 작업했다. 충분한 시간을 들여 성숙되었으며, 1971년 여름에 3개월 동안 베타 버전이 실행된 후 마침내 1971년 9월 21일에 출시되었다. 이러한 성숙의 결과로 커츠는 이를 "다트머스가 작성한 가장 잘 설계되고 가장 안정적인 소프트웨어 시스템일 것"이라고 묘사했다.p=531 가장 큰 변화 중 하나는 이전의 `CHAIN` 개념이 훨씬 더 잘 정의된 `CALL`로 대체된 것이었다. 이는 `GOSUB`와 유사하게 작동했지만, 줄 번호 대신 함수 이름을 참조했다. 함수는 `SUB...SUBEND`를 사용하여 정의되었으며, `COMMON` 선언을 통해 전역 변수를 사용하는 대신 호출에서 임의의 매개변수를 받았다. 또 다른 주요 변경 사항은 대부분의 현대 BASIC에 있는 `OPEN`과 유사한 `FILE` 명령으로 생성된 파일 핸들(숫자)을 사용하는 것이었다. `PRINT USING`은 FORTRAN과 다소 유사한 방식으로 서식 있는 출력을 제공했으며,p=134 LINPUT은 해석 없이 입력을 받아 쉼표, 세미콜론, 심지어 BASIC 코드까지 입력할 수 있게 했다.p=26 6판은 본질적으로 원래 BASIC 개념의 마지막 버전이었다. 그것은 오랫동안 변하지 않았다. 이후 버전은 상당히 다른 언어였다.p=531
## SBASIC
1976년, 스티븐 갈랜드는 구조적 프로그래밍에 대한 여러 추가 기능을 모아 다트머스 구조적 베이직(Dartmouth Structured BASIC), 즉 SBASIC을 만들었다.1976 주요 목표는 `IF...THEN` 및 `GOTO` 기반의 제어 구조를 다양한 블록 지향 구조로 대체하는 것이었다. 이는 SBASIC 소스 코드를 가져와 6판 베이직으로 변환한 다음, 정상적으로 컴파일하고 실행하는 전처리기를 사용하여 이루어졌다. SBASIC은 또한 다른 프로그래머들이 추가했던 `PLOT` 명령을 기반으로 한 여러 그래픽 기능을 추가했다.p=1 블록 구조는 알골 68의 경우처럼 일치하는 문장으로 종료되었는데, 이는 파스칼이나 C와 같은 언어에서 발견되는 일반적인 블록 구조와는 대조적이었다. 예를 들어, `DO WHILE...`은 `LOOP`로 끝날 때까지 여러 줄에 걸쳐 있었다.p=4 `DO` 루프는 `WHILE` 또는 `UNTIL`을 제거하고 조건문을 `LOOP`의 하단에 배치하여 하단에서 종료할 수도 있었다. 무한 루프는 `DO FOREVER` 또는 `LOOP FOREVER`를 사용하여 지원되었다.p=5 "원본" 다트머스 베이직은 `THEN` 뒤에 문장을 허용하지 않고, 오직 분기할 줄 번호만 허용했다. SBASIC은 어떤 문장이든 허용했으므로, 예를 들어 basic과 같은 간단한 비교를 허용했다.p=524 FORTRAN 스타일의 "계산된 IF"는 나중 버전에서 `ON...GOTO` 명령으로 다시 도입되었다. 변수 이름은 A부터 Z, A0부터 A9, B0부터 B9, ..., Z0부터 Z9까지로 제한되어 최대 286개의 서로 다른 변수 이름을 사용할 수 있었다. I부터 N까지의 변수를 정수로, 나머지를 부동소수점으로 설정하는 FORTRAN의 이상한 시스템은 제거되었고, 모든 변수는 부동소수점으로 가정되었으며 최대 10개의 요소를 가진 배열로 차원화되었다. `DIM` 명령은 배열이 10개 이상의 요소를 가질 경우에만 필요했다.p=524 배열 이름은 A부터 Z까지만 허용되었다.
## BASIC 명령문 목록
; `DEF` : 한 줄 함수 정의 ; `DIM` : (dimension의 약어) 배열의 크기 정의 ; `END` : 프로그램의 끝 정의 ; `STOP` : 텍스트 끝 전에 프로그램 중지 ; `FOR / TO / STEP` : 루프 정의 ; `NEXT` : 루프의 끝 표시 ; `GOSUB` : 간단한 서브루틴으로 제어권 이전 ; `RETURN` : 간단한 서브루틴에서 제어권 반환 ; `GOTO` : 다른 명령문으로 제어권 이전 ; `IF / THEN` : 의사 결정 ; `LET / =` : 공식 결과를 변수에 할당 ; `PRINT` : 결과 출력 ; `DATA` : 프로그램 내에 정적 데이터 저장 ; `READ` : DATA 명령문에 저장된 데이터 입력 ; `REM` : 주석 ("REMark") 또한 부동 소수점 숫자 변수와 산술 연산을 구현했다.
## 연산자 목록
{|class="wikitable" |- !colspan="2"|산술 연산자 !colspan="2"|관계/논리 연산자 |- ||`-` ||부정 (단항 연산자) ||`=` ||같음 |- ||`+` ||덧셈 ||`<>` ||같지 않음 |- ||`-` ||뺄셈 (이항 연산자) ||`` ||보다 큼 |- ||`?` ||지수화 ||`=>` ||보다 크거나 같음 |- !colspan="4"|그룹화 연산자 |- ||`( )` |colspan="3" |그룹화 |}
## 함수 목록
; `ABS` : 절댓값 ; `ATN` : 역탄젠트 값 (결과는 라디안) ; `COS` : 코사인 값 (인수는 라디안) ; `EXP` : 지수 값 ; `INT` : 정수 값 ; `LOG` : 자연 로그 값 ; `RND` : 난수 값 ; `SIN` : 사인 값 (인수는 라디안) ; `SQR` : 제곱근 값 ; `TAN` : 탄젠트 값 (인수는 라디안)
# 예시
초기 버전의 BASIC은 외부 파일을 읽고 쓰는 기능이 없었다. 일반적으로 파일에서 읽어올 데이터 목록을 나타내기 위해 BASIC은 `DATA` 키워드를 포함했는데, 이는 줄 길이 제한까지 임의로 긴 요소 목록을 따를 수 있었다. `DATA`는 실행 불가능했으며, 만나면 건너뛰어졌다. `READ` 명령은 내부 포인터로 `DATA` 요소의 전체 컬렉션 내에서 위치를 추적하며 데이터를 하나씩 사용했다. 버전 3에서는 프로그램의 첫 번째 `DATA` 명령으로 포인터를 재설정하는 `RESTORE` 명령이 추가되었다. 이 예시에서 "첫 세 데이터 값은 각각 X, Y, Z로 읽어 들인다. -1 값은 N으로 읽어 들인다. 다음 11개의 값, .1부터 .3까지는 배열 B의 11개 요소로 읽어 들인다."pages=3–24 15 READ X, Y, Z 20 READ N 24 FOR I=0 TO 10 25 READ B(I) 26 NEXT I 40 DATA 4.2, 7.5, 25.1, -1, .1, .01, .001, .0001 45 DATA .2, .02, .002, .0002, .015, .025, .3, .03, .003 대부분의 후속 BASIC과 달리 다트머스 BASIC은 3판부터 `MAT`라는 행렬 키워드를 가지고 있었는데, 이는 다른 여러 명령 앞에 붙어 단일 명령으로 전체 데이터 배열에 대해 작동할 수 있었다. 이 예시는 1968년 매뉴얼에서 가져온 것으로,BASIC, 4th Edition, 1968 date=2012-03-29, page 53 `MAT INPUT V`는 일련의 변수를 입력하는 데 사용된다. 사용자가 한 줄에 아무것도 입력하지 않으면 이 프로세스는 종료되고, 총 요소 수는 `NUM` 의사 변수로 접근된다.`NUM`이 `LEN()`처럼 함수로 구현되지 않은 이유는 미스터리이다. 그런 다음 코드는 행렬의 모든 개별 요소를 합산하고 평균을 계산한다. 3판은 또한 들여쓰기를 추가했는데, 여기서는 루프 구조를 명확히 하는 데 사용된다. 5 LET S = 0 10 MAT INPUT V 20 LET N = NUM 30 IF N = 0 THEN 99 40 FOR I = 1 TO N 45 LET S = S + V(I) 50 NEXT I 60 PRINT S/N 70 GO TO 5 99 END
# 내용주
Notelist
## 인용
2 =