JOSS

JOSS
패러다임비구조적, 절차적, 명령형
계열JOSS
설계자클리프 쇼
개발자랜드 연구소
발표일1963년(63년 전)(1963)
변수 영역렉시컬
구현 언어어셈블리어
플랫폼JOHNNIAC, PDP-6
영향을 준 언어
AID, TELCOMP, CAL, FOCAL, MUMPS
1970년 랜드 연구소에서 진행된 JOSS 세션의 일부. 사용자가 direct mode에서 여러 간단한 계산을 수행하고 있다. 문장 끝의 마침표와 곱셈 기호인 가운데점의 차이에 주목할 것.

JOSS(JOHNNIAC Open Shop System의 약자)는 최초의 대화형 시분할 시스템 프로그래밍 언어 중 하나였다. 이 언어는 줄 번호를 편집 명령과 브랜치의 대상으로 동시에 사용하는 것, 불 결정에 따른 명령문, 그리고 직접 모드나 즉시 모드에서 명령을 수행할 수 있는 내장 소스 코드 편집기 등 1960년대부터 1980년대까지의 언어들에서 흔히 볼 수 있게 될 많은 기능을 개척했으며, 이를 대화형 사용자 인터페이스라고 불렀다.

JOSS는 처음에 랜드 연구소의 JOHNNIAC 기기에서 구현되어 1963년에 온라인 상태가 되었다. 이 시스템은 매우 인기를 끌었으나 사용자들이 몰리면서 기기에 과부하가 걸렸다. 1964년에는 더 높은 성능을 가진 대체 기기를 찾게 되었다. JOHNNIAC은 1966년에 퇴역하고 PDP-6로 대체되었으며, 이는 궁극적으로 IBM 셀렉트릭 기반의 수백 대의 단말기를 지원할 정도로 성장했다. 단말기는 사용자 입력을 위해 녹색 잉크를, 컴퓨터의 응답을 위해 검은색 잉크를 사용했다. 이해하지 못하는 명령어가 들어오면 Eh?라는 응답을 출력했다.

이 시스템은 매우 영향력이 커서 다양한 포팅과 파생 언어를 낳았다. 일부는 TELCOMP, STRINGCOMP, CAL, CITRAN, ISIS, PIL/I, JEAN (ICT 1900 시리즈), Burroughs B5500상의 BOSS 및 INTERP, Algebraic Interpretive Dialogue(AID, PDP-10상)와 같이 원본과 유사하게 유지되었다. FOCAL이나 MUMPS와 같은 다른 언어들은 독특한 방향으로 발전했다. JOSS는 또한 1980년대 마이크로컴퓨터에서 발견되는 베이직 인터프리터와 강한 유사성을 보이며, 주로 구문 세부 사항에서 차이를 보인다.

역사

초기 아이디어

1959년, 윌리스 웨어는 랜드 메모에서 미래의 컴퓨터가 "많은 사람이 동시에 기계와 상호작용할 수 있도록 다수의 개인용 입출력 스테이션을 갖출 것"이라고 기술했다. 이 메모는 랜드의 주요 후원자인 미 공군의 관심을 끌었고, 1960년에 그들은 이 개념을 탐구하기 위해 정보 처리 프로젝트를 결성했는데, 이는 곧 시분할 시스템으로 알려지게 된다. 이 프로젝트는 구체적으로 시분할 시스템에 관한 것이라기보다는 전반적인 인간-컴퓨터 상호작용을 향상하는 것을 목표로 했다. 당시의 아이디어는 사용자와 컴퓨터 간의 지속적인 상호작용이 그러한 교류를 더 자연스럽게 만들 것이라는 점이었다. JOSS의 책임자였던 키스 언캐퍼는 나중에 다음과 같이 설명했다.

실험을 이끈 두 가지 인식이 있었다고 생각한다. 하나는 내가 랜드에 합류한 1950년부터 최소한 랜드의 컴퓨터 과학 부문에서는 항상 원활한 사용자 상호작용에 초점을 맞추고 있었다는 것이다. 그것은 우리에게 내재되어 있었다. 우리는 거닝으로부터 그것을 배웠다. ... 우리는 그것에 대해서만 생각했다. 다른 하나는 수학자들이 Marchant 계산기로 고군분투하며 JOHNNIAC을 날것 그대로 사용하지 못하는 것을 보는 것이었다. 너무 어려웠다. 그들은 프로그래머가 되는 법을 배워야 했다. 그것은 그들에게 그저 좌절스러운 경험이었다. 우리는 그들에게 훈련을 많이 받지 않고도 프로그래머가 된다는 인식 없이 문제 해결을 돕는 자연스러운 방식이라고 생각하게 만들 무언가를 원했다. 왜냐하면 그런 인식은 그들을 멀어지게 했을 것이기 때문이다.

JOHNNIAC 컴퓨터에서 JOSS가 될 소프트웨어를 개발하자는 공식 제안은 1961년 3월에 수락되었다.

JOSS-1

JOSS는 랜드의 성장하는 컴퓨팅 부서에서 일하던 수학자 클리프 쇼에 의해 거의 전적으로 구현되었다. 이 시스템은 쇼가 개발한 EasyFox(당시 미군 음성 알파벳의 E와 F)라는 기호 어셈블리어로 작성되었다.

