จาวาคอมไพล์เลอร์อิมพรีเมนต์ Closure อย่างไร?

Pramoth Suwanpech
1 min readAug 1, 2019

--

วันนี้เกิดความสงสัยว่าภาษาที่มี 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 ครับ

--

--

Pramoth Suwanpech
Pramoth Suwanpech

Written by Pramoth Suwanpech

Java developer. Believe in fundamental

No responses yet