3 คะแนน โดย GN⁺ 2023-12-24 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

การวิเคราะห์โค้ด 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 ความคิดเห็น

 
GN⁺ 2023-12-24
ความคิดเห็นบน Hacker News
  • มีตัวอย่างคล้ายกันในโลกของ TeX คือ xii.tex:

    • ถ้าใส่โค้ดที่ดูซับซ้อนลงในเอกสาร TeX แล้วรัน pdftex ก็อาจได้ผลลัพธ์ที่ไม่เป็นไปตามคาด ดูได้ที่ shreevatsa.net
  • โค้ดนี้ชวนให้นึกถึงความซับซ้อนแบบโคลโมโกรอฟ:

    • เมื่อเห็นโค้ดที่เข้าใจยากแต่สร้างผลลัพธ์ที่ต้องการได้ ก็ทำให้อยากรู้ว่าจะมีโปรแกรมที่สั้นกว่านี้แต่ให้ผลลัพธ์เดียวกันหรือไม่ และจะหามันได้อย่างไร
  • ตอนที่เผยแพร่ครั้งแรกเคยได้รับโค้ดนี้มา แต่ชื่อไฟล์ต่างออกไป:

    • มันถูกเก็บไว้ในชื่อ "carol.c" และเมื่อลองคอมไพล์และรันบนระบบสมัยใหม่ ก็มีข้อความเตือนจากคอมไพเลอร์แสดงออกมา
  • IOCCC (International Obfuscated C Code Contest) ยังมีความเคลื่อนไหวอยู่ในปี 2023:

    • คำอธิบายเกี่ยวกับ IOCCC ทำได้ยอดเยี่ยม และดูได้ที่ www.ioccc.org
  • ถ้าปิดคำเตือน ก็ยังทำงานได้แม้บน code repository รุ่นล่าสุด (trunk):

    • สามารถตรวจสอบการทำงานของโค้ดนี้ได้ที่ compiler-explorer.com
  • มีงานลักษณะคล้ายกันบน Rosetta Code ด้วย:

    • มีตัวอย่างโปรแกรมที่สร้างเพลง "Old Lady Swallowed a Fly" แบบวนซ้ำและยาวขึ้นเรื่อย ๆ ดูได้ที่ rosettacode.org
  • มีความทรงจำที่ดีว่าศาสตราจารย์เคยแสดงโค้ดชิ้นนี้ตอนต้นคาบในภาคการศึกษาสุดท้ายของมหาวิทยาลัย:

    • ย้อนนึกถึงประสบการณ์ที่ได้เห็นโค้ดนี้ครั้งแรกในการบรรยายของอาจารย์เมื่อปี 2022
  • ตอนเรียนมหาวิทยาลัย มีเอกสารการเรียนภาษา C แบบพิมพ์ที่มีโค้ดนี้อยู่ และจำได้ว่าเคยลองพิมพ์เองครั้งหนึ่ง:

    • ตอนเรียนภาษา C เคยลองพิมพ์โค้ดนี้ด้วยตัวเองจริง ๆ จึงเป็นประสบการณ์ที่ติดอยู่ในความทรงจำ
  • โค้ดนี้ใช้ภาษา C เวอร์ชันที่เก่ามาก:

    • มีความเห็นว่าซิกเนเจอร์ของฟังก์ชัน main ใช้สไตล์ K&R แบบเก่า จึงน่าจะคอมไพล์ไม่ได้แล้วในปัจจุบัน
  • หนึ่งในจุดที่น่าสนใจคือความเชื่อมโยงระหว่างการที่ Larry Wall ชนะ IOCCC ถึงสองครั้ง กับการที่เขาเป็นผู้ออกแบบ Perl:

    • ประวัติการคว้ารางวัล IOCCC ของผู้ออกแบบ Perl ให้ความรู้สึกเหมือนช่วยอธิบายลักษณะเฉพาะของภาษา Perl ได้