จาวาคอมไพล์เลอร์อิมพรีเมนต์ Closure อย่างไร?
วันนี้เกิดความสงสัยว่าภาษาที่มี Closureอย่าง JS เขาใช้เทคนิคอะไรทำเพื่อให้ local variable ยังอ้างถึงได้ในขณะที่ stack frame ถูกทำลายไปแล้ว แต่ว่าผมอ่าน bytecode JS ไม่ออก ดังนั้นจึงศึกษาจาก Java แทนล่ะกัน
ใน java สิ่งที่จะทำงานคล้าย Closure ก็คือ Anonymous Inner Class และ lambda เราจะมาดูกันว่า compiler ของ Java มีเทคนิคในการทำ closure อย่างไร
กรณี Anonymous Inner Class
เมื่อ compile และใช้ javap -v Main จะได้ bytecode ออกมาดังนี้
จะเห็นว่า javac ทำการ capture state ของ outer scope ( เมธอด Main() ) ด้วยการ copy local variable!!! โดยส่งผ่านไปกับทาง constructor ของ Annonymous inner class ที่คอมไพล์เลอร์เป็นคนสร้างขึ้นมาให้ (ในที่นี้คือ Main$1.”<init>” )
รูปด้านล่างนี้เป็น bytecode ของ Anonymous inner class Main$1 ที่ได้จาก javap
กรณี Lambda
ไว้ part2 ครับ