BASIC은 왜 줄 번호를 사용 했습니까?


95

왜 구 BASIC (및 다른 언어)이 소스 코드의 일부로 줄 번호를 사용 했습니까?

무슨 문제가 해결 되었습니까?


27
이미 심각한 재교육 노력을 기울 였다면 댓글 안에 정보를 묻지 말고 그에 따라 질문을 편집하십시오. 또한 Google은 나를 여기로 직접 데려 갔다 : stackoverflow.com/questions/541421/… 그리고 여기 stackoverflow.com/questions/2435488/…
Doc Brown

13
답변이 이미 stackoverflow에 있기 때문에이 질문을 주 제외로 닫으려고 투표하고 있습니다.
Andres F.

6
Applesoft BASIC은 내가 처음 배운 프로그래밍 언어였습니다. Pascal에 줄 번호가 있고 "줄 번호없이 GOTO를 어떻게 수행합니까? 어떻게 작동합니까?"
Jens Schauder

14
웃긴, 지난번에 확인했을 때, 우리는 다른 사이트의 내용이 아니라 그 내용에 근거한 주제에 관한 질문인지 판단 할 수있었습니다.
MatthewRock

답변:


130

BASIC은 초기 언어, 코볼 및 어셈블리와 같은 현대 언어와 관련하여 고려해야합니다.

내가 한 백업하면 6502 조립에 취미 삼아 없이 라벨, 이것은 당신이 단단히 포장 코드의 중간 어딘가에 명령을 추가 할 필요가 있음을 발견했을 때 (나중에 추가 된 것을 의미 NOP 당신이 점프를 모두 통과하고 다시 실행하는 데 필요한들) 구애. 시간이 많이 걸렸습니다.

Fortran은 BASIC을 포괄하는 라인 번호 기반 시스템입니다. Fortran에서 열 1-5는 분기 대상에 사용되는 행 번호입니다. Fortran의 핵심은 컴파일러가 BASIC 인터프리터보다 조금 더 지능적인 경향이 있었고 몇 가지 명령을 추가하는 것은 일부 카드를 펀칭하고 적절한 위치에 갑판에 넣는 것입니다.

반면에 BASIC은 모든 지시 사항을 순서대로 유지해야했습니다. '이전 라인의 연속'이라는 개념은 많지 않았습니다. 대신 Applesoft BASIC (메모리에 익숙하고 정보를 찾을 수있는 널리 사용되는 방언 중 하나)에서 메모리의 각 줄은 다음과 같이 표현되었습니다.

NN NN   TT TT   AA BB CC DD .. .. 00

다음 행의 주소 ( NN NN)에 2 바이트가있었습니다 . 이 줄의 줄 번호 ( TT TT)에 대한 2 바이트 , 토큰 목록 ( ), AA BB CC DD .. ..줄 끝 표시 자 ( 00). (이것은 Apple 내부 // e의 84-88 페이지에 있습니다. )

메모리 표현을 볼 때 알아야 할 중요한 점은 라인을 순서대로 메모리에 저장할 수 있다는 것입니다. 메모리의 구조는 구조에 '다음 라인'포인터가있는 연결된 목록의 구조였습니다. 이렇게하면 두 줄 사이에 새 줄을 쉽게 추가 할 수 있었지만 제대로 작동하려면 각 줄에 번호를 매겨 야했습니다.

BASIC으로 작업 할 때 여러 번 실제로 BASIC 자체 에서 작업 하고 있었습니다. 특히, 주어진 문자열은 줄 번호 및 기본 명령어이거나 기본 인터프리터에 대한 명령 RUN또는 LIST입니다. 이를 통해 코드와 명령을 쉽게 구분할 수있었습니다. 모든 코드는 숫자로 시작합니다.

이 두 가지 정보는 숫자가 사용 된 이유를 식별합니다. 16 비트로 많은 정보를 얻을 수 있습니다. 문자열 기반 레이블은 훨씬 더 많은 공간을 차지하며 주문하기가 더 어렵습니다. 숫자는 다루기 쉽고 이해하기 쉽고 표현하기 쉽습니다.

당신이 아니었다 나중에 BASIC 방언 통역 항상 멀리 모든 라인이 번호 대신 단지 지점 목표했던 줄 번호를 필요로 할 수 있었다. 실제로, 라벨.


3
좋은 국물, 나는 미니 어셈블러에 대해 잊었다. 그것은 추억을 되찾아 줍니다.
Blrfl

3
@Blrfl 메모리가 작동한다면 ... ] CALL -936 * F666 G $ ... FP 기본부터 시작하십시오.

