INTERCAL (C-INTERCAL), 15 개 코드, 313 + 2 = 315 바이트
PLEASE WRITE IN .1
(8) PLEASE CREATE .1 A
PLEASE A
PLEASE COME FROM #2$!1/#1'
DO X
(123) DO (123) NEXT
DO COME FROM (222)
(222) DO STASH .2
(240) DO ,1 <- #0
(241) DO ,1 SUB #0 <- #1
(19) DO .2 <- #256 $ #0
(21) DO .1 <- #2
(148) DO GO BACK
(180) DO RETRIEVE .2
DO COME FROM (50)
(50) DO WRITE IN .2
(109) DO RESUME #0
(120) DO RESUME #9
MAYBE COME FROM (223)
(223) DO COME FROM (223)
(121) PLEASE NOT X
온라인으로 사용해보십시오!
여기의 모든 공백은 관련이 없습니다. (원래의 프로그램에는 탭이 포함되어 있지만 SE에서 올바르게 정렬되도록 공백으로 변환했습니다 .INTERCAL에는 탭 너비 8을 사용하는 것이 일반적입니다. 모든 탭과 공백으로 프로그램 버전을 테스트했습니다. 개행 문자는 삭제되었지만 정상적으로 작동합니다.)
-abm
( -b
컴파일러가 결정적이어야하기 때문에 2 바이트 페널티)로 컴파일하십시오 .
INTERCAL의 경우와 같이 형식은 숫자 입력을 사용합니다 (예 : ONE TWO THREE
for) 123
.
설명
C-INTERCAL 프로그램 오류가 발생하면 종료 상태는 오류 코드 모듈로 256입니다. 결과적으로 가능한 많은 런타임 오류를 생성 할 수있는 프로그램을 작성할 수 있습니다. 이 프로그램은 내부 컴파일러 문제를 나타내지 않는 두 가지 런타임 오류 만 생략합니다. ICL200I, 재생하려면 단일 스레드 프로그램과 호환되는 외부 라이브러리를 사용해야하기 때문에 (멀티 스레드 프로그램에는 더 많은 오류가 있음); 533은 277과 동일한 모듈로 256의 값을 가지며 프로그램은 ICL277I를 생성 할 수 있기 때문에 ICL533I.
프로그램은 항상 같은 방식으로 시작합니다. 먼저 WRITE IN
변수 값을 입력합니다 ( ) .1
. 그런 다음 계산 된 CREATE
문을 사용하여 새 구문 (여기서는 A
) 을 만듭니다 . 계산되기 때문에 구문 정의는의 값에 따라 다릅니다 .1
. 마지막으로, 대부분의 경우 A
오류를 생성하도록 정의 된 새 명령문 을 실행 합니다. 우리가 가질 수있는 정의 테이블에는 각각의 가능한 런타임 오류에 대한 정의가 포함되어 있습니다 (위에 나열된 예외는 제외).
첫째,이 일반적인 계획에는 두 가지 예외가 있습니다. (0)
는 유효한 줄 번호가 아니므로 사용자가를 입력 하면 계산 된 문 ZERO
을 통해 두 번째 줄 (numbered (8)
)에서 네 번째 줄로 이동 COME FROM
합니다. 그러면 구문 오류가 발생 DO X
하여 오류가 발생 ICL000I
합니다. INTERCAL에서는 런타임에 명령이 비활성화되는 경향, 사용자가 구문을 다시 정의하는 등의 이유로 인해 구문 오류가 발생합니다. COME FROM
문은 실제가 있더라도 부작용이 COME FROM
발 피연산자 과부하 생성 일어나지 .1
에 #1
라인 번호를 가진 라인이 실행될 때마다 단계; 이것은 나중에 출력 21을 생성 할 때 사용됩니다. (임의의 글로벌 부작용은 INTERCAL에서 상당히 관용적입니다.)
다른 예외는 input ONE TWO NINE
입니다. (129)
프로그램에 줄 번호가 없으므로 줄 번호 가 누락되면 오류가 발생합니다 ICL129I
. 따라서 해당 사례를 다루기 위해 코드를 작성할 필요가 없었습니다.
다른 오류와 그 원인은 다음과 같습니다.
- 123 은
NEXT
스택 오버플로 ( DO (123) NEXT
)입니다. NEXT
문 (다른 수정이 필요 FORGET
하거나 RESUME
소급 그것이 무엇 제어문의 종류 결정하기 위해). 이러한 문제가 없으면 해결되지 않은`NEXT 문이 80 번 있으면 오류 ICL123I가 발생합니다.
- 222 (숨김 오버플
DO STASH .2
A의 COME FROM
루프). 스 태시는 사용 가능한 메모리에 의해서만 제한되지만 결국에는 ICL222I 오류가 발생합니다.
- 240 은 크기가 0 인 배열의 크기입니다. 이것이
DO ,1 <- #0
의미하는 바이며, 오류 ICL240I가 발생합니다.
- 241 은 배열의 경계 외부에 할당하기 때문에 발생합니다. 이 경우
,1
할당되지 않았 ,
으며 (INTERCAL의 배열 유형 변수에 사용됨) 인덱싱하면 오류 ICL241I가 발생합니다.
- 19
#256 $ #0
는 16 비트 변수에 65536 ( )을 할당 합니다 .2
. 맞지 않아서 ICL275I 오류가 발생합니다.
- 21이에 할당
#2
합니다 .1
. 그것은 충분히 간단한 할당처럼 보일지 모르지만, 우리 .1
는 #1
앞서 의미하기 위해 오버로드 -v
했으며 명령 행에서 옵션 없이 값 1을 변경하려고 하면 오류 ICL277I가 발생합니다.
- 148
GO BACK
은 프로그램의 현재 시점에 존재하지 않는 선택 점 스택 ( ) 의 최상위 항목으로 돌아 가려고합니다 (선택 점 스택을 조작하는 명령을 실행하지 않았으므로 여전히 비어 있습니다). 오류 ICL404I가 발생합니다.
RETRIEVE .2
존재하지 않는 숨김에서 180 개의 시도 (프로그램의이 분기에 아무것도 숨기지 않았기 때문에)가 ICL436I 오류를 발생시킵니다.
- 50
WRITE IN
은 COME FROM
루프 에서 영원히 입력 ( )을 요청 합니다. 결국 우리는 EOF를 넘어서서 읽기로 ICL562I 오류를 일으킨다.
- 109 는 명령문을 실행하는데
DO RESUME #0
, 이는 의미가 없으며 구체적으로 오류를 일으킨 것으로 문서화됩니다 (ICL621I).
- 120 문을 실행합니다
DO RESUME #9
. NEXT
아직 많은 명령문을 실행하지 않았으므로 ICL120I 오류가 발생합니다. 흥미롭게도이 특정 오류는 INTERCAL 설명서에서 프로그램을 정상적으로 종료 한 다음 오류가있는 프로그램을 종료하지 않고 오류를 일으키는 것으로 정의됩니다. 그러나이 두 경우가 상당히 다르다고는 생각하지 않습니다.
- 223 은 기본적으로 복잡한 멀티 스레딩 프리미티브 엉킴으로, 모두 라인 223을 가리키며 무한 루프를 발생시켜 메모리를 증가시킵니다. 결국, 멀티 스레딩 서브 시스템에 메모리 소진이 발생하여 ICL991I 오류가 발생합니다.
- 121 은 실제로 유효한 문장이지만 (주석입니다) 프로그램의 끝에 나타납니다. 이와 같이, 실행은 프로그램이 실행 된 직후 프로그램의 끝에서 떨어지며 ICL633I 오류를 발생시킵니다.
확인
일부 오류는 의도적으로 메모리에서 프로그램을 실행하는 것과 관련이 있으므로 상당히 작은 메모리 제한을 설정하는 것이 좋습니다. 프로그램을 테스트하는 데 사용한 쉘 명령은 다음과 같습니다 (가독성을 위해 줄 바꿈이 추가되었습니다. 직접 실행하면 삭제하십시오).
for x in "ZERO" "ONE NINE" "TWO ONE" "FIVE ZERO" "ONE ZERO NINE"
"ONE TWO ZERO" "ONE TWO ONE" "ONE TWO THREE" "ONE TWO NINE"
"ONE FOUR EIGHT" "ONE EIGHT ZERO" "TWO TWO TWO"
"TWO TWO THREE" "TWO FOUR ZERO" "TWO FOUR ONE";
do echo;
echo $x;
echo $x | (ulimit -Sd 40000; ulimit -Sv 40000; ulimit -Ss 40000;
./errors; echo $?);
done
그리고 여기에 출력이 있습니다 (라인 번호와 공간을 절약하기 위해 "PLEASE CORRECT SOURCE"메시지가 삭제되었습니다). 프로그램의 작동을 보여주기 위해 부분적으로 추가했지만 주로 INTERCAL의 어리석은 오류 메시지를 표시합니다.
ZERO
ICL000I PLEASEWRITEIN.1(8)PLEASECREATE.1APLEASEAPLEASECOMEFROM#2$!1/#1'DOX(123)DO(123)NEXTDOCOMEFROM(222)(222)DOSTASH.2(240)DO,1<-#0(241)DO,1SUB#0<-#1(19)DO.2<-#256$#0(21)DO.1<-#2(148)DOGOBACK(180)DORETRIEVE.2DOCOMEFROM(50)(50)DOWRITEIN.2(109)DORESUME#0(120)DORESUME#9MAYBECOMEFROM(223)(223)DOCOMEFROM(223)(121)PLEASENOTX
0
ONE NINE
ICL275I DON'T BYTE OFF MORE THAN YOU CAN CHEW
19
TWO ONE
ICL277I YOU CAN ONLY DISTORT THE LAWS OF MATHEMATICS SO FAR
21
FIVE ZERO
ICL562I I DO NOT COMPUTE
50
ONE ZERO NINE
ICL621I ERROR TYPE 621 ENCOUNTERED
109
ONE TWO ZERO
ICL632I THE NEXT STACK RUPTURES. ALL DIE. OH, THE EMBARRASSMENT!
120
ONE TWO ONE
ICL633I PROGRAM FELL OFF THE EDGE
121
ONE TWO THREE
ICL123I PROGRAM HAS DISAPPEARED INTO THE BLACK LAGOON
123
ONE TWO NINE
ICL129I PROGRAM HAS GOTTEN LOST
129
ONE FOUR EIGHT
ICL404I I'M ALL OUT OF CHOICES!
148
ONE EIGHT ZERO
ICL436I THROW STICK BEFORE RETRIEVING!
180
TWO TWO TWO
ICL222I BUMMER, DUDE!
222
TWO TWO THREE
ICL991I YOU HAVE TOO MUCH ROPE TO HANG YOURSELF
223
TWO FOUR ZERO
ICL240I ERROR HANDLER PRINTED SNIDE REMARK
240
TWO FOUR ONE
ICL241I VARIABLES MAY NOT BE STORED IN WEST HYPERSPACE
241