JOSS 시스템은 1963년 5월에 처음으로 공식 가동되었으며, 5개의 콘솔을 지원했는데 하나는 기계실에, 다른 4개는 건물 주변의 사무실에 배치되었다. 초기 콘솔은 개발이 시작될 당시 아직 시장에 나오지 않았던 셀렉트릭 대신 IBM 모델 868 전송 타자기를 기반으로 했다. 첫 일정은 6월 17일에 발표되었으며, JOSS는 매일 오전 9시부터 12시까지 3시간 동안 운영되었다. 이 시스템은 1964년 1월 8대의 단말기에서 완전히 운영 가능한 것으로 선언되었다. 최종 버전은 1965년 1월에 배포되었다.

이 시기에 JOHNNIAC은 이미 10년이 넘은 기기였고, 진공관 기반의 논리는 애초부터 신뢰성이 높지 않았다. 시스템이 잘 작동할 때조차 인기가 너무 많아 금방 과부하가 걸렸다. 사용자들은 열광적이었는데, 한 사용자는 다음과 같이 말했다.

사람들은 자신의 삶을 JOSS에 맞춘다... JOSS가 도착하는 오전 10시 전에 랜드에 오는 것은 소용없다. 사실 정오나 오후 5시 이후가 더 좋다. JOSS가 덜 바쁘기 때문이다. JOSS가 답변을 타이핑하기 시작할 때의 짜릿한 즐거움은, JOSS가 jibberish [sic]로 변하거나 당신의 코드를 망각 속으로 보내버리며 떠날 때 뒤따르는 고통과 맞먹는다. 우리는 JOSS 없이는 살 수 없지만, JOSS와 함께 살아가는 것도 힘들다.

다른 사용자는 더 간결하게 표현했다.

맥주보다 낫다 — 우리는 중독되었다.

JOSS-2로의 전환

1964년 5월, JOHNNIAC을 대체할 새 기기를 찾고 이를 JOSS의 확장 버전을 실행하는 데 전념하기로 결정했다. 이 기기는 랜드의 사양에 따라 제작된 새 단말기를 지원해야 했으며, 1965년 10월 31일까지 인도되어야 했다.

새 기기를 위해 총 9개의 입찰이 들어왔다. 디지털 이큅먼트 코퍼레이션(DEC)이 새로운 PDP-6 시스템으로 경쟁에서 승리했고, 공군 자금이 구매를 위해 풀렸다. DEC는 또한 팬폴드 용지 급지 장치에서 다음 페이지로 넘어가는 특수 메커니즘으로 수정된 IBM 셀렉트릭 타자기 기반의 단말기 30대를 제작하기로 합의했다. 전체 시스템의 다른 여러 부분은 다른 회사로부터 공급받았다.

PDP-6은 1965년 7월 말에 도착했으며, 초기에는 텔레타입 모델 33을 단말기로 사용하여 테스트되었다. 코드의 새 버전은 찰스 L. 베이커, 조셉 W. 스미스, 어윈 D. 그린월드, G. 에드워드 브라이언이 개발했다. 이 시스템은 10월에 처음으로 운영 가능한 것으로 선언되었지만, 여기에는 주당 6시간의 계획된 유지보수 시간이 포함되었다. 첫 프로토타입 단말기는 11월에 도착했다. 12월에는 라스베이거스에 있는 단말기가 처음으로 기기에 원격 연결되었다. 1966년 2월, 이 단말기는 매클렐런 공군 기지로 보내졌고, 8월에는 미국 공군 사관학교로, 9월에는 고등연구계획국(ARPA)과 펜타곤의 공군 사무실로 각각 한 대씩 보내졌다. 텔레타입 모델 35를 위한 첫 번째 영구적인 외부 텔레타입 연결은 1967년 2월 랭리 공군 기지에 설치되었다.

새 기기가 가동되면서 JOHNNIAC은 1966년 2월 11일에 오프라인 상태가 되었고, 2월 18일에 공식적으로 퇴역했다. 마지막 실행 프로그램은 JOSS로 작성되었으며 전원이 꺼질 때까지의 시간을 초 단위로 카운트다운했다. 이 기기는 로스앤젤레스 카운티 자연사 박물관으로 보내졌으며, 결국 샌프란시스코 외곽의 컴퓨터 역사 박물관에 안착했다. JOSS-2 시스템으로 대체되면서, 원본은 소급하여 JOSS-1으로 알려지게 되었다.

JOSS-2의 사용

1966년 말까지 새로운 JOSS-2 시스템은 완전히 기능하여 24시간 내내 JOSS 용도로 사용되었다. 새 기기는 약 30배의 계산 속도, 사용자당 5배의 저장 공간, 그리고 언어 자체의 많은 새로운 기능을 제공했다. 이 플랫폼은 최종적으로 동시에 최대 100개의 단말기를 지원할 수 있었다. 공군이 시스템의 소유자로 남았고, 랜드 연구소 등은 컨설턴트로 운영했다. CPU 타임은 실제 실행 중에만 분당 약 1달러의 요금이 부과되었으며, 타이핑이나 인쇄에 소요된 시간은 무료였다.

1970년경, 랜드 연구소와 전국 여러 공군 기지에 500~600명의 사용자가 있었다. 이들 중 상당수는 가끔 사용하는 사용자였으며, 이는 시스템이 의도한 바였다. 이들을 지원하기 위해 맞춤형 단말기에는 사무실 간에 이동하며 전용 콘센트에 꽂을 수 있도록 특별한 "JOSS 플러그"가 장착되었다. 200개의 플러그가 랜드 연구소 곳곳에 설치되었고, 단말기 본체는 한쪽 옆에 커피를 놓을 공간을 남기면서도 문을 통과할 수 있을 만큼 좁게 설계되었다. 단말기의 전원 스위치를 켜면 새 위치에서 연결되었다.

맞춤형 단말기는 엔지니어들이 모델 33의 "통신 기능은 훈련받지 않은 사람에게는 미스터리"이며 가끔 사용하는 사용자가 배우기에는 너무 혼란스럽다고 느꼈기 때문에 JOSS를 위해 설계되었다. 실제로는 셀렉트릭 기반 메커니즘이 지속적인 사용을 견디기에는 너무 약하여 IBM 정비사들에 의해 현장에서 자주 수리되었다. 1970년에는 단말기의 3분의 1이 완전히 재건되었고, 신뢰성을 높이기 위해 컴퓨터의 출력을 늦췄다. 공군은 이 시기에 이미 모델 35가 쉽게 구할 수 있고 비용도 훨씬 저렴했기 때문에 이를 사용하기로 결정했다.

사용자들은 열광적이었으며, 랜드는 셜리 마크스가 편집하는 'JOSS 뉴스레터'를 발행하기 시작했다. 1967년 11월부터 1971년 6월까지 총 44호가 발행되었다.

JOSS-3

1970년대 초, IBM의 서부 해안 시설 중 한 곳의 프로그래머들이 OS/360을 실행하는 IBM 370/158용으로 JOSS-3를 제작했다. 이 시스템에 대한 정보는 거의 남아있지 않지만, JOSS가 마침내 퇴역한 것은 바로 이 기기에서였다는 점이 알려져 있다. 역사적 개요의 한 주석에 따르면, 랜드는 IBM이 JOSS라는 이름을 사용하는 것을 꺼렸고, 결과적으로 "IBM 버전은 널리 사용되지 않았다"고 한다.

구현

JOSS는 수학적 기호를 제공하기 위해 IBM 셀렉트릭 타자기 단말기용으로 이 예시와 유사한 맞춤형 활자 공(type ball)을 사용했다.

PDP-6상의 JOSS-II는 기기의 내부 메모리 레이아웃에 맞춰 두 부분으로 나뉘었다. 기기에는 각 뱅크에 16k 36비트 워드를 가진 두 개의 코어 메모리 뱅크가 장착되었다. 운영체제, 사용자 및 파일 관리 코드, 단말기 핸들러, 인터프리터를 포함하는 JOSS 시스템 자체는 첫 번째 뱅크의 대부분을 사용했다. 두 번째 뱅크는 사용자 프로그램을 위해 사용되었다. 이는 당시로서는 비교적 큰 메모리 양이었지만, 시스템이 너무 많이 사용되어 16k 워드의 사용자 저장소만으로는 부족했고, 이를 지원하기 위해 자기 드럼을 통한 메모리 페이징을 지원했다. 드럼은 외부 하드웨어에 의해 구동되었으며 메인 프로세서의 간섭을 필요로 하지 않았다.

여러 사용자 프로그램을 지원하기 위해 PDP-6 하드웨어는 모든 주소 참조의 20번 비트를 검사하도록 수정되었다. 이 비트가 설정되어 있으면 해당 주소는 "사용자 공간"에 있는 것이며, 주소 0이 해당 사용자의 기본 주소를 가리키도록 수정되었다. 이러한 방식으로 사용자 프로그램은 시스템에 문제를 일으키지 않고 메모리 내에서 이동할 수 있었고, 운영체제는 내부 레지스터 하나만 변경함으로써 사용자 간 전환이 가능했다.

영구 저장소는 570만 워드의 저장 용량을 가진 저장 제품 하드 디스크가 제공했다. 드럼과 마찬가지로 드럼으로의 실제 입출력은 외부적으로 처리되었지만, 이 경우에는 프로그램 로드 및 저장을 위해 사용자 작업에 의해 동작이 트리거되었다. IBM 호환 테이프 드라이브는 필요에 따라 드라이브 간에 데이터를 이동하는 데 사용되었으며, 이 작업 또한 CPU와 독립적이었다. 두 개의 DEC테이프 유닛도 사용할 수 있었으며 IBM 드라이브와 동일한 방식으로 작동했다. 주택 담보 대출 계산기 및 초기의 메인프레임 게임과 같은 데모 프로그램을 사용할 수 있었다. 대형 프로그램은 모든 사용자를 위해 컴퓨터 속도를 늦추는 페이징을 유발했기 때문에, JOSS 뉴스레터는 사용자가 더 적은 저장소를 사용하도록 자주 요청했다.

단말기는 300~400개의 가능한 단말기 플러그 중 아무것이나 40개의 출력 중 하나에 연결할 수 있는 기계식 스트로거 스위치로 구성된 맞춤형 "집중 장치"를 통해 처리되었다. 추가 8개 회선은 JOSS 스타일 셀렉트릭이 아닌 텔레타입 모델 33 입력 전용이었다. 그 48개 회선은 CPU에 연결된 전자 멀티플렉서에 연결되었다. 멀티플렉서는 인터럽트 기반으로 작동했으므로 유휴 단말기는 주기를 사용하지 않았다.

맞춤형 JOSS 단말기는 DEC에서 제작했다. 이는 통신 시스템, 전원 공급 장치 및 기타 구성 요소를 포함하는 맞춤형 섀시에 내장된 셀렉트릭 메커니즘으로 구성되었다. <>와 같은 두 문자 조합을 사용할 필요가 없도록 ≠와 같은 기본적인 수학 기호를 제공하기 위해 맞춤형 글꼴 공이 사용되었다. 통신 시스템은 시작 및 정지 비트가 있는 8비트 패킷의 6비트 문자 코드를 기반으로 했다. 회선은 셀렉트릭 메커니즘의 초당 최대 15자 속도에 맞춰 120 bit/s로 구동되었다. 리본을 녹색에서 검은색으로, 다시 녹색으로 이동하기 위해 Shift-in 및 Shift-out 코드가 사용되었다. 이러한 코드는 통신 시스템에서도 인식되어 현재 컴퓨터가 제어권을 가지고 있는지 사용자가 제어권을 가지고 있는지 표시하는 전면 패널의 조명을 변경했다.

언어

JOSS는 사용자 친화성을 매우 강조하여 "JOSS-like"는 시분할 시스템과 상호작용하는 새로운 사용자를 묘사하는 표현이 되었다. 어린이들과 다른 사람들은 "복잡한" 컴퓨터와 달리 JOSS는 마치 "유머 감각을 가진 실제 사람"처럼 "친절하고" "상냥하며", Eh?와 같은 재미있는 응답을 한다고 말했다.

직접 모드와 간접 모드

JOSS는 대화형 언어와 프로그램 편집기로 동시에 작동하는 단일 명령줄 편집기라는 아이디어를 도입했다. 줄 번호 없이 입력된 명령은 JOSS가 "직접 모드"라고 부르는 즉시 실행되었다. 같은 줄 앞에 줄 번호가 붙으면 프로그램 코드 저장 영역으로 복사되었는데, JOSS는 이를 "간접 모드"라고 불렀다. 줄 번호가 고유하면 새 줄이 프로그램에 추가되었고, 같은 번호가 있으면 기존 줄을 대체했으며, 코드 없이 기존 줄 번호만 입력하면 프로그램에서 제거되었다.

대부분의 베이직과 대조적으로, JOSS는 프로그램 코드뿐만 아니라 전체 사용자 입력을 파일로 저장했다. 로드될 때, JOSS는 본질적으로 그 줄들을 다시 타이핑했다. 이는 프로그램 파일이 프로그램 문장과 직접 모드 명령을 모두 포함할 수 있음을 의미했다. 예를 들어, 프로그램 문장 줄을 나열하고 파일 끝에 Go.를 두어 로드가 완료되자마자 즉시 프로그램을 실행하는 것은 흔한 일이었다. Let이나 Form과 같이 직접 모드에서만 사용할 수 있는 기능도 있었는데, 이는 줄 번호 없이 입력되지만 프로그램이 로드될 때 다시 반환되었다.

직접 및 간접 지시어는 작업 공간에서 자유롭게 혼합될 수 있었다. 이를 통해 *로 시작하는 직접 모드 줄을 추가하거나, 코드 줄 끝에 놓고 그 뒤에 주석을 추가함으로써 소스 코드에 주석을 삽입할 수 있었다. 빈 줄도 무시되어 프로그램의 명확성을 위해 줄을 나눌 수 있었다.

프로그램 문장

JOSS 프로그램의 모든 줄은 줄 번호로 시작해야 한다. 줄 번호는 마침표로 구분된 두 개의 2자리 정수로 구성된 고정 소수점 숫자이다. 베이직과 마찬가지로, 줄 번호는 To와 Do 명령문의 대상이 되는 레이블로 사용되며 편집을 지원한다. 새 줄 번호로 코드 줄을 입력하면 프로그램에 삽입되고, 기존 줄 번호로 입력하면 이전 버전을 대체하거나 비어 있으면 삭제한다.

마침표 왼쪽의 줄 번호 부분은 페이지 또는 파트로 불리고, 오른쪽 부분은 줄로 불린다. 따라서 줄 번호 10.12는 10페이지, 12줄을 의미한다. 브랜치는 페이지나 페이지 내의 줄을 대상으로 할 수 있다. 후자의 형식이 사용될 때, 결합된 페이지와 줄을 단계(step)라고 한다.

페이지는 서브루틴을 정의하는 데 사용되며, 다음 줄이 다른 페이지에 있으면 반환된다. 예를 들어, 숫자의 제곱근을 계산하는 서브루틴이 3페이지에 있다면 코드 줄 3.1, 3.2, 3.3이 있을 수 있고, Do part 3.를 사용하여 호출할 수 있다. 코드는 다른 페이지의 다음 줄(예: 4.1)에 도달하면 Do 다음의 문장으로 돌아온다. 끝에 RETURN에 해당하는 것이 필요하지는 않지만, 조기 반환이 필요한 경우 Done이 이를 수행한다.

모든 줄은 줄 번호 다음에 명령 키워드로 시작해야 한다. 베이직의 선택적 LET 문과 같은 기본 명령 개념은 존재하지 않는다. 여러 문장을 콜론이나 세미콜론으로 구분하여 한 줄에 배치할 수 있다. 모든 줄은 마침표로 끝나야 한다.

루프와 조건

JOSS는 접두사 표기법으로 조건을 앞에 두는 대부분의 언어("이것이 참이면 이것을 하라")와 대조적으로, 접미사 표기법을 사용하여 조건부 평가("이것이 참이면 이것을 하라")를 나타낸다. 포트란이나 FOCAL과 달리, 모든 문장을 이런 방식으로 조건부 평가할 수 있다. 예를 들어, 조건이 충족될 때만 문자열을 출력하려면 if를 Type과 결합할 수 있다.

1.1 Type "Hello, World!" if X=5.

JOSS는 6가지 중위 비교 =, ≠, ≥, ≤, >, <와 불리언 연산자 or, and, not을 지원했다.

루프는 For 명령을 사용하여 비슷하게 처리되었으며, 루프 범위와 단계 값을 지정하는 다소 난해한 형식인 start(step)end를 사용했다. 예를 들어, 1에서 10까지 2씩 증가시키려면 형식은 1(2)10이다. If와 마찬가지로 For도 다른 모든 문장에 적용할 수 있다.

1.2 Type "Hello, Wikipedia!" for i=1(2)10.

for는 단일 문장에만 적용된다는 점에 유의할 것. 루프에서 여러 문장을 실행하려면 별도의 파트로 분리하고 do를 사용하여 호출해야 한다.

1.3 Do part 5 for i=1(1)100.
5.1 Type "Hello, Wikipedia!".
5.2 Type "This is JOSS.".

베이직과 마찬가지로 for 루프의 모든 입력은 상수, 변수 또는 기타 표현식일 수 있다.

이러한 범위는 모든 코드 줄에 적용될 수 있었기 때문에, 프로그램이 호출될 때 제한과 루프를 정의하는 것이 가능했다. 예를 들어, 다음 프로그램을 고려해보자.

1.1 Type X.

보통 베이직의 RUN과 유사하게 호출하면:

Do part 1.

0을 생성한다. 하지만 호출에 루프 구문을 추가하여 이 동작을 수정할 수 있다.

Do part 1 for X = 1(1)5.

그러면 다음과 같이 생성된다.

1
2
3
4
5

이렇게 하면 공식을 루프 내에 배치하지 않고도 프로그램에서 구성할 수 있다. 루핑은 원할 경우 사용자가 프로그램을 시작할 때 제공할 수 있다.

표현식과 명제

JOSS의 독특한 특징은 논리적 표현식을 처리하는 방식이었다. 대부분의 컴퓨터 언어는 다중 파트 수학 표현식을 형성하는 방법을 제공한다(예: Set x=(1+2)·3.은 변수 x를 9로 설정한다). JOSS는 "명제"라는 개념, 즉 수치 값이 아닌 논리 값(참 또는 거짓)을 반환하는 표현식의 개념을 명확하게 정의하여 이 개념을 확장했다. 이는 대부분 위의 예제처럼 If 문에서 나타났지만, 불리언 값은 변수에 직접 저장할 수도 있고, 또는 tv(진릿값) 함수를 사용하여 참을 1로, 거짓을 0으로 변환할 수도 있었다.

명제 외에도 JOSS는 "조건부 표현식" 개념을 가졌다. 이는 명제 문자열과 해당 명제가 참일 경우 실행될 코드로 구성되었다. 이를 통해 다단계 의사 결정 트리를 한 줄로 작성할 수 있었다. 이들은 현대 언어인 C나 자바의 삼항 연산자와 유사한 목적을 수행하며, if-then-else를 구현하는 간결한 구조에서 값을 반환하는 데 사용된다. JOSS 버전은 3개가 아니라 임의의 개수의 조건을 가질 수 있으므로, 간결한 if-then보다는 간결한 Switch 문에 가깝다.

이 예제는 sgn 함수의 기능을 재현한다.

Let s(x)=[x=0:0; x>0:1; x<0:-1].

이는 단일 매개변수 "x"를 취하고 이에 대해 3개의 연속적인 테스트를 수행하는 함수 "s"를 정의한다. 가장 먼저 성공한 테스트가 콜론 뒤의 해당 값을 반환한다.

범위

JOSS의 또 다른 고급 기능은 저장하고 조작할 수 있는 내장형으로서의 범위 개념을 가졌다는 것이다. 범위는 일반적으로 루프 자체 구문의 일부인 For 루프의 입력으로 발견된다. 예를 들어, 베이직에서는 다음 기본 구문을 사용하여 for 루프를 작성한다.

FOR I=1 TO 5 STEP 2

이는 I에 1, 3, 5 값을 할당하고 종료하는 루프를 수행한다.

JOSS는 루프 제한을 정의하기 위해 다소 난해한 형식을 사용했다. JOSS의 해당 코드는 다음과 같다.

 I=1(2)5

이 코드에는 for가 포함되지 않음을 주목할 것. 이는 JOSS에서 범위는 베이직처럼 루프의 일부가 아니라 언어의 일급 시민이기 때문이다. 범위는 루프 외부의 많은 문맥에서 정의되고 사용될 수 있다. 예를 들어, 매개변수 x의 팩토리얼을 평가하는 조건부 표현식은 다음과 같다.

Let f(x)=[x=0:1 ; fp(x)=0:prod(i=1(1)x:i)].

이 예제에서는 세미콜론으로 구분된 두 가지 주요 명제가 있다. 왼쪽의 첫 번째 명제는 매개변수 x가 0이면 조건이 즉시 1을 반환해야 함을 나타낸다. 해당 명제가 실패하면 오른쪽의 두 번째 테스트로 넘어간다. 이것은 x의 분수 부분이 0인지(즉, 정수인지) 확인하고, 그렇다면 prod 함수를 호출하여 값 범위를 곱한다. prod의 매개변수도 명제이지만, 이 경우에는 테스트가 1에서 x까지 1씩 증가하는 루프 반복자로 대체된다. 해당 명제가 참이면(루프의 모든 값에 대해 참이므로), 인덱스 i를 반환한다. 이는 1에서 x까지의 일련의 값이 prod로 전송되게 한다.

이러한 기능의 조합으로 복잡한 함수를 몇 개의 명령어로 작성할 수 있다. 이러한 종류의 기능은 훨씬 더 현대적인 언어에서만 흔해졌으며, 보통 반복자나 map 함수를 사용하여 동일한 결과를 제공한다. 결정을 조합하고 루프를 간결한 형태로 결합하는 JOSS의 능력은 FOCAL과 같은 파생 언어를 포함한 당시의 다른 언어들에서는 알려지지 않은 것이었다.

명령어

Set

Set 명령은 표현식의 결과를 지정된 변수에 할당한다. 베이직의 LET와 동일하다.

01.30 Set p=3.14156.
01.60 Set i=l*(r/100)*t.

Set은 직접 모드에서 사용할 때는 선택 사항이었으며, Set 명령 없이 x=5.라고 타이핑할 수 있었다. 베이직과 대조적으로 간접 모드에서는 허용되지 않았다.

Let

Let은 사용자 정의 함수를 정의하는 데 사용되었다. 베이직의 DEF FN과 동일하다.

Let t(x)=sin(x)/cos(x).
Set j=t(1.1).
Type j.

Let은 상수로 구성된 공식을 사용하여 변수의 값을 설정하는 데도 사용할 수 있다.

Let x=5.

그 시점부터 Set을 사용하여 생성된 것과 동일하게 사용할 수 있다. 그러나 미묘한 차이가 있는데, 코드에서 이 X를 참조할 때 값은 오른쪽을 평가하여 계산된다. Set은 한 번만 평가되므로 훨씬 빠르다.

시스템은 일반적으로 Let을 직접 모드에서만 사용하고, 파일의 맨 위나 맨 아래에 삽입하여 프로그램에서 사용할 수 있도록 저장할 것을 제안했다. 이는 로드 과정에서 한 번만 호출되므로 실행 중에 Let이 여러 번 호출되는 것을 방지했다.

Demand

Demand는 변수 목록을 받아 사용자 입력을 변수에 저장한다. 선택적인 as 한정자는 사용자 정의 프롬프트를 추가했다. 베이직의 INPUT과 동일하다.

01.01 Type "What is your age?".
01.02 Demand A.
01.03 Type "You are", A.
01.04 Demand H as "What is your height?".
01.05 Type H,"? That tall?".

Type

Type 명령은 쉼표로 구분된 하나 이상의 항목을 출력한다. 기본 형식에서는 베이직의 PRINT와 동일하다. 그러나 Type에는 관련 없는 다양한 출력 작업을 수행하게 만드는 과부하된 선택적 형식이 다수 포함되어 있다.

값을 출력하는 데 사용될 때, 매개변수는 변수, 큰따옴표로 둘러싸인 리터럴 문자열, 그리고 줄 바꿈을 생성하는 특수 _ 문자가 될 수 있다. Type은 형식 문자열을 사용하는 형식화된 출력도 지원한다. 자세한 내용은 아래 Form 섹션을 참조할 것.

Type은 프로그램을 작성하는 베이직의 LIST 문과 동일하게 사용되기도 한다. 예를 들어, Type step 1.1.은 코드 한 줄을 출력하고, Type part 1.은 전체 파트를 출력하며, Type all.은 전체 프로그램을 출력한다.

또한 내부 값 목록을 출력하는 데 사용될 수 있다. Type all values.는 모든 변수와 그 값의 목록을 생성하고, Type size.는 프로그램 크기를 출력한다. 키워드에는 size, time, users가 포함된다.

Page

Page는 특수 JOSS 단말기에서 페이지 넘김을 트리거한다. JOSS는 일반적으로 단말기가 종이의 54줄에 도달하면 페이지 넘김을 보냈으므로, 데이터 블록이 절반으로 나뉘지 않도록 하려면 다음과 같이 할 수 있다.

1.10 Page if $>44.

$는 현재 줄 번호를 반환하는 의사 변수이다.

Line

Line은 특수 JOSS 단말기에서 줄 바꿈을 트리거한다.

To

To 명령은 프로그램 실행을 지정된 파트나 단계 번호로 점프하며, 각각 To part 1. 또는 To step 1.1.을 사용한다. 이는 베이직의 GOTO와 동일하다. 프로그램을 시작하기 위해 명령줄에서 사용되는 간접 명령인 Go(베이직의 RUN과 동일)와 대조된다.

01.01 Demand A as "TYPE A NUMBER".
01.05 To step 1.01.
01.10 To part 1.

Do

Do는 To와 유사하지만 서브루틴으로 분기한다. To와 마찬가지로 Do part 또는 Do step을 사용할 수 있다. 단계가 제공되면 해당 단일 줄이 실행된 후 Do 다음의 문장으로 돌아온다. 파트가 제공되면 실행은 블록의 첫 번째 줄에서 시작하여 블록 끝에 도달하거나 Done 문을 만날 때까지 계속된다.

01.15 Do step 7.24.
01.16 Do part 8.

Do는 대부분의 프로그램에서 매우 흔하다는 점에 따라 한 가지 특별한 짧은 형식을 가졌다. 이는 단순 루프의 경우 일반적인 for 대신 times 한정자를 사용했다. 따라서 다음 줄들은 동일하다.

Do part 1 for i=1(1)5.
Do part 1, 5 times.

JOSS는 현재 실행 중인 줄에 대한 포인터를 유지하며, Do는 이를 변경한다. 그러나 메인 포인터를 변경하지 않고 코드의 특정 섹션을 테스트하기 위해 직접 모드에서 사용할 수 있는 특별한 "괄호 do"가 포함되었다. 예를 들어, 프로그램이 오류로 인해 중지되었고 어떤 섹션이 문제를 일으켰는지 명확하지 않은 경우, 특정 서브루틴을 다음과 같이 테스트할 수 있다.

 (Do part 2.)

Done

Done 명령은 서브루틴 호출에서 반환한다. 서브루틴은 파트 끝에 도달하면 자동으로 반환되므로 Done은 조기 반환에만 필요하며, 종종 조건문과 함께 사용된다. 베이직의 RETURN과 동일하다.

*사용자에게 양수 값을 요청하고 값을 얻을 때까지 반복하는 루틴
01.10 Demand X as "Enter a positive value greater than zero".
01.20 Done if X>0.
01.30 To step 1.1

Stop

Stop 명령은 프로그램 실행을 종료하고 편집 환경으로 제어권을 반환한다. 베이직의 END나 STOP과 동일하다. 단, 베이직의 STOP은 CONT가 동일한 위치에서 실행을 재개하도록 의도된 것이며, 이는 JOSS의 작업 공간 지향 시스템에는 직접적인 대응 기능이 없다.

01.10 Type X.
01.20 Stop.

Go

직접 모드에서만 사용 가능한 Go는 오류로 인해 프로그램이 현재 중지되었거나 Stop 명령을 만났는지에 따라 베이직의 RUN 및 CONT와 동일하다.

Cancel

또 다른 직접 모드 전용 명령인 Cancel은 프로그램이 오류로 중지되었고 사용자가 프로그램을 재설정하고 싶을 때 사용되며, 프로그램 카운터를 지워 이를 수행한다. Go는 마지막 위치에서 재개되지만, Cancel을 발행하면 Go는 다시 처음부터 시작한다. 현재 중단점이 괄호가 있는 (Do.) 때문이었다면, 괄호 캔슬인 (Cancel.)을 발행하여 해당 하위 실행만 중지하고 Go가 괄호가 없는 마지막 줄에서 계속되도록 할 수 있다.

수학

JOSS는 모든 숫자를 기수-10 부동 소수점으로 저장했다.

JOSS에는 6개의 수학 연산자가 포함되어 있었다.

  • + (덧셈)
  • - (뺄셈)
  • · (곱셈, 마침표가 아닌 가운데점)
  • / (나눗셈)
  • * (지수)
  • |...| (절대값, 중간에 표현식)

수학 표현식은 우선순위를 확립하기 위해 짝을 이루어 ()와 []를 번갈아 사용할 수 있었다. 예:

  1.30 Set A=|-10·[5+1]·(1+5)|.

360을 생성한다.

함수

언어에는 다음과 같은 내장 함수가 포함되어 있었다.

수학

  • sin() - 라디안으로 주어진 각도의 사인
  • cos() - 코사인
  • arg() - 점의 X 및 Y 값을 취하고 해당 점과 x축 사이의 각도를 반환
  • log() - 자연로그
  • exp() - 인수의 자연 지수
  • sqrt() - 제곱근
  • sgn() - 인수의 부호, 0은 0, 음수 값은 -1, 양수 값은 +1 반환
  • ip() - 인수의 정수 부분, ip(22026.4658)은 22026 반환
  • fp() - 분수 부분, .4658 반환
  • dp() - 자릿수 부분, 2.20264658 반환
  • ep() - 지수 부분, 4 반환(소수점 위치)

불리언

  • tv() - 진릿값, 표현식이 참이면 1, 아니면 0 반환

루프 함수

JOSS는 또한 숫자를 합산하는 간단한 작업을 수행하기 위해 프로그래머가 For 루프를 작성하지 않아도 되도록 내부적으로 루핑을 수행하는 여러 함수를 정의했다. 매개변수는 쉼표로 구분된 단순 표현식 목록이거나 명령이 모든 문장 또는 함수 호출이 될 수 있는 범위 구문일 수 있다.

  • max() - 제공된 표현식 중 최댓값
  • min() - 최솟값
  • sum() - 합계
  • prod() - 곱
  • first() - 조건과 일치하는 목록의 첫 번째 항목, 결과 반환

파일 관리

JOSS 시스템은 할당된 공간에 사용자 프로그램을 저장하기 위해 하드 디스크를 사용했다. 해당 공간 내에는 정수와 괄호 안의 5글자 이름으로 구성된 다중 파트 파일명을 사용하여 참조되는 여러 파일이 있었다(예: 123 (hello)). 정수 부분은 디렉터리와 동일하며, 이름은 JOSS 자체가 유지 관리하는 하위 파일이다.

파일은 File all as item filename.으로 기록되고 Recall item filename.으로 로드된다. 작업 공간의 특정 부분만 읽거나 저장할 수도 있는데, 예를 들어 File part 1 as item filename.을 사용하여 단일 루틴을 파일로 저장할 수 있다. 또한 Use item filename.을 사용하여 모든 참조가 가정되는 기본 파일을 설정할 수 있었다. 파일은 Discard로 삭제할 수 있었다.

예제 프로그램

1.1 Demand p,q.
1.2 Stop if q<0 or r(q,2)=0.
1.3 Set a=1.
1.4 Do part 2 while q>1 and a≠0.
1.5 Type a in form 3.
1.6 Stop.
2.1  Do part 20.
2.1  Do part 11 if p<0.
2.2  Do part 12 if p≥q.
2.3  Do part 13 if p=0.
2.4  Done if a=0.
2.5  Set p=p/4 while r(p,4)=0.
2.6  Do part 14 if r(p,2)=0.
2.7  Do part 20.
2.8  Set a=-a if r(p,4)=r(q,4)=3.
2.9  Set s=p, p=q, q=s.
2.95 Do part 20.
11.1 Set a=-a if r(q,4)=3.
11.2 Set p=|p|.
11.3 Do part 20.
12.1 Set p=r(p,q).
12.2 Do part 20.
13.1 Set a=0, p=1, q=1.
14.1 Set a=-a if r(q,8)=3 or r(q,8)=5.
14.2 Set p=p/2.
20.1 Type p, q in form 1 if a=1.
20.2 Type p, q in form 2 if a=-1.
Form 1: "  L(%.0f,%.0f)  ="
Form 2: "  -L(%.0f,%.0f)  ="
Form 3: "  %.0f\n"

이는 원본 예제가 아니라 현대 시뮬레이터에서 가져온 것임을 유의할 것. 원본 JOSS 언어와 구문적 차이가 약간 있다.

내용주

  1. ↑ JOHNNIAC에서 다른 기기로 옮겨갈 때, 약자를 "JOSS Open Shop System"으로 바꾸자는 제안이 있었는데, 이는 재귀적 이름의 초기 사례가 되었다.

각주

인용

  1. 1 2 3 4 Bryan 1966, 2쪽.
  2. 1 2 3 Marks 1971, 1쪽.
  3. ↑ Norberg, Arthur (1989년 7월 10일). 《An Interview with Keith Uncapher》 (PDF). (인터뷰). 7쪽.
  4. ↑ Ware 2008, 62쪽.
  5. ↑ Marks 1971, iii쪽.
  6. ↑ Shaw 1965, 3쪽.
  7. 1 2 Marks 1971, 2쪽.
  8. ↑ Smith, JW (August 1967). 《JOSS: Central Processing Routines》 (reference user guide). 랜드 연구소. RM 5270 PR. 2012년 4월 16일에 확인함.
  9. ↑ Shaw 1965, 14쪽.
  10. 1 2 Marks 1971, 3쪽.
  11. 1 2 3 Marks 1971, 9쪽.
  12. ↑ Marks 1971, 4쪽.
  13. ↑ “JOHNNIAC”. 《컴퓨터 역사 박물관》.
  14. ↑ Ware 2008, 15, 109쪽.
  15. ↑ Marks 1971, 5쪽.
  16. 1 2 3 4 Bryan 1966, 3쪽.
  17. ↑ Marks 1971, 32쪽.
  18. ↑ Marks 1971, 10쪽.
  19. ↑ Marks 1971, 15쪽.
  20. ↑ Marks 1971, 14쪽.
  21. ↑ Bryan 1966, 12쪽.
  22. ↑ Marks 1971, 47쪽.
  23. ↑ Ware 2008, 65쪽.
  24. ↑ Ware 2008, 16쪽.
  25. ↑ Bryan 1966, 4쪽.
  26. 1 2 Bryan 1966, 5쪽.
  27. ↑ Marks 1971, 26쪽.
  28. ↑ Marks 1971, 32–33쪽.
  29. ↑ Bryan 1966, 6쪽.
  30. ↑ Marks 1971, 35–36, 43쪽.
  31. ↑ Gimble 1967, v쪽.
  32. ↑ Gimble 1967, vi쪽.
  33. 1 2 Gimble 1967, 65쪽.
  34. ↑ Marks 1971, 42쪽.
  35. 1 2 Gimble 1967, 70쪽.
  36. 1 2 3 Gimble 1967, 77쪽.
  37. ↑ Gimble 1967, 24, 69쪽.
  38. 1 2 3 Gimble 1967, 75쪽.
  39. ↑ Marks 1971, 41쪽.
  40. ↑ Gimble 1967, 25쪽.
  41. ↑ Gimble 1967, 68쪽.
  42. ↑ Gimble 1967, 74-75쪽.
  43. ↑ Gimble 1967, 45쪽.
  44. ↑ Gimble 1967, 63쪽.
  45. 1 2 3 4 5 Gimble 1967, 66쪽.
  46. ↑ Gimble 1967, 7쪽.
  47. 1 2 Gimble 1967, 49쪽.
  48. ↑ Gimble 1967, 67쪽.
  49. 1 2 Gimble 1967, 58쪽.
  50. ↑ Gimble 1967, 57쪽.
  51. ↑ Gimble 1967, 53쪽.
  52. 1 2 Gimble 1967, 69쪽.
  53. ↑ Gimble 1967, 59쪽.
  54. 1 2 Gimble 1967, 61쪽.

참고 자료

더 읽기

외부 링크