3
아니, 그건 이었다 라인 편집기. 명령은 줄 번호가 없어서 식별되었습니다. 명령문 앞에는 행 번호가 표시되어 명령문이었으며 명령문이 행했거나 행을 덮어 썼음을 나타냅니다. BASIC의 내장 라인 편집기 부분으로 별도의 툴이나 환경이 아니 었습니다.
RBarryYoung

3
@RBarryYoung ] PRINT "FOO"은 BASIC 통역사가 즉시 운영했습니다. 성명서입니다. 나중에 실행하고자한다면, 당신은 할 것이다 ] 10 PRINT "FOO"다음과 ] RUN. AppleSoft BASIC 환경에서 모든 BASIC 문은 즉시 실행되거나 지연 될 수 있습니다. DOS에서 제공 한 유효한 BASIC 문이 아닌 명령은 거의 없었습니다. 지금 진술과 나중에 진술의 차이점은 줄 번호였습니다. 해당 행 번호를 다시 입력하여 지연된 명령문을 수정할 수도 있습니다. 한 줄에 여러 문장을 넣을 수도 있습니다.:

4
Wikipedia 기사 ( en.wikipedia.org/wiki/Dartmouth_BASIC ) 에서 언급했듯이 " DTSS (Dartmouth Time Sharing System)는 초기에 대화식 명령 행 인터페이스를 구현했습니다. ... 행 번호로 시작하는 모든 행이 추가되었습니다. 프로그램은 이전에 저장된 라인을 동일한 번호로 대체합니다. 다른 것은 DTSS 명령으로 가정하여 즉시 실행됩니다. ...이 편집 방법은 텔레 프린터를 Dartmouth Timesharing 시스템의 터미널 단위로 사용했기 때문에 필요했습니다. "
RBarryYoung

50

초기 마이크로 컴퓨터에서 편집은 라인 기반이었습니다. 소스 코드에서 자유롭게 이동하고 편집 할 수는 없습니다. 화면 하단에 명령을 입력하고 코드를 입력 할 수있는 한 줄이 있습니다. 화면의 나머지 부분은 읽기 전용 코드 목록과 명령 출력이었습니다. 프로그램에서 90 행을 편집하려면 " EDIT 90" 를 작성 하고 행의 내용이 90단일 행 편집 버퍼에 들어갑니다. 당신이 입력 한 줄을 편집하면 Enter 키를 누르면 프로그램 목록이 업데이트되었습니다. 따라서 프로그램을 편집하려면 줄 번호가 필요했습니다.

코드 편집기가 고급화되어 코드 목록에서 커서를 움직일 수있게되면 더 이상 줄 번호가 필요하지 않습니다.


38
라인을 편집 하시겠습니까? 사치! 내가 사용한 첫 번째 BASIC은 전체 라인을 다시 입력하게했습니다. 서브 루틴의 번호를 다시 매길 때 정말 빨랐습니다.
TMN

48
화면? 어떤 화면? 첫 번째 Basic에서 "스크린"은 롤 용지였습니다.
ddyer

18
@ ddyer : 나는 종이 롤을 꿈꾸 곤했습니다! 우리 가 가진 전부 많은 전극이었습니다. 작업이 완료된 저녁에는 프로그램이 올바르게 작동하는지 확인하기 위해 일렬로 정렬하고 누가 감전사를 감시해야했습니다. ... — 진심으로, 사람들이 실제로 그 당시에 작업 프로그램을 다시 쓸 수 있다는 것이 놀랍습니다.
leftaroundabout

26
전기! 피의 사치. 우리는 화강암으로 명령을
끌었습니다.

