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 มันเป็นเรื่องธรรมดาที่จะใช้ความกว้างของแท็บที่ 8 สำหรับ INTERCAL ฉันได้ทดสอบเวอร์ชันของโปรแกรมด้วยแท็บทั้งหมดเว้นวรรค และลบบรรทัดใหม่แล้ว แต่ก็ใช้ได้ดี)
คอมไพล์ด้วย-abm
(การลงโทษ 2 ไบต์เนื่องจาก-b
จำเป็นสำหรับคอมไพเลอร์ที่จะกำหนดขึ้น)
ในฐานะที่เป็นปกติสำหรับ INTERCAL นี้จะใช้เวลาการป้อนข้อมูลที่เป็นตัวเลขในรูปแบบเช่นสำหรับONE TWO THREE
123
คำอธิบาย
เมื่อโปรแกรม C-INTERCAL ผิดพลาดสถานะทางออกคือรหัสข้อผิดพลาดมอดูโล 256 ดังนั้นเราจึงสามารถเขียนโปรแกรมที่สามารถสร้างข้อผิดพลาดรันไทม์ให้ได้มากที่สุด โปรแกรมนี้ละเว้นข้อผิดพลาดรันไทม์สองรายการเท่านั้นที่ไม่ได้ระบุปัญหาคอมไพเลอร์ภายใน: ICL200I เนื่องจากการทำซ้ำต้องใช้ไลบรารีภายนอกที่เข้ากันได้กับโปรแกรมแบบเธรดเดียวเท่านั้น (และโปรแกรมแบบมัลติเธรดมีข้อผิดพลาดเพิ่มเติม) และ ICL533I เนื่องจาก 533 มีค่าโมดูโล 256 เช่นเดียวกับ 277 และโปรแกรมของความสามารถในการผลิต ICL277I
โปรแกรมเริ่มต้นด้วยวิธีเดียวกันเสมอ ครั้งแรกที่เราป้อนข้อมูล ( WRITE IN
) .1
ค่าสำหรับตัวแปร จากนั้นเราใช้CREATE
คำสั่งที่คำนวณเพื่อสร้างไวยากรณ์ใหม่ (ที่นี่A
); .1
แต่เพราะมันคำนวณความหมายของไวยากรณ์ที่แตกต่างกันไปขึ้นอยู่กับมูลค่าของ ในที่สุดกรณีส่วนใหญ่เราเรียกใช้A
คำสั่งใหม่ของเราซึ่งได้รับการกำหนดให้ผลิตข้อผิดพลาด; ตารางคำจำกัดความที่เป็นไปได้ที่เรามีมีคำจำกัดความสำหรับข้อผิดพลาดรันไทม์ที่เป็นไปได้แต่ละข้อ (นอกเหนือจากข้อยกเว้นที่ระบุไว้ด้านบน)
ครั้งแรกมีข้อยกเว้นสองประการสำหรับโครงการทั่วไปนี้ (0)
ไม่ใช่หมายเลขบรรทัดที่ถูกต้องดังนั้นหากผู้ใช้ป้อนZERO
เราจะข้ามจากบรรทัดที่สอง (หมายเลข(8)
) ไปยังบรรทัดที่สี่โดยใช้COME FROM
คำสั่งที่คำนวณ นี้จากนั้นจะตกผ่านลงในไวยากรณ์ผิดพลาดซึ่งก่อให้เกิดข้อผิดพลาดDO X
ICL000I
(ใน INTERCAL ข้อผิดพลาดทางไวยากรณ์เกิดขึ้นที่รันไทม์เนื่องจากแนวโน้มของคำสั่งที่จะปิดการใช้งานไวยากรณ์ที่จะถูกกำหนดใหม่ภายใต้คุณ ฯลฯ ) COME FROM
คำสั่งนอกจากนี้ยังมีผลข้างเคียงแม้ว่าจะไม่มีเกิดขึ้นจริงCOME FROM
ที่เกิดขึ้นสร้างเกินตัวถูกดำเนินการจาก.1
ไป#1
เมื่อใดก็ตามที่สอดคล้องกับจำนวนเส้นจะถูกดำเนินการ; สิ่งนี้จะถูกใช้ในภายหลังเมื่อผลิตผลลัพธ์ 21. (ผลข้างเคียงจากการสุ่มทั่วโลกนั้นค่อนข้างเป็นสำนวนใน INTERCAL)
ยกเว้นในกรณีอื่น ๆ ONE TWO NINE
คือมีการป้อนข้อมูล ไม่มีหมายเลขบรรทัดเป็นในโปรแกรมเพื่อให้เราได้รับข้อผิดพลาดสำหรับจำนวนเส้นที่ขาดหายไปซึ่งเป็น(129)
ICL129I
ดังนั้นฉันไม่ต้องเขียนโค้ดใด ๆ เพื่อให้ครอบคลุมกรณีดังกล่าวเลย
นี่คือข้อผิดพลาดอื่น ๆ และสิ่งที่ทำให้พวกเขา:
- 123คือ
NEXT
สแต็กล้น ( DO (123) NEXT
) NEXT
คำสั่งปรับเปลี่ยนความต้องการอื่น ๆ ( FORGET
หรือRESUME
) เพื่อให้มีผลย้อนหลังกำหนดประเภทของคำสั่งการควบคุมมันเป็น ไม่มีปัญหาเหล่านั้นที่ทำให้เกิดข้อผิดพลาด ICL123I เมื่อมี 80 คำสั่ง NEXT ที่ยังไม่ได้แก้ไข
- 222เป็น stash overflow (
DO STASH .2
ในCOME FROM
ลูป) ที่เก็บถูก จำกัด ด้วยหน่วยความจำที่มีอยู่เท่านั้น แต่จะหมดในที่สุดทำให้เกิดข้อผิดพลาด ICL222I
- 240คือขนาดของอาร์เรย์ที่มีขนาดเป็นศูนย์ นั่นคือสิ่งที่
DO ,1 <- #0
หมายถึงและมันทำให้เกิดข้อผิดพลาด ICL240I
- 241เกิดจากการกำหนดนอกขอบเขตของอาร์เรย์ ในกรณีนี้
,1
ยังไม่ได้รับการจัดสรร ( ,
ใช้สำหรับตัวแปรประเภทอาร์เรย์ใน INTERCAL) ดังนั้นการจัดทำดัชนีจะทำให้เกิดข้อผิดพลาด ICL241I
- 19กำหนด 65536 (
#256 $ #0
) .2
ให้กับตัวแปร ไม่พอดีทำให้เกิดข้อผิดพลาด ICL275I
- 21ได้รับมอบหมายไป
#2
.1
นั่นอาจดูเหมือนการมอบหมายที่ง่าย แต่เราโหลดมากเกินไป.1
เพื่อหมายถึง#1
ก่อนหน้านี้และพยายามเปลี่ยนค่า 1 โดยไม่มี-v
ตัวเลือกในบรรทัดคำสั่งทำให้เกิดข้อผิดพลาด ICL277I
- 148ความพยายามที่จะกลับไปที่รายการด้านบนของ choicepoint stack (
GO BACK
) ซึ่งไม่มีอยู่ในจุดนี้ในโปรแกรม (เราไม่ได้เรียกใช้คำสั่งใด ๆ เพื่อจัดการกับ stack pointpoint ดังนั้นจึงยังว่างอยู่) ที่ทำให้เกิดข้อผิดพลาด ICL404I
- 180ความพยายามใน
RETRIEVE .2
การซ่อนที่ไม่มีอยู่ (เนื่องจากเราไม่ได้ซ่อนอะไรในโปรแกรมนี้ในสาขานี้) ทำให้เกิดข้อผิดพลาด 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
และนี่คือผลลัพธ์ (ที่มีหมายเลขบรรทัดและข้อความ "โปรดแก้ไขแหล่งที่ถูกลบ" เพื่อประหยัดพื้นที่) ซึ่งฉันได้เพิ่มบางส่วนเพื่อสาธิตการทำงานของโปรแกรม แต่ส่วนใหญ่จะแสดงข้อความผิดพลาดของ 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