존재하지 않는 라인으로 이동 (등)?
BASIC 인터프리터를 작성 하면 문서에서 언급되지 않는 흥미로운 정보가 많이 드러났습니다. 예를 들면 :
10 PRINT"ONE";:IF 1=2 THEN PRINT"TWO":PRINT"THREE"
ONE
Microsoft에서 파생 된 BASIC에 인쇄 하고 Dartmouth는 ONETHREE
. 즉, MS는 나머지 줄 전체를 THEN
.. 이상한 (그리고 잘못된 IMHO)의 일부로 취급합니다 . 나는 내가 마지막 문장을 실행 한 예제 코드가 Super Star Trek을 실패하게 만들었 기 때문에 이것을 알아 차 렸습니다 .
나는 호이 폴로 이에 공개하고 싶은 또 다른 예를 보았습니다. 이 프로그램을 고려하십시오.
10 PRINT"HELLO"
20 GOTO 25
30 PRINT"WORLD"
내가 가지고있는 예제 코드는 25 행 이나 그 다음으로 높은 명령문을 찾을 것 입니다. 따라서 해당 코드에서 30 행이 실행됩니다. "UNDEFN'D STATEMENT"를 반환하는 Commodore BASIC의 경우는 확실히 그렇지 않습니다.
그래서 ...이 방식으로 작동하는 BASIC 버전을 아는 사람이 있습니까? 아니면 이것이 (강하게 의심하는 것처럼) 예제 코드의 단순히 버그입니까?
답변
ZX Spectrum의 Sinclair BASIC은 사용 가능한 다음 라인 번호로 이동합니다. 매뉴얼은 말한다
GO TO 명령의 행 번호가 존재하지 않는 행을 참조하는 경우 지정된 번호 다음의 다음 행으로 점프합니다. RUN도 마찬가지입니다. 실제로 RUN 자체는 실제로 RUN 0을 의미합니다.
BASIC 방언은 세부 사항이 상당히 다른 것으로 알려져 있습니다. 보다 확실한 버전 중 하나는 다음을 수행하는 BBC BASIC입니다.

실제로 실제로 유용한 다중 문 IF-THEN 본문의 사용을 정당화하는 IF-THEN-ELSE 구조에 유의하십시오.
BBC BASIC V는 ENDIF 키워드와 다중 라인 IF-THEN-ELSE-ENDIF 블록 기능을 추가했습니다. 일반적으로 BBC BASIC은 대부분의 초기 마이크로 컴퓨터 BASIC보다 구조화 된 프로그래밍을 더 쉽게 만들어 줍니다.
예제는 버그가 아니라 정의되지 않은 동작이며 다른 언어에서도 일반적입니다. 플랫폼 간 호환성을 기대하는 경우 정의되지 않은 동작을 초래하는 작업을 수행하지 마십시오.
또한 첫 번째 예제에서 프로그래머의 의도가 명확하지 않아 수정하기 어려운 버그가 발생할 수 있습니다. 다시 말하지만 그렇게하지 마십시오. 두 번째 예제는 프로그래머가 의도 한대로 작동하거나 파서가 불평하기 때문에 더 낫기 때문에 버그를 빠르게 찾고 수정할 수 있습니다.
10 PRINT"ONE";:IF 1=2 THEN PRINT"TWO":PRINT"THREE"
Microsoft에서 파생 된 BASIC에 ONE을 인쇄하고 Dartmouth는 ONETHREE를 생성합니다. 즉, MS는 나머지 라인 전체를 THEN의 일부로 취급합니다. 이것은 ... 이상하고 잘못된 IMHO입니다.
글쎄, 나는 옳고 그름이 없다고 생각하지만, 각각의 BASIC은 나름대로의 방식입니다. MS의 방식은 기본적으로 GOTO없이 THEN 절 내에서 코드 블록을 생성 할 수 있습니다. 이전에 FORTRAN과 같은 지점에서 작동하는 Dartmouth를 사용하면 THEN이 코드 블록으로 이동 한 다음 GOTO를 실행해야합니다.
10 PRINT"ONE";
20 IF 1=2 THEN GOTO 40
30 GOTO 50
40 PRINT"TWO"
50 PRINT"THREE"
60 REM
글쎄, 또는 코드 블록을 뛰어 넘기 위해 반전 된 절을 사용하십시오. 정말 훌륭한 구조는 아닙니다.
THEN 이후에 임의의 문장을 허용하는 것은 Dartmouth BASIC에없는 추후 추가 기능이라는 점에 유의해야합니다. 콜론으로 구분 된 여러 명령문도 마찬가지입니다.
그 후 블록의 일부로 전체 (나머지) 라인을 처리하는 MS의 방식을 사용하면 많은 두뇌 조깅과 고토없이이 구조를 만들 수 있습니다.
그러나 MS에 의해 발명 된 것이 아니라 매뉴얼의 3-12 페이지에 설명 된대로 1972 년 DEC BASIC-PLUS 에서 가져 왔습니다 (결국 MS BASIC은 DEC BASIC의 복제품입니다).

따라서 여기에서 THEN 여러 문이 허용되지만 전체적으로 실행되거나 (조건이 참인 경우) 전혀 실행되지 않습니다.
이제 '올바른'방법을 찾을 때 일반적으로 먼저 BASIC 표준을 살펴 보는 것이 가장 좋습니다. 여기 첫 번째는
ECMA 55 1978 년 최소 기본
이것은 모든 BASIC이 휴대하기 위해 준수해야하는 최소한의 사항을 설명합니다. 본질적으로 Dartmouth BASIC (Thomas Kurtz는 편집자 중 한 명임)를 명확하고 재현 가능한 방식으로 나중에 화 신화했습니다. 여기서 THEN 문은 점프 할 줄 번호 만 허용합니다.
1979 년 ANSI 최소 기본
본질적으로 ANSI 버전의 ECMA-55.
이것은 BTW입니다. MS-BASIC이 규범 적 힘이되기 시작한 시점
1986 년의 ECMA 116 BASIC , 'Full BASIC'이라고도 함
여기서 다중 문 및 다중 행 THEN 구성 및 이들의 혼합이 가능합니다. 다중 문은 'MS 방식'처럼 작동하지만 다중 행에는 블록을 닫으려면 ENDIF (또는 ELSE / ELSEIF) 문이 필요합니다. (또한 최신 BASIC에서 알려진 다른 많은 기능을 줄 번호만으로 제공)
1987 년 ANSI / ISO / IEC Full BASIC
본질적으로 ECMA-116에는 몇 가지 설명 / 확장 기능이 있습니다.
따라서 MS는 ECMA-116의 말을 따르거나 ... 음, 아니면 표준이 MS가 이전에했던 일을 성문화하여 사실상의 표준이되었습니다. BASIC의 실행 가능한 공통 위치를 포착하기 위해 이러한 표준에 많은 작업이 투입되었습니다. 여기에는 특히 겉보기에 분명해 보이는 문제의 가장자리 사례가 포함됩니다. 토론을 위해 열려있는 것이있을 때마다 확인하는 것이 가장 좋은 방법이라고 생각합니다. 특히 결정되지 않은 문제를 지적하고 해석 할 수 있기 때문입니다.
내가 가지고있는 예제 코드는 25 번째 줄이나 그 다음으로 높은 문 [...]
그래서 ...이 방식으로 작동하는 BASIC 버전을 아는 사람이 있습니까? 아니면 이것이 (강하게 의심하는 것처럼) 예제 코드의 단순히 버그입니까?
계산 된 GOTO를 쉽게하기 위해 '사이'행을 점프 할 수있는 TINY BASIC을 기억하지만 원래 소스를 보면 이와 같이 이음새가 수정되었습니다.
대조적으로 ECMA-55는 THEN / GOTO / GOSUB에서 대상으로 사용 된 대상에 대해 다음과 같이 표시합니다.
All line-numbers in control-statements shall refer to lines in the program.
실용적인 측면에서
인터프리터가 실행할 수 있도록하려는 레거시 코드 결정
옵션으로 지원할 호환되지 않는 방언 (있는 경우) 결정
그들이하는 것과 똑같은 일을하십시오.
Raffzahn이 언급했듯이 Microsoft의 동작은 Dartmouth의 동작보다 더 편리합니다. Microsoft BASIC을 사용하면 여러 문으로 조건 블록을 작성할 수 있기 때문입니다. 또한 Microsoft의 동작을 예상하는 프로그램을 실행하고 싶다고 말합니다.
마찬가지로, 어떤 레거시 코드가 의도적 것을 매우 가능성이 GOTO
라인이 존재하지 않는,하지만 기존의 일부 프로그램이 같은 오타에도 불구하고 제대로 실행 수있는 가능성이 GOTO 24
대신 GOTO 25
.
호환되지 않는 동작에 의존하는 코드도 실행해야하는 경우 옵션으로 제공 할 수 있습니다.
내가 사용한 방언은 가장 가까운 큰 번호가있는 기존 회선에 제어권을 전달하는 것입니다. 그렇지 않은 경우 오류 메시지없이 프로그램을 종료하는 합법적 인 방법입니다.
범위의 중간으로 제어권을 전달하면 진입 점의 양쪽에 줄을 추가 할 수 있습니다. 리팩토링도 매우 지루했기 때문에 이것은 많은 도움이되었습니다. 검색이 없었고 라인을 변경하는 유일한 방법은 완전하게 전체 길이를 다시 입력하는 것뿐이었습니다. 해당 버전에는 자동화 된 라인 리 넘버 레이션이 없습니다.
기계는 일종의 소련 "Elektronika"였지만 정확히 기억이 나지 않습니다. 콘솔에 2 열 LED 디스플레이가있는 매우 고급 계산기처럼 보였지만 이미 외부 모니터와 키보드를 지원했습니다.