10
@ TMN & ddyer 좋아, 둘 다 어디로 향하고 있는지 알지? ;-D ==> dilbert.com/strip/1992-09-08 ==> imgs.xkcd.com/comics/real_programmers.png
Kopperud

45

80 년대 8 비트 가정용 마이크로 컴퓨터의 기본 방언을 생각하고 있다면 해당 컴퓨터에는 텍스트 편집기가 없었습니다 (일부 워드 프로세서 응용 프로그램을 구입하지 않은 경우). 오늘날 프로그래밍 할 때와 마찬가지로 전체 BASIC 프로그램 소스 코드를 "편집기에서 열기"할 수있는 방법이 없었습니다. 프로그래머는 프로그램을 소스 코드 파일 또는 텍스트로 생각하지도 않습니다.

문제 예

따라서 머리에 줄 번호가없는 간단한 프로그램이 있다고 가정 해 보겠습니다.

FOR I=1 TO 42
PRINT I
NEXT I

컴퓨터를 부팅합니다. "준비"또는 이와 유사한 프롬프트가 표시되고 커서가 다음 줄에 있습니다. 이것은 실제 스크립팅 언어 의 REPL 환경 과 매우 유사 하지만 스크린 기반과 같이 엄격하게 선 기반은 아닙니다. 오늘날의 REPL과는 다르지만 가깝습니다.

이제 프로그램에 들어가기 시작하면 BASIC 인터프리터가 즉시 실행 (및 잊어 버림)하려고 시도하고 루프를 종료하는 NEXT가 없으면 의미가 없으므로 첫 번째 줄 이후에 오류가 발생할 수 있습니다. 이것은 텍스트를 편집하는 텍스트 편집기가 아니라 컴퓨터에 명령을 내리는 곳입니다!

부분 솔루션

그래서 당신은 말할 방법이 필요합니다. 이것은 프로그램 라인입니다. 저장하십시오! 특별한 명령이나 기호가있을 수 있습니다. 이것은 프로그램 라인이므로 저장하십시오. 이것을 상상해 봅시다 :

#FOR I=1 TO 42
#PRINT I
#NEXT I

이제 가상의 BASIC 인터프리터가 프로그램을 저장했으며 실행할 수 있습니다. 그러나 이제 PRINT 줄을 편집하고 싶습니다. 어떻게합니까? 텍스트 편집기가 아니라 커서를 줄로 이동하여 편집 할 수 없습니다. 또는 LET COUNT=COUNT+1루프 와 같이 다른 줄을 추가하고 싶습니다 . 새 줄을 어디에 삽입해야하는지 어떻게 알 수 있습니까?

작업 솔루션

줄 번호는 오히려 쉽지만 매우 쉬운 방법 으로이 문제를 해결합니다. 이미 존재하는 번호의 프로그램 라인을 입력하면 이전 라인이 교체됩니다. 이제 화면 기반 REPL 환경이 유용 해집니다. 커서를 화면의 프로그램 목록 으로 이동 하고 화면의 행 편집 한 후 Enter 키를 눌러 저장하면됩니다. 이것은 실제로 화면에서 텍스트를 편집하고 전체 줄을 화면에서 새 줄로 바꾸는 경우 줄을 편집하는 것처럼 보입니다. 또한 사용하지 않는 숫자를 사이에두면 새 줄을 쉽게 삽입 할 수 있습니다. 시연하려면 :

10 FOR I=1 TO 42
20 PRINT I
30 NEXT I

변경 사항이있는 20 행을 다시 입력하고 새 행을 추가 한 후

5 LET COUNT=0
10 FOR I=1 TO 42
20 PRINT "Index", I
25 LET COUNT=COUNT+1
30 NEXT I

방금 해결 한 더 많은 문제

최소한 GOTOAND GOSUB명령 의 대상으로 언어 번호를 언어 구성으로 사용할 수 있다는 이점 (또는 유명한 BASIC 스파게티 코드를 가능하게하는 저주)이 있습니다 . 이것은 레이블로 대체 될 수 있지만 행 번호를 사용하는 것은 BASIC 인터프리터에서 구현하기가 훨씬 간단합니다. 이는 80 년대의 전형적인 8 비트 가정용 컴퓨터에서 여전히 확실한 보너스였습니다.

