왜 구 BASIC (및 다른 언어)이 소스 코드의 일부로 줄 번호를 사용 했습니까?
무슨 문제가 해결 되었습니까?
왜 구 BASIC (및 다른 언어)이 소스 코드의 일부로 줄 번호를 사용 했습니까?
무슨 문제가 해결 되었습니까?
답변:
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 방언 의 통역 항상 멀리 모든 라인이 번호 대신 단지 지점 목표했던 줄 번호를 필요로 할 수 있었다. 실제로, 라벨.
] PRINT "FOO"
은 BASIC 통역사가 즉시 운영했습니다. 성명서입니다. 나중에 실행하고자한다면, 당신은 할 것이다 ] 10 PRINT "FOO"
다음과 ] RUN
. AppleSoft BASIC 환경에서 모든 BASIC 문은 즉시 실행되거나 지연 될 수 있습니다. DOS에서 제공 한 유효한 BASIC 문이 아닌 명령은 거의 없었습니다. 지금 진술과 나중에 진술의 차이점은 줄 번호였습니다. 해당 행 번호를 다시 입력하여 지연된 명령문을 수정할 수도 있습니다. 한 줄에 여러 문장을 넣을 수도 있습니다.:
초기 마이크로 컴퓨터에서 편집은 라인 기반이었습니다. 소스 코드에서 자유롭게 이동하고 편집 할 수는 없습니다. 화면 하단에 명령을 입력하고 코드를 입력 할 수있는 한 줄이 있습니다. 화면의 나머지 부분은 읽기 전용 코드 목록과 명령 출력이었습니다. 프로그램에서 90 행을 편집하려면 " EDIT 90
" 를 작성 하고 행의 내용이 90
단일 행 편집 버퍼에 들어갑니다. 당신이 입력 한 줄을 편집하면 Enter 키를 누르면 프로그램 목록이 업데이트되었습니다. 따라서 프로그램을 편집하려면 줄 번호가 필요했습니다.
코드 편집기가 고급화되어 코드 목록에서 커서를 움직일 수있게되면 더 이상 줄 번호가 필요하지 않습니다.
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
최소한 GOTO
AND GOSUB
명령 의 대상으로 언어 번호를 언어 구성으로 사용할 수 있다는 이점 (또는 유명한 BASIC 스파게티 코드를 가능하게하는 저주)이 있습니다 . 이것은 레이블로 대체 될 수 있지만 행 번호를 사용하는 것은 BASIC 인터프리터에서 구현하기가 훨씬 간단합니다. 이는 80 년대의 전형적인 8 비트 가정용 컴퓨터에서 여전히 확실한 보너스였습니다.
더 중요한 것은 사용자 경험 관점에서 행 번호는 실제로 코드 편집을위한 놀랍도록 쉽고 완벽한 인터페이스입니다. 새 코드를 삽입하려면 숫자로 시작하는 줄을 입력하십시오. LIST 100-200
라인 100-200을 표시하는 데 사용 합니다. 줄을 편집하려면 화면에 줄을 나열하고 화면에서 텍스트를 편집 한 후 줄을 다시 입력하십시오. 줄을 제거하려면 빈 줄로 편집하십시오. 즉, 줄 번호를 줄이십시오. 이것을 설명하는 한 단락. DOS의 edlin 또는 Unix의 ed 또는 ex 와 같은 오래된 텍스트 편집기의 사용을 설명하는 것을 비교하십시오 . 우연히 시작했을 때 사용자가 종료 할 수있는 방법을 설명하기 위해 단 하나의 단락 (약간의 쌍곡선)이 필요합니다!
다른 답변은 줄 번호가 어떻게 생겼는지 설명합니다. 여기서는 줄 번호가 왜 오래 살아남 았는지, 실제 문제를 해결하는 방법을 다루려고합니다. 실제 편집기없이 실제 프로그래밍을 매우 간단한 방법으로 수행 할 수있는 방법을 제공했습니다. 적절하고 사용하기 쉬운 전체 화면 텍스트 편집기가 하드웨어 제한이 사라지고 새로운 것을 적용하는 사람들의 관성이 극복되었을 때 코드를 편집하는 주요 방법이 되었으면 줄 번호 기반 BASIC 방언은 사용에서 매우 빨리 사라졌습니다. 그들이 해결 한 핵심 유용성 문제는 더 이상 문제가되지 않았습니다.
Basic이 개발 된 시대와 시대에 가장 유용한 I / O 장치는 텔레타이프였습니다. 프로그램 편집은 전체 프로그램의 목록 또는 흥미로운 부분을 종이에 인쇄 한 다음 줄 번호로 대체 줄을 입력하여 수행되었습니다.
그렇기 때문에 기본 줄 번호가 10으로 줄어든 것이므로 기존 줄 사이에 사용되지 않은 번호가있을 것입니다.
ren
번호를 재기 위해 ' '명령을 받았습니다. 일반적인 호출은 ren 10, 10
(10에서 시작하여 번호가 10 씩 증가-방금 입력 한 경우 기본 동작 ren
입니다. goto
and gosub
및 then (linenumber)
명령은 자동으로 업데이트됩니다.) 그러나 가장 초기의 BASIC에서는 확실히 사용할 수 없었지만 IIRC는 Apple에서 사용할 수있었습니다. Integer Basic, Applesoft FP basic, TI Basic / Extended Basic, MS Basic / GW Basic 등
"행 번호"는 몇 가지 다른 것을 의미합니다.
우선, "라인"의 개념은 영원히 존재하지 않았다는 것을 명심하십시오. 이 시대의 많은 프로그래밍 언어는 펀치 카드를 사용 했으며 시퀀스 번호 (일반적으로 카드의 마지막 몇 열에 있음)는 카드를 떨어 뜨렸거나 카드 판독기에서 끔찍한 일이 발생했을 때 데크를 올바른 순서로 복구하는 데 도움이되었습니다. 이 작업을 자동으로 수행하는 기계가있었습니다.
GOTO
명령문의 대상으로 사용하기위한 행 번호 는 완전히 다른 개념입니다. FORTRAN IV에서는 옵션이었으며 명령문 (1-5 열) 앞에 있습니다. 자유 형식 레이블보다 구현하기가 쉬울뿐만 아니라 계산 및 할당 된 GOTO 개념이 있어 임의의 행 번호로 이동할 수 있습니다. 이것은 가장 현대적인 프로그래밍 언어에는 없었지만 ( switch
구문은 다가왔지 만) 어셈블러 프로그래머에게는 친숙한 트릭이었습니다.
BASIC은 FORTRAN에서 파생되었으며 구현하고 이해하기가 더 쉬워졌습니다. 따라서 모든 "줄"에 줄 번호 (시퀀싱 및 GOTO
// GOSUB
표 문의 대상)를 갖도록 강요 한 것은 아마도 그러한 이유로 결정된 디자인 결정일 것입니다.
goto array_of_labels[some_computation()];
GOTO
(또는 ASSIGN
) 원래 일명 산술 일명 데이라이트 IF
(거의 사용하지 않음)과의 대체 반환 CALL
, 그리고 정렬의-목표 (틀림없이 구분 기호) DO
, 그리고 FORMAT
문. 다른 말로 그들은 선택 사항이었습니다.
GOTO 1000+N*100
을 사용하여 switch
명령문 을 에뮬레이트하도록 작성할 수 있습니다.
각 줄의 1-6 열에 줄 번호를 사용하는 COBOL로 프로그래밍을 시작했습니다. 1970 년대에 IDE가 없었기 때문에 모든 것이 펀치 카드를 통해 이루어졌으며 라인 번호는 원래 소스의 어떤 라인이 교체되고 어떤 라인이 추가되었는지 식별하는 데 사용되었습니다. 우리는 더 많은 라인을 추가 할 공간을 제공하기 위해 라인 번호를 100 씩 증가 시켰습니다.
BASIC은 라인 터미널 시대에 FORTRAN보다 늦게 나왔습니다. 그것은 카드 한 벌보다 대화식 인 읽기-실행-인쇄-루프 환경을 특징으로합니다.
24 문자 를 포함하는 한 줄짜리 디스플레이 에서 BASIC으로 프로그래밍하는 법을 배웠습니다 . 줄 번호는 줄을 편집하거나 다른 줄에 삽입 할 때 줄을 이동하려는 위치를 지정하는 자연스러운 방법입니다.
나는 당신이 그것을 어떻게 할 것인지 정말로 상상할 수 없습니다.