การวิเคราะห์โค้ด xmas.c
- โค้ด C ชื่อ
xmas.c ที่สร้างขึ้นในปี 1988 ได้รับรางวัลชนะเลิศในการประกวด International Obfuscated C Code Contest
- โค้ดนี้มีขนาดเล็กกว่าผลลัพธ์ที่มันพิมพ์ออกมา และได้เสนอแนวทางใหม่ให้กับมาตรฐานการบีบอัดข้อความ
- เมื่อคอมไพล์และรันโค้ด มันจะทำงานได้โดยไม่ต้องมีพารามิเตอร์ และที่น่าสนใจคือมันดูราวกับว่ามีการกดแป้นพิมพ์ดีดแบบสุ่มมั่ว ๆ
ผลลัพธ์ของโค้ด
- เมื่อรันโค้ด จะมีการพิมพ์เนื้อเพลง "The Twelve Days of Christmas" ออกมา
- เนื้อหาที่พิมพ์ออกมาคือรายชื่อของขวัญตั้งแต่วันแรกไปจนถึงวันที่สิบสองของคริสต์มาส
การวิเคราะห์
- เพื่อทำความเข้าใจโค้ด จำเป็นต้องเขียนใหม่ให้อยู่ในรูปแบบที่อ่านง่ายขึ้น
- ในกระบวนการเขียนใหม่ จะเห็นว่าโค้ดนี้ถอดรหัส substitution cipher โดยใช้สตริงบางชุด
- ตัวแปร
t มีบทบาทสำคัญในการควบคุมทิศทางของการเรียกซ้ำแบบ recursive
- โค้ดนี้ถอดรหัส substitution cipher ผ่าน recursion และพิมพ์เนื้อเพลงคริสต์มาสออกมา
การทำให้เรียบง่าย
- เมื่อเข้าใจโปรแกรมแล้ว ก็สามารถทำให้โค้ดเรียบง่ายลงได้ด้วยการใช้ลูปบางส่วนและฟังก์ชันจากไลบรารีสตริงของ C
- ในท้ายที่สุด เมื่อย่อโค้ดให้เรียบง่ายที่สุดแล้ว มันอาจเหลือเพียงโปรแกรมที่พิมพ์เนื้อเพลงออกมาเท่านั้น
ความเห็นของ GN⁺
- ความสร้างสรรค์ขั้นสุด: โค้ด
xmas.c เป็นตัวอย่างอันยอดเยี่ยมของการเขียนโค้ดที่ทำให้อ่านยากด้วยการใช้ substitution cipher และ recursion ซึ่งแสดงให้เห็นว่าความคิดสร้างสรรค์สามารถแสดงออกในงานเขียนโปรแกรมได้อย่างไร
- คุณค่าเชิงการศึกษา: กระบวนการวิเคราะห์และทำความเข้าใจโค้ดนี้อาจเป็นแบบฝึกหัดที่ดีสำหรับวิศวกรซอฟต์แวร์ระดับเริ่มต้นในการพัฒนาทักษะการเขียนโปรแกรม
- ความสนุกและความน่าสนใจ: โค้ดนี้เปิดโอกาสให้ค้นพบความสนุกของการเขียนโปรแกรม และได้สัมผัสความเพลิดเพลินจากการแก้ปัญหาที่ซับซ้อน
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
มีตัวอย่างคล้ายกันในโลกของ TeX คือ
xii.tex:pdftexก็อาจได้ผลลัพธ์ที่ไม่เป็นไปตามคาด ดูได้ที่ shreevatsa.netโค้ดนี้ชวนให้นึกถึงความซับซ้อนแบบโคลโมโกรอฟ:
ตอนที่เผยแพร่ครั้งแรกเคยได้รับโค้ดนี้มา แต่ชื่อไฟล์ต่างออกไป:
IOCCC (International Obfuscated C Code Contest) ยังมีความเคลื่อนไหวอยู่ในปี 2023:
ถ้าปิดคำเตือน ก็ยังทำงานได้แม้บน code repository รุ่นล่าสุด (trunk):
มีงานลักษณะคล้ายกันบน Rosetta Code ด้วย:
มีความทรงจำที่ดีว่าศาสตราจารย์เคยแสดงโค้ดชิ้นนี้ตอนต้นคาบในภาคการศึกษาสุดท้ายของมหาวิทยาลัย:
ตอนเรียนมหาวิทยาลัย มีเอกสารการเรียนภาษา C แบบพิมพ์ที่มีโค้ดนี้อยู่ และจำได้ว่าเคยลองพิมพ์เองครั้งหนึ่ง:
โค้ดนี้ใช้ภาษา C เวอร์ชันที่เก่ามาก:
หนึ่งในจุดที่น่าสนใจคือความเชื่อมโยงระหว่างการที่ Larry Wall ชนะ IOCCC ถึงสองครั้ง กับการที่เขาเป็นผู้ออกแบบ Perl: