From Opcodes to Algorithms - Day 10 and 11

เมื่อวานลองสร้างเครื่องมือมาเล่นกับ assembly แบบเห็นภาพง่ายๆ ดูฮะ

ก่อนหน้านี้รู้สึกว่าเวลาเรียน algorithms หรือทำงาน reverse engineering รู้สึกตัวเองไม่เก่งเลย เพราะขาด mechanical sympathy ว่าคอมมันทำงานยังไง

เราเชื่อว่าโปรแกรมเมอร์ที่เก่งต้องรู้ both the maths and the machines, the lisp and the assembly เข้าใจการสร้าง algorithms ทั้งในเชิงคณิตศาสตร์ เชิงความคิด เชิงธุรกิจ ไปจนถึงเข้าใจว่าคอมพิวเตอร์จะทำตามคำสั่งเรายังไง

สิบกว่าวันที่ผ่านมา เราลองสร้าง virtual machine ของตัวเองบน Rust เพื่อให้เข้าใจอะไรมากขึ้น จนเมื่อวันศุกร์ก็ได้ bytecode compiler ที่คอมไพล์โปรแกรมเป็น binary ที่รันได้ แต่รู้สึกว่าอยากให้มันเอาไปเล่นและทำความเข้าใจได้กับคนอื่นด้วย

เมื่อวานเลยใช้ reactflow, codemirror กับ nanostores มาสร้าง node-based editor ให้ machine แต่ละเครื่องมันรัน assembly และส่งข้อความคุยกันได้ โดยใช้ actor model แล้วก็ใช้ webassembly กับ rsw มา compile virtual machine กับ compiler ให้รันบนเว็บได้

Prototype แรกที่ทำเมื่อคืน ตอนนี้เราสามารถสร้าง machine หลายอันมาต่อกันได้ เรา print ข้อมูลออกมาได้ แสดงข้อมูลบน stack ได้ และส่งข้อมูลหากันได้แล้วด้วย

ส่วนตัวเรารู้สึกว่ามันเล่นอะไรได้เยอะมาก เราค่อยๆ step through ได้ว่าโปรแกรมเราทำอะไรอยู่ แล้วเอาไปสร้าง block type แบบอื่นๆ ให้ visualize stack กับเอาไปทำอะไรต่อได้ เช่นวาด pixel art, เล่นดนตรี, 3D graphic, ต่อกับ hardware ข้างนอกได้

อีกอย่างคือเรา ออกแบบตัว virtual machine ให้มันใช้ memory buffer แค่อันเดียว มันสามารถ inspect memory ได้เหมือนจริงมากๆ ว่า code segment แต่พอเราใช้ actor model ที่มี mailbox ส่งหากัน และทำ event queue ไว้เก็บ side effects มันก็ทำ time-travelling ได้ว่าเกิด side effect อะไรขึ้นในระบบ มีใครส่งข้อมูลหาอะไร

ตอนนี้กำลังจะ deploy ฮะ ตอนนี้เจอบัคเรื่องที่ receive มันทำให้เกิด infinite loop / crash แต่นอกจากนั้นน่าจะเสถียรพอสมควร

ใครอยากเล่น ดูลิงค์ GitHub และ Demo ในคอมเม้นต์ได้เลยฮะ กำลังจะเปิดให้ contribute ใน hacktoberfest เดือนนี้ได้ด้วย

Day 10 and 11 of From Opcodes to Algorithms in Rust October 9 and 10. Post on Facebook. Tweet.