7 , 2 ไบต์
7 ใช้ชุดอักขระ 3 บิต แต่รับอินพุตที่บรรจุเป็นไบต์ (และอ้างอิงจาก meta ภาษาที่มีชุดอักขระย่อยไบต์จะถูกนับโดยใช้ไบต์สำหรับไฟล์บนดิสก์ ) นี่คือxxd
ดัมพ์ของโปรแกรม:
00000000: 4cf4 L.
เมื่อให้ไฟล์นี้แก่ล่าม 7 มันจะส่งออกโปรแกรมต่อไปนี้:
00000000: 4fa6 7f O..
ซึ่งจะเป็นการส่งออกโปรแกรมต้นฉบับอีกครั้ง
แล้วเกิดอะไรขึ้นที่นี่? ไม่มีแหล่งข้อมูลที่เกี่ยวข้องในการอ่าน (จริง ๆ แล้วฉันไม่คิดว่าเป็นไปได้ที่จะอ่านแหล่งที่มาใน 7) แม้ว่าเนื้อหาจะโกงโปรแกรมในอีกทางหนึ่ง แจ้งให้เราทราบสิ่งที่คุณคิด. นี่คือวิธีการทำงานของโปรแกรม (โปรดทราบว่าแต่ละคำสั่ง 7 มีสองตัวแปรซึ่งบางส่วนไม่มีชื่อและไม่สามารถปรากฏในโปรแกรมต้นฉบับมีทั้งหมดสิบสองคำสั่งในหกคู่ฉันใช้ตัวหนาสำหรับคำสั่งที่ใช้งานไม่ใช่ตัวหนาสำหรับเรื่อย ๆ คำสั่งและในกรณีที่มีคำสั่งที่ใช้งานอยู่ไม่มีชื่อผมให้มันชื่อเดียวกับคำสั่งเรื่อย ๆ ที่สอดคล้องกันและพึ่งพาตัวหนาเพื่อแยกความแตกต่าง. ในกรณีที่ทั้งสองจะถูกตั้งชื่อเช่น7
ซึ่งเป็นตัวแปรที่ใช้งานของ1
, แต่ละคำสั่งได้รับชื่อของตัวเองและตัวหนาเป็นเพียงการเน้นไวยากรณ์)
231 7 23 โปรแกรมต้นฉบับแยกออกเป็นแปด
231 กด237บนสแต็ก
23 กด23ลงบนสแต็ก
(โดยนัย) ผนวกสำเนาของส่วนบนสุดของสแต็กเข้ากับโปรแกรม
2 สำเนาด้านบนสุดของสแต็ก (ปัจจุบัน23 )
3 ด้านบนสุดของสแต็กองค์ประกอบป๊อปสแต็กที่สอง
ณ จุดนี้ล่าม 7 คนเห็นว่าด้านบนสุดของสแต็กมีคำสั่ง ( 2
และ3
) ที่ไม่สามารถแทนได้ดังนั้นจึงหนีด้านบนสุดของสแต็กออกมา723
(ซึ่งก็คือ) เอาต์พุตคำสั่งแรกเลือกรูปแบบเอาต์พุต ในกรณีนี้มันคือรูปแบบ 7 "จัดรูปแบบผลลัพธ์เช่นเดียวกับโปรแกรม" ดังนั้นคำสั่งจะได้รับเอาต์พุตที่บรรจุเป็นไบต์ จากนั้นโปรแกรมจะดำเนินการต่อ:
231 7 23 23
(โดยนัย) ผนวกสำเนาของส่วนบนสุดของสแต็กเข้ากับโปรแกรม
2 สำเนาด้านบนสุดของสแต็ก (ปัจจุบัน237 )
3 ด้านบนสุดของสแต็กองค์ประกอบป๊อปสแต็คที่สองที่สอง
7 ผลักองค์ประกอบที่ว่างลงบนสแต็ก
ณ จุดนี้ไม่มีอะไรเลยนอกจากองค์ประกอบสแต็คที่ว่างเปล่าบนสแต็กดังนั้นโปรแกรมจึงออก เราส่งออก23
ก่อนหน้านี้ ถ้าเราหนี237
(และเราจะต้องเพราะมันมีคำสั่ง unrepresentable) 7231
ที่เราได้รับ ที่รับเอาท์พุทโดยตรงทำให้ผลลัพธ์สุดท้ายของโปรแกรม237231
(จัดรูปแบบในลักษณะเดียวกันกับโปรแกรมเช่นถูกบีบอัดเป็นไบต์) 4fa67f
ที่ (สามารถสังเกตได้ว่าสิ่ง1
นั้นไม่มีประโยชน์อย่างสิ้นเชิงในแง่ของผลกระทบต่อผลผลิตเหตุผลเดียวที่ทำให้โปรแกรมทั้งสองแตกต่างกัน)
การ237231
ดำเนินการเกือบจะเหมือนกันทุกประการ ความแตกต่างก็คือการ1
ทำงานที่ไร้ประโยชน์หลังจากการพิมพ์ครั้งแรก (และองค์ประกอบที่ว่างเปล่าจะถูกลบโดยปริยายในครั้งที่สองเมื่อถึงจุดสิ้นสุดของโปรแกรมปัจจุบัน) อีกครั้ง231
ผลลัพธ์ที่23
จบลงก็คือผลลัพธ์ที่นำหน้าด้วย a 7
และเราได้รับ231723
คือโปรแกรมดั้งเดิม
ผู้สังเกตการณ์อาจสังเกตว่าทั้งสองโปรแกรมแม้จะมีความยาวเท่ากันในฐานแปด "ดั้งเดิม" ของภาษานั้นมีความยาวต่างกันบนดิสก์ นั่นเป็นเพราะโปรแกรม 7 สามารถเสริมด้วยจำนวนโดยพลการของ 1 บิตและรูปแบบที่บรรจุจะทิ้งการเติมช่องว่างท้าย นี่คือวิธีการเข้ารหัสที่เกิดขึ้น:
2 3 1 7 2 3
010011001111010011(1...)
4 c f 4 padding
กล่าวอีกนัยหนึ่งสองไบต์4C
F4
ก็เพียงพอที่จะเป็นตัวแทนของโปรแกรมได้นั่นคือทั้งหมดที่ฉันใช้