Day 6 of "From Opcodes to Algorithms" in Rust
วันนี้ลองสร้าง call stack ให้เรียกฟังก์ชั่นได้ กับ event handlers ให้รองรับ IO และการ unit test IO ได้ แล้วก็เขียนเทสต์มาทดสอบ loops / conditional jumps ว่าใช้งานได้ ตอนนี้เริ่มเป็นรูปเป็นร่างมาก
ปัญหาที่เจอหลักๆ คือตอนนี้ยังไม่ได้เขียน assembler ไว้ใช้ แล้วพอเราจะ jump หรือ call มันต้องใส่ address ซึ่งแต่ละ instruction ก็ใช้ไม่เท่ากันอีก ทำให้ตอนนี้ต้องมา print bytecode มาเป็นเลข แล้วมานั่งนับช่องเอา พอไม่มี labels แล้วปวดหัวมาก ยังไงก็ต้องรีบทำ assembler ก่อนไปต่อ จะได้จัดการพวก strings, symbols, labels, offsets ด้วย
อีกอย่างคือตอนที่เปลี่ยน print instruction ให้ใช้ event handler ได้ลองเล่น library ชื่อ mockall ที่เอาไว้ทำ mocks สะดวกมาก เพราะตอนแรกลองทำเป็น mutable callback แล้วเจอปัญหา ownership เยอะ ตอนนี้เลยทำให้มัน immutable ไปก่อน แล้วใส่ mocks เข้าไปเทสต์เอา
นอกจากนี้ก็ refactor ไปเยอะ เช่นย้ายพวก address ไปที่ไฟล์เดียว ให้มันคำนวณในโค้ดแทนที่จะ hard-code ด้วยมือ ตอนนี้ด้วยความที่ยังไม่มี heap ก็เลยแก้ให้ stack มันเริ่มจาก low address แทนที่จะเป็นจาก high address โชคดีที่ทำ unit tests ไว้แน่นมาก เวลาแก้เลยรันเทสต์รัวๆ
วันนี้สนุกมาก โค้ดไปสามชั่วโมงกว่า ตอนเที่ยงได้อ่าน Crafting Interpreters ต่อด้วย เดี๋ยวพรุ่งนี้อยากอ่านหนังสือต่อ เพราะจะได้ทำ assembly parser ของตัวเองไว้ใช้ได้
October 5. Post on Facebook.