เจาะประเด็น
Linux / Tools
ไอเดียสุดบรรเจิด: เปลี่ยนโปรแกรมของคุณให้เป็นไฟล์ SQLite ที่รันได้จริง
ไม่ใช่แค่เทคนิคฮาร์ดคอร์สำหรับคนบ้า Linux แต่คือการหักมุมนิยามของ "ไฟล์" ที่ทั้งระบบปฏิบัติการและนักพัฒนาควรต้องจับตาดู
ทีมข่าว เอไอไทย.com
⏱ อ่าน 3 นาที
ถ้าไฟล์โปรแกรมเป็นฐานข้อมูลได้ แล้วเราจะแยก "ข้อมูล" กับ "โค้ด" ออกจากกันไปทำไม? อนาคตของการแจกจ่ายซอฟต์แวร์อาจไม่ได้เป็นไฟล์เดียว แต่เป็น "ฐานข้อมูลเดียว"
เรื่องนี้มันโคตรจะเท่เลยครับ เพื่อนๆ สมมติว่าคุณมีไฟล์โปรแกรมที่รันได้ (executable) ปกติทั่วไป เราก็จะเห็นมันเป็นไฟล์ไบนารีที่อ่านแล้วปวดหัวใช่ไหม? แต่ Farid Zakaria เขาทำให้มันกลายเป็นอะไรที่มากกว่านั้น — เขาสร้างไฟล์ SQLite ที่รันเป็นโปรแกรมได้ด้วยตัวมันเอง
ฟังดูเหมือนมุก แต่ไม่ใช่มุกครับ มันคือเทคนิค Linux ล้วนๆ ที่เล่นกับโครงสร้างไฟล์ทั้งสองแบบอย่างชาญฉลาดมาก ไอเดียคือการตั้งค่า "application ID" ในหัวไฟล์ของ SQLite (ซึ่งอยู่ที่ออฟเซ็ต 68 ของไฟล์) ให้เป็นค่า SELF ซึ่งย่อมาจาก Structured Executable & Linkable Format เพื่อบอกใบ้ให้ระบบรู้ว่านี่ไม่ใช่แค่ฐานข้อมูลเฉยๆ แต่มันคือโปรแกรมที่พร้อมจะทำงาน
ส่วนประกอบต่างๆ ของรูปแบบ ELF (Executable and Linkable Format) ที่ Linux ใช้ถูกจัดวางลงในตารางของ SQLite หลายๆ ตารางตามสคีมาที่เขาออกแบบไว้ จากนั้นก็มีตัว "self-exec" ซึ่งเป็นโค้ด C ขนาดเล็ก ทำหน้าที่เป็นล่าม (interpreter) คอยดึงชิ้นส่วนที่จำเป็นออกมาจากตารางเหล่านั้นแล้วสั่งให้มันทำงานจริงๆ
เทคนิคนี้ไม่ได้จบแค่การฝังตัวล่ามเข้าไปในไฟล์ แต่มันยังใช้กลไกของ Linux ที่ชื่อว่า binfmt_misc เพื่อสอนให้เคอร์เนลรู้จักรูปแบบไฟล์นี้ โดยเวลาที่ระบบพบไฟล์ที่ตรงกับแพตเทิร์นไบนารีนี้ มันก็จะรู้ทันทีว่าต้องใช้ตัวไหนรันมันให้
Farid ใช้ NixOS ในตัวอย่างของเขา แต่ถ้าใครไม่ได้ใช้ NixOS ก็สามารถลงทะเบียนด้วยคำสั่งง่ายๆ แบบนี้ได้เลยครับ:
ลงทะเบียนกับเคอร์เนล
ใช้คำสั่ง printf เขียนลงในไฟล์ /proc/sys/fs/binfmt_misc/register เพื่อบอกให้เคอร์เนลรู้จัก "รูปแบบ" นี้
สิ่งที่ผมชอบที่สุดในไอเดียนี้คือมันท้าทายความเชื่อเดิมๆ ที่ว่า "ไฟล์โปรแกรม" กับ "ไฟล์ข้อมูล" ต้องเป็นคนละอย่างกัน มันเหมือนการประกาศว่าทำไมจะต้องแยกกันล่ะ? ถ้าเราสามารถใช้ SQLite เป็นทั้งที่เก็บข้อมูลและตัวรันโปรแกรมได้ในไฟล์เดียว มันจะลดความซับซ้อนในการแจกจ่ายซอฟต์แวร์ลงไปได้มหาศาล
ลองคิดภาพตามนะครับ การแจกจ่ายแอปพลิเคชันที่ต้องการข้อมูลเริ่มต้นจำนวนมาก สมมติว่าเป็นเกมที่มีดาต้าเบสของไอเทมหลายพันชิ้น หรือเป็นโปรแกรมวิเคราะห์ข้อมูลที่ต้องมาพร้อมกับชุดข้อมูลตัวอย่าง ปกติเราก็ต้องแจกเป็นสองไฟล์: ตัวโปรแกรมกับไฟล์ฐานข้อมูล แต่ด้วยวิธีนี้คุณได้ทั้งคู่ในไฟล์เดียว และยังรันได้โดยตรงอีกต่างหาก
แน่นอนว่ามันไม่ใช่เทคนิคที่คนทั่วไปจะเอาไปใช้ทำอะไรในชีวิตประจำวันได้ทันที แต่มันคือตัวอย่างของความคิดสร้างสรรค์ที่ทำให้เห็นว่า "ไฟล์" ที่เราคุ้นชินกันมานาน มันไม่ได้ถูกจำกัดด้วยกฎเกณฑ์เดิมๆ เสมอไป และบางครั้งการแหกกฎก็ให้ผลลัพธ์ที่เจ๋งกว่าที่คิดเยอะ
นี่คือหนึ่งในไอเดียที่ทำให้ผมรู้สึกว่าวงการซอฟต์แวร์ยังมีอะไรให้ค้นหาอีกเยอะ มันไม่ใช่แค่เทคนิคเล่นสนุกระดับฮาร์ดคอร์ แต่คือการตั้งคำถามกับข้อสมมติพื้นฐานที่สุดของระบบปฏิบัติการ — ว่า "ไฟล์ที่รันได้" ต้องเป็นแบบเดิมเสมอไปหรือไม่? คำตอบของ Farid คือ "ไม่จำเป็น" และนั่นแหละคือความสวยงามของวิศวกรรมซอฟต์แวร์
ที่มา: Simon Willison's Weblog — อ่านต้นฉบับ
ความคิดเห็น 6
กำลังโหลดความคิดเห็น...