ทีม Rolldown เพิ่งรวม (merged) ตัวแก้ไขที่ช่วยหยุดไม่ให้ Vite เกิดอาการค้างด้วยข้อผิดพลาด “Illegal instruction” บนอุปกรณ์ Android ARM64 ที่รันผ่าน Termux หลังจากที่เหล่านักพัฒนาต้องเฝ้าดู build ของตัวเองพังทลายลงก่อนที่โค้ดจะเริ่มทำงานมานานถึงสิบเดือน ในที่สุดปัญหานี้ก็หมดไป และ Rolldown เวอร์ชันถัดไปบน npm จะสามารถใช้งานได้ทันที (out-of-the-box)

ทำไมการค้างนี้ถึงสำคัญ

Termux ช่วยให้ผู้ใช้สามารถรันสภาพแวดล้อมแบบ Linux บนโทรศัพท์ Android ได้ และมีชุมชนที่เติบโตขึ้นเรื่อยๆ ที่ใช้งานมันเป็นเวิร์กสเตชันสำหรับการพัฒนาเพียงอย่างเดียว ในบังกลาเทศ ไนจีเรีย และอินโดนีเซีย โปรแกรมเมอร์จำนวนมากใช้โทรศัพท์แทนแล็ปท็อปในการเขียนและ bundle เว็บแอปพลิเคชัน Vite ซึ่งเป็นเครื่องมือ build ที่รวดเร็วและขับเคลื่อนเว็บไซต์สมัยใหม่มากมาย คือส่วนสำคัญของเวิร์กโฟลว์นั้น เมื่อ Vite พยายามจะเริ่มทำงาน มันจะเกิดข้อผิดพลาด “Illegal instruction” ทันที ทำให้กระบวนการหยุดลงก่อนที่ JavaScript จะถูก parse เสียด้วยซ้ำ ข้อผิดพลาดนี้ไม่มี stack trace หรือ log ใดๆ ให้ เพราะมันเกิดขึ้นขณะกำลังโหลด native library ทำให้เหล่านักพัฒนาต้องเผชิญกับทางตันโดยไม่มีแนวทางแก้ไขที่ชัดเจน

ความไม่เข้ากันทางเทคนิค

สาเหตุหลักอยู่ที่สมมติฐานระดับต่ำ (low-level assumption) ที่ฝังอยู่ใน native binding ของ Rolldown โดยโค้ดคาดหวังว่าโปรเซสเซอร์จะรองรับคำสั่ง ARMv8.1 ซึ่งเป็นชุดคำสั่งที่มีในชิปรุ่นใหม่ๆ แต่ไม่มีใน SoC ของ Android จำนวนมากที่ใช้งานกันอย่างแพร่หลาย เช่น Cortex-A53 เมื่ออุปกรณ์ที่ขาดคำสั่งเหล่านั้นพยายามโหลด library ตัว CPU จะส่ง exception แบบ illegal-instruction ออกมา

สิ่งที่ทำให้เรื่องนี้ซับซ้อนขึ้นคือ โค้ดที่เป็นปัญหาอยู่ใน dependency ที่ชื่อว่า mimalloc ซึ่งเป็น memory allocator ที่มี safety flag ออกแบบมาเพื่อบล็อกการใช้คำสั่งที่ไม่รองรับ แต่ flag ดังกล่าวจะทำงานเฉพาะในสภาพแวดล้อม “standard Linux” เท่านั้น แม้ Android จะใช้ Linux kernel แต่ก็ระบุตัวตนต่างออกไป ดังนั้นระบบป้องกันจึงไม่ทำงาน และทำให้การค้างนี้หลุดรอดไปได้

วิธีการสร้างตัวแก้ไข

การเปลี่ยนแปลงที่ถูกรวมเข้ามานี้จะขยายการตรวจสอบความปลอดภัยของ mimalloc ให้รู้จัก Android (และ FreeBSD) ในฐานะแพลตฟอร์มที่ต้องการการป้องกันแบบเดียวกัน การแก้ไขด้วยการ patch library แทนที่จะบังคับให้นักพัฒนาต้อง rebuild หรือเปลี่ยน package ช่วยให้การทำงานกลับมาเข้ากันได้โดยไม่ต้องมีขั้นตอนเพิ่มเติมสำหรับผู้ใช้งานทั่วไป

สิ่งที่นักพัฒนาจะได้รับ

  • ไม่จำเป็นต้องใช้แพ็กเกจ Termux แบบปรับแต่งเอง การติดตั้ง Rolldown ผ่าน npm มาตรฐานจะดึง binary ที่รองรับการตรวจสอบความปลอดภัยแบบใหม่นี้มาให้ทันที
  • สามารถทดสอบได้ทันที build เวอร์ชัน preview ที่แนบมากับ pull request ที่เปิดอยู่ ช่วยให้ใครก็ตามที่มีอุปกรณ์ Android แบบ ARM64 สามารถตรวจสอบการแก้ไขได้ตั้งแต่วันนี้ ในขณะที่ Rolldown เวอร์ชันทางการถัดไปกำลังจะปล่อยบน npm

ข้อควรพิจารณาที่เหลืออยู่

การแก้ไขนี้ขึ้นอยู่กับการที่ผู้ดูแล Rolldown จะเผยแพร่แพ็กเกจที่อัปเดตแล้ว จนกว่าจะถึงตอนนั้น ผู้ใช้ต้องพึ่งพา build เวอร์ชัน preview ไปก่อน

สิ่งที่ควรติดตามต่อไป

  • ระยะเวลาการปล่อย npm คอยติดตาม changelog ของ Rolldown ไว้ เมื่อเวอร์ชันใหม่ออกสู่ registry ทันที การใช้คำสั่ง npm install rolldown ง่ายๆ ก็จะนำตัวแก้ไขนี้เข้าสู่ระบบ production ของคุณ

การ patch ที่ถูกรวมเข้ามานี้เปลี่ยนจากสภาวะชะงักงันที่ยาวนานหลายเดือนให้กลายเป็นการอัปเดตตามปกติ แสดงให้เห็นว่าข้อมูลการใช้งานจริงและรายงานที่สม่ำเสมอจากชุมชนสามารถเปลี่ยนบั๊กที่ “ไม่ได้วางแผนไว้” ให้กลายเป็นปัญหาที่ได้รับการแก้ไขได้อย่างไร สำหรับใครก็ตามที่สร้างเว็บแอปบนโทรศัพท์ การปล่อย Rolldown เวอร์ชันถัดไปจะช่วยให้ Vite เริ่มทำงานได้เสียทีโดยไม่ทำให้โปรเซสเซอร์พัง