LLM แสดงผลลัพธ์ที่หลากหลายกับการเขียนโปรแกรม Assembly: Claude สร้าง Mandelbrot Fractal ได้หลังจากพยายามหลายครั้ง

ทีมชุมชน BigGo
LLM แสดงผลลัพธ์ที่หลากหลายกับการเขียนโปรแกรม Assembly: Claude สร้าง Mandelbrot Fractal ได้หลังจากพยายามหลายครั้ง

การทดลองล่าสุดที่ทดสอบความสามารถของ Claude ในการสร้างโค้ด x86 assembly ได้จุดประกายการอพยพในชุมชนเกี่ยวกับสถานะปัจจุบันของโมเดลภาษาขนาดใหญ่เมื่อทำงานกับภาษาโปรแกรมมิ่งระดับต่ำ การทดสอบนี้เกี่ยวข้องกับการสร้างตัวสร้าง Mandelbrot fractal แบบ ASCII art ซึ่งต้องใช้การทำซ้ำหลายครั้งและการแก้ไขข้อผิดพลาดแบบอัตโนมัติเพื่อให้ได้ผลลัพธ์ที่ใช้งานได้

ภาพหน้าจอนี้เน้นย้ำถึงความท้าทายทางเทคนิคในการสร้างโค้ด x86 assembly สำหรับเครื่องมือสร้าง Mandelbrot fractal โดยใช้โมเดลภาษาขนาดใหญ่อย่าง Claude
ภาพหน้าจอนี้เน้นย้ำถึงความท้าทายทางเทคนิคในการสร้างโค้ด x86 assembly สำหรับเครื่องมือสร้าง Mandelbrot fractal โดยใช้โมเดลภาษาขนาดใหญ่อย่าง Claude

ความท้าทายในการสร้างโค้ด Assembly

ชุมชนได้ระบุปัญหาที่สม่ำเสมอหลายประการเมื่อใช้ LLM สำหรับการเขียนโปรแกรม assembly นักพัฒนารายงานว่าโมเดลเหล่านี้มักสร้างโค้ดที่ไม่สามารถ assemble ได้ มักจะหลอนเห็นรายละเอียดของ hardware register และสร้างการใช้งานที่ไม่มีประสิทธิภาพ การจัดการ register ระหว่าง subroutine ดูเหมือนจะเป็นจุดอ่อนเป็นพิเศษ เนื่องจากโมเดลเหล่านี้มีปัญหาในการรักษาข้อตกลงที่สม่ำเสมอซึ่งโปรแกรมเมอร์ assembly มนุษย์พัฒนาขึ้นมาตามธรรมชาติ

ประสบการณ์แตกต่างกันอย่างมากขึ้นอยู่กับงานเฉพาะ งานแปลระหว่างภาษา assembly เช่น การพอร์ตโค้ดจาก x86 NASM syntax ไปยัง RISC-V GAS syntax แสดงผลลัพธ์ที่ดีกว่ามาก เนื่องจากเกี่ยวข้องกับการแปลงแบบตรงไปตรงมาเป็นหลักมากกว่าการสร้างโค้ดต้นฉบับ

ปัญหาทั่วไปของ LLM ในการสร้างโค้ด Assembly:

  • โค้ดที่ไม่สามารถ assemble ได้
  • รายละเอียดของ hardware register ที่เป็นภาพหลอน
  • การสร้างโค้ดที่ไม่มีประสิทธิภาพ
  • การจัดการ register ที่ไม่ดีระหว่าง subroutine ต่างๆ
  • calling convention ที่ไม่สอดคล้องกัน

การปรับปรุงในคำสั่งเฉพาะทาง

เวอร์ชันล่าสุดของโมเดล AI แสดงการปรับปรุงที่น่าสังเกตในการจัดการการดำเนินการ SIMD (Single Instruction, Multiple Data) Claude 4 Sonnet แสดงประสิทธิภาพที่ดีกว่าอย่างมากกับการดำเนินการแบบ vectorized เมื่อเปรียบเทียบกับเวอร์ชันก่อนหน้า ซึ่งมักสร้าง scalar loop ในขณะที่อ้างว่าได้ทำ vectorize โค้ดแล้ว โมเดลก่อนหน้านี้ยังตัดสินใจแบบไม่มีเหตุผลเกี่ยวกับการใช้ instruction set เช่น การเพิ่ม conditional ที่ไม่จำเป็นสำหรับ SSE เมื่อระบุการสนับสนุน AVX2 อย่างชัดเจน

ในไม่กี่ครั้งที่ฉันได้ลองใช้ ฉันสังเกตเห็นว่าพวกมันค่อนข้างแย่ในการติดตาม register เมื่อพวกมันเคลื่อนที่ระหว่าง subroutine

พื้นที่ที่ LLM ประสบความสำเร็จในการทำงานกับ Assembly:

  • การแปลระหว่างภาษา assembly ต่างๆ (เช่น x86 NASM ไปเป็น RISC-V GAS)
  • SIMD intrinsics (มีการปรับปรุงอย่างมีนัยสำคัญใน Claude 4 Sonnet)
  • อัลกอริทึมง่ายๆ ที่มีเอกสารครบถ้วนและมีตัวอย่างที่มีอยู่แล้ว
  • งานการพอร์ตและแปลงโค้ด

ข้อมูลการฝึกอบรมและตัวบ่งชี้คุณภาพโค้ด

คุณภาพของโค้ด assembly ที่สร้างขึ้นเผยให้เห็นข้อมูลเชิงลึกที่น่าสนใจเกี่ยวกับข้อมูลการฝึกอบรม นักพัฒนาที่มีประสบการณ์สามารถสังเกตเห็นสัญญาณที่บ่งบอกถึงการขาดประสบการณ์ในโค้ดที่สร้างขึ้น เช่น การใช้ mov ecx, 0 แทนที่จะเป็น xor ecx, ecx ที่เป็นแบบแผนมากกว่าสำหรับการล้าง register รูปแบบเหล่านี้บ่งบอกถึงการได้รับข้อมูลจำกัดจากผลงาน demoscene และตัวอย่างโค้ด assembly คุณภาพสูงอื่นๆ ในระหว่างการฝึกอบรม

การประยุกต์ใช้งานจริงและข้อจำกัด

แม้ว่าตัวสร้าง Mandelbrot จะทำงานได้ในที่สุด ชุมชนสังเกตว่า ASCII art fractal เป็นตัวอย่างที่ค่อนข้างง่ายที่มีโค้ดที่มีอยู่แล้วมากมายให้อ้างอิง งาน assembly ที่ซับซ้อนมากขึ้น โดยเฉพาะที่เกี่ยวข้องกับการเริ่มต้นฮาร์ดแวร์ device driver หรือการเปลี่ยนจาก real-mode ไป long-mode ยังคงท้าทายโมเดล AI ปัจจุบันอย่างมาก

การอภิปรายเน้นย้ำว่า LLM ในปัจจุบันทำงานได้ดีกว่าในฐานะเครื่องมือแปลสำหรับโค้ด assembly มากกว่าตัวสร้างโค้ดต้นฉบับ โดยเฉพาะสำหรับการใช้งานเฉพาะทางหรือเฉพาะฮาร์ดแวร์ที่ความแม่นยำและประสิทธิภาพเป็นสิ่งสำคัญ

อ้างอิง: Mandelbrot in x86 assembly by Claude