더 중요한 것은 사용자 경험 관점에서 행 번호는 실제로 코드 편집을위한 놀랍도록 쉽고 완벽한 인터페이스입니다. 새 코드를 삽입하려면 숫자로 시작하는 줄을 입력하십시오. LIST 100-200라인 100-200을 표시하는 데 사용 합니다. 줄을 편집하려면 화면에 줄을 나열하고 화면에서 텍스트를 편집 한 후 줄을 다시 입력하십시오. 줄을 제거하려면 빈 줄로 편집하십시오. 즉, 줄 번호를 줄이십시오. 이것을 설명하는 한 단락. DOS의 edlin 또는 Unix의 ed 또는 ex 와 같은 오래된 텍스트 편집기의 사용을 설명하는 것을 비교하십시오 . 우연히 시작했을 때 사용자가 종료 할 수있는 방법을 설명하기 위해 단 하나의 단락 (약간의 쌍곡선)이 필요합니다!

결론

다른 답변은 줄 번호가 어떻게 생겼는지 설명합니다. 여기서는 줄 번호가 왜 오래 살아남 았는지, 실제 문제를 해결하는 방법을 다루려고합니다. 실제 편집기없이 실제 프로그래밍을 매우 간단한 방법으로 수행 할 수있는 방법을 제공했습니다. 적절하고 사용하기 쉬운 전체 화면 텍스트 편집기가 하드웨어 제한이 사라지고 새로운 것을 적용하는 사람들의 관성이 극복되었을 때 코드를 편집하는 주요 방법이 되었으면 줄 번호 기반 BASIC 방언은 사용에서 매우 빨리 사라졌습니다. 그들이 해결 한 핵심 유용성 문제는 더 이상 문제가되지 않았습니다.


4
니가 끝냈어. 인쇄 tty 나 한 줄이 아닌 여러 줄로 된 화면이 있으면 더 쉬워 지지만 소스 파일 개념이 없으면 여전히 줄 방향입니다.
JDługosz

그러나 시스템이 8 비트 아키텍처라는 사실은 실제로 제한 요소가 아닙니다. 이제, 시스템에 몇 킬로바이트의 RAM과 몇 킬로바이트의 ROM이있을 수 있으며 영구 저장 장치가 없을 수도 있습니다 (카세트 테이프 레코더가 고장난 경우).
CVn

텍스트 편집기없이 코딩하는 것은 여전히 ​​어렵습니다
phuclv

@ LưuVĩnhPhúc 글쎄요, 거의 모든 8 비트 가정용 컴퓨터 나 MSDOS 및 GWBASIC과 dosbox와 같은 "실제"를 실행하기위한 많은 에뮬레이터가 있습니다. 예를 들어, 많은 C64 에뮬레이터 중 하나를 가져온 다음 Google에서 사용자 안내서를 PDF 로 찾을 수 있습니다 :-)
hyde

1
@phuclv-텍스트 편집기없이 코딩하기가 어렵습니다. 당시에는 텍스트 편집기를 사용하고 저장하고 실행하기 전에 컴파일해야하는 불편 함을 상상하기 어려웠습니다. 그것이 바로 PC 세계의 다음 단계였습니다. Pascal과 C. 컴파일 된 언어는 텍스트 편집기로 자유롭게 편집 할 수 있으며 프로그래밍 환경 자체는 아닙니다 (BASIC는 프로그래밍 환경과 런타임 환경이었습니다). 파스칼은 나의 다음 언어였으며 여러면에서 상당히 해방되었습니다. 확실히 더 강력합니다. 그러나 다른 방법으로는 조금 덜 스릴 있습니다.
DavidO

17

Basic이 개발 된 시대와 시대에 가장 유용한 I / O 장치는 텔레타이프였습니다. 프로그램 편집은 전체 프로그램의 목록 또는 흥미로운 부분을 종이에 인쇄 한 다음 줄 번호로 대체 줄을 입력하여 수행되었습니다.

그렇기 때문에 기본 줄 번호가 10으로 줄어든 것이므로 기존 줄 사이에 사용되지 않은 번호가있을 것입니다.


1
실제로, 카드 판독기 (키펀치와 함께 제공)와 라인 프린터는 텔레 프린터보다 우수한 I / O 장치이지만 텔레 프린터는 훨씬 저렴했습니다.
supercat

10으로 줄 번호를 매기는 것은 사실상 엄격한 기준이 아니라 엄격한 기준이었습니다. 그리고 많은 BASIC은 ren번호를 재기 위해 ' '명령을 받았습니다. 일반적인 호출은 ren 10, 10(10에서 시작하여 번호가 10 씩 증가-방금 입력 한 경우 기본 동작 ren입니다. gotoand gosubthen (linenumber)명령은 자동으로 업데이트됩니다.) 그러나 가장 초기의 BASIC에서는 확실히 사용할 수 없었지만 IIRC는 Apple에서 사용할 수있었습니다. Integer Basic, Applesoft FP basic, TI Basic / Extended Basic, MS Basic / GW Basic 등
DavidO

13

"행 번호"는 몇 가지 다른 것을 의미합니다.

우선, "라인"의 개념은 영원히 존재하지 않았다는 것을 명심하십시오. 이 시대의 많은 프로그래밍 언어는 펀치 카드를 사용 했으며 시퀀스 번호 (일반적으로 카드의 마지막 몇 열에 있음)는 카드를 떨어 뜨렸거나 카드 판독기에서 끔찍한 일이 발생했을 때 데크를 올바른 순서로 복구하는 데 도움이되었습니다. 이 작업을 자동으로 수행하는 기계가있었습니다.

GOTO명령문의 대상으로 사용하기위한 행 번호 는 완전히 다른 개념입니다. FORTRAN IV에서는 옵션이었으며 명령문 (1-5 열) 앞에 있습니다. 자유 형식 레이블보다 구현하기가 쉬울뿐만 아니라 계산 및 할당 된 GOTO 개념이 있어 임의의 행 번호로 이동할 수 있습니다. 이것은 가장 현대적인 프로그래밍 언어에는 없었지만 ( switch구문은 다가왔지 만) 어셈블러 프로그래머에게는 친숙한 트릭이었습니다.

BASIC은 FORTRAN에서 파생되었으며 구현하고 이해하기가 더 쉬워졌습니다. 따라서 모든 "줄"에 줄 번호 (시퀀싱 및 GOTO// GOSUB표 문의 대상)를 갖도록 강요 한 것은 아마도 그러한 이유로 결정된 디자인 결정일 것입니다.


2
아, 계산하고 할당했습니다. PL / 1의 레이블 변수 배열에 대한 메모리. 하나의 배열을 반복하여 일치하는 항목을 찾은 다음 해당 배열을 일치하는 레이블 변수 배열의 인덱스로 배열 인덱스를 사용합니다. 또는 코볼은 고토를 변경했습니다. 그리고 줄 번호를 사용하지 마십시오! BBC 기본은 매우 유용한 번호 변경 진술을했다.
킥 스타트

GCC를 사용하면 계산 된 GOTO를 확장명으로 사용할 수 있습니다 (물론 줄 번호는 없지만)goto array_of_labels[some_computation()];
immibis

마이너 : FORTRAN 요구의 대상 레이블 GOTO(또는 ASSIGN) 원래 일명 산술 일명 데이라이트 IF(거의 사용하지 않음)과의 대체 반환 CALL, 그리고 정렬의-목표 (틀림없이 구분 기호) DO, 그리고 FORMAT문. 다른 말로 그들은 선택 사항이었습니다.
dave_thompson_085

일부 BASIC (예 : Atari 's)에서도 임의의 숫자 표현식을 GOTO 문에 사용할 수있었습니다. 따라서 적절한 줄 번호 지정 규칙 GOTO 1000+N*100을 사용하여 switch명령문 을 에뮬레이트하도록 작성할 수 있습니다.
dan04

6

각 줄의 1-6 열에 줄 번호를 사용하는 COBOL로 프로그래밍을 시작했습니다. 1970 년대에 IDE가 없었기 때문에 모든 것이 펀치 카드를 통해 이루어졌으며 라인 번호는 원래 소스의 어떤 라인이 교체되고 어떤 라인이 추가되었는지 식별하는 데 사용되었습니다. 우리는 더 많은 라인을 추가 할 공간을 제공하기 위해 라인 번호를 100 씩 증가 시켰습니다.


14
COBOL은 해당 행 번호를 사용하지 않았습니다. 그것들은 엄청나게 편리했기 때문에 일부 빈약 한 schlub이 자신의 덱을 떨어 뜨렸을 때 카드가 도처에 갔을 때, 카드를 모아서 카드 분류기를 통과시켜 올바른 순서로 되돌릴 수있었습니다. 라인 번호를 카드에 펀치하지 않아도됩니다. (학생들은하지 않았다 생산 상점했다..)
존 R. Strohm

5

BASIC은 라인 터미널 시대에 FORTRAN보다 늦게 나왔습니다. 그것은 카드 한 벌보다 대화식 인 읽기-실행-인쇄-루프 환경을 특징으로합니다.

24 문자 를 포함하는 한 줄짜리 디스플레이 에서 BASIC으로 프로그래밍하는 법을 배웠습니다 . 줄 번호는 줄을 편집하거나 다른 줄에 삽입 할 때 줄을 이동하려는 위치를 지정하는 자연스러운 방법입니다.

나는 당신이 그것을 어떻게 할 것인지 정말로 상상할 수 없습니다.


2
이것은 이전의 4 가지 답변에서 제시되고 설명 된 포인트를 넘어서는 실질적인 것을 제공하지 않는 것 같습니다
gnat

2
그게 나쁜가요? Jaques는 실제로 줄을 삽입하고 정신적으로 코드를 추적하는 것과 관련하여 한 줄 편집의 본질을 다루지 않았다고 생각합니다.
JDługosz

1
@jameslarge "BASIC으로 작업 할 때 여러 번 ..."으로 시작하는 단락에서 그 요점을 놓치고 있습니까? 또한 BASIC을 운영 체제라고 부르는 것을 망설입니다. DOS였습니다. 그리고 DOS는 기본 작업이 필요하지 않았습니다. 대부분의 시간 동안 작업했던 것입니다.

2
@Ian은 사실이지만, io (Dartmouth Time Sharing System)에 텔레타이프를 사용하는 시스템을 위해 설계되었습니다 .
Jules

3
@MichaelT, 죄송합니다! 나는 내 의견의 절반을 철회 할 것이지만, 일부 컴퓨터에서 BASIC이 OS라는 것에 대해 서있을 것입니다. 생각 중이 야; Apple] [, TI 99/4, IBM 5100, HP 9830a, Compucolor 8001, TRS-80 모델 1, Comodore Vic20, Sinclair ZX80 등. ROM에서 BASIC으로 모두 부팅했습니다. 일부는했다 옵션 플로피 드라이브의 추가 $$를 지불하는 경우 플로피 디스크, 오디오 카세트에서로드 또는 될 수있는 운영 체제를.
Solomon Slow

1

아직 아무도 언급하지 않은 한 가지 점은 초보자가 분기 대상이 명확한 프로그램 흐름을 쉽게 추론 할 수 있다는 것입니다. 따라서 BEGIN / END 문 (또는 블록 구분 기호가 사용 된 항목)을 일치시키지 않고 (어쩌면 중첩 된) 제어 흐름이 어디로 갔는지를 알 수있었습니다. 이것은 아마도 BASIC의 대상 독자에게 유용했을 것입니다 (결국 초보자의 다목적 기호 명령 코드입니다).


1

Dartmouth Time Sharing System은 텔레타이프 인터페이스를 사용했습니다. 따라서 명령 기반 인터페이스를 사용했습니다. 원래 줄 번호는 프로그램을 편집하는 수단으로 사용되었습니다. 줄 번호를 사용하여 삽입, 교체 또는 삭제할 수 있습니다. 초기 버전은 goto 문에 줄 번호를 사용한 것으로 보이지는 않지만 나중에 언어에 추가되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.