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