เมทาโปรแกรมมิงและแมโคร
เมทาโปรแกรมมิงพิจารณาโปรแกรมเป็นข้อมูลที่โปรแกรมอื่นสามารถสร้าง ตรวจสอบ หรือแปลงได้ โดยมีแมโครที่ให้การสร้างนามธรรมทางวากยสัมพันธ์ที่ควบคุมได้ในระหว่างการคอมไพล์
Definition
เมทาโปรแกรมมิงคือการเขียนโปรแกรมที่สร้าง วิเคราะห์ หรือแปลงโปรแกรมอื่น (หรือตัวมันเอง) ส่วนแมโครคือสิ่งอำนวยความสะดวกในการเมทาโปรแกรมมิงที่เขียนซ้ำไวยากรณ์ต้นฉบับให้เป็นโค้ดที่ขยายออกก่อนหรือระหว่างการคอมไพล์
Scope
หัวข้อนี้ครอบคลุมเทคนิคที่โปรแกรมจัดการโปรแกรม: แมโครเชิงคำศัพท์และวากยสัมพันธ์, การขยายแมโครแบบถูกสุขลักษณะ, การสร้างโค้ดในระหว่างการคอมไพล์, การเขียนโปรแกรมหลายขั้นตอน, การสะท้อน (reflection) และระบบเทมเพลต โดยจะกล่าวถึงกลไกเหล่านี้ขยายไวยากรณ์และนามธรรมของภาษาได้อย่างไร ในขณะที่ยังคงรักษาความถูกต้อง โดยเฉพาะอย่างยิ่งในส่วนที่เกี่ยวกับการจับตัวแปรและการผูกมัด
Core questions
- การสร้างนามธรรมทางวากยสัมพันธ์สามารถขยายภาษาได้อย่างไรโดยไม่มีการจับชื่อที่ไม่ปลอดภัย?
- อะไรคือความแตกต่างระหว่างเมทาโปรแกรมมิงในระหว่างการคอมไพล์กับการสะท้อนในระหว่างการรันไทม์?
- การเขียนโปรแกรมหลายขั้นตอนแยกการสร้างโปรแกรมออกจากการดำเนินการได้อย่างไร?
- เมื่อใดที่เมทาโปรแกรมมิงช่วยปรับปรุงนามธรรมเทียบกับการทำลายความสามารถในการอ่านและการใช้เครื่องมือ?
Key theories
- การขยายแมโครแบบถูกสุขลักษณะ
- Kohlbecker และเพื่อนร่วมงานได้นำเสนอแมโครแบบถูกสุขลักษณะ ซึ่งเปลี่ยนชื่อตัวแปรที่ถูกผูกมัดโดยอัตโนมัติในระหว่างการขยาย เพื่อให้โค้ดที่สร้างโดยแมโครไม่สามารถจับหรือถูกจับโดยชื่อในตำแหน่งที่ใช้งานโดยไม่ตั้งใจ
- การเขียนโปรแกรมหลายขั้นตอน
- Taha และ Sheard ได้กำหนดรูปแบบการคำนวณแบบมีขั้นตอนด้วยคำอธิบายประกอบที่ชัดเจน โดยให้คำอธิบายแบบมีชนิดข้อมูลของการสร้างและการรันโค้ดในขั้นตอนการประเมินผลที่แตกต่างกัน
- เมทาโปรแกรมมิงแบบเทมเพลต
- Sheard และ Peyton Jones ได้เพิ่มเมทาโปรแกรมมิงแบบคอมไพล์ไทม์ที่มีชนิดข้อมูลให้กับ Haskell ทำให้โปรแกรมสามารถสร้างและแทรกไวยากรณ์นามธรรมในระหว่างการคอมไพล์ได้
Clinical relevance
แมโครและเมทาโปรแกรมมิงช่วยให้นักพัฒนาไลบรารีสามารถสร้างนามธรรมเฉพาะโดเมน กำจัดโค้ดซ้ำซ้อน และทำการปรับแต่งเฉพาะทางในระหว่างการคอมไพล์เพื่อประสิทธิภาพ สุขอนามัยและระเบียบวินัยในการจัดขั้นตอนเป็นสิ่งที่ทำให้สิ่งอำนวยความสะดวกอันทรงพลังเหล่านี้ปลอดภัยเพียงพอสำหรับการใช้งานในชีวิตประจำวัน
History
แมโครมีมาตั้งแต่ Lisp และแอสเซมบลีในยุคแรกๆ แต่แมโคร Lisp ที่ไม่ถูกสุขลักษณะมักเกิดการจับตัวแปรโดยไม่ตั้งใจ การขยายแบบถูกสุขลักษณะของ Kohlbecker ในปี 1986 ได้แก้ไขปัญหานี้ ซึ่งมีอิทธิพลต่อ syntax-rules ของ Scheme งานวิจัยต่อมาได้กำหนดรูปแบบการเขียนโปรแกรมหลายขั้นตอน (MetaML) และนำเมทาโปรแกรมมิงแบบคอมไพล์ไทม์ที่มีชนิดข้อมูลมาใช้ในภาษาต่างๆ เช่น Haskell, Scala และ Rust
Debates
- พลังเทียบกับความเข้าใจง่ายของแมโคร
- นักออกแบบภาษาชั่งน้ำหนักพลังในการแสดงออกของการสร้างนามธรรมทางวากยสัมพันธ์ที่ไม่จำกัด กับความยากลำบากที่เกิดขึ้นสำหรับผู้อ่าน ดีบักเกอร์ และเครื่องมือ ซึ่งเป็นแรงจูงใจให้เกิดระบบแมโครแบบถูกสุขลักษณะและมีระเบียบวินัย
Key figures
- Eugene Kohlbecker
- Matthias Felleisen
- Walid Taha
- Tim Sheard
- Simon Peyton Jones
Related topics
Seminal works
- kohlbecker1986
- taha2000
- sheard2002
- abelson1996
Frequently asked questions
- อะไรที่ทำให้ระบบแมโครถูกสุขลักษณะ?
- ระบบแมโครแบบถูกสุขลักษณะรับประกันว่าตัวระบุที่ถูกนำเข้ามาโดยแมโครจะไม่จับหรือบังตัวระบุในตำแหน่งที่เรียกใช้โดยไม่ตั้งใจ และในทางกลับกัน โดยการเปลี่ยนชื่อตัวแปรที่ถูกผูกมัดอย่างเป็นระบบในระหว่างการขยาย
- เมทาโปรแกรมมิงแตกต่างจากฟังก์ชันทั่วไปอย่างไร?
- ฟังก์ชันทั่วไปทำงานกับค่าในระหว่างการรันไทม์ ในขณะที่เมทาโปรแกรมมิงทำงานกับการแสดงโปรแกรม โดยสร้างหรือแปลงโค้ด ซึ่งมักจะเกิดขึ้นในระหว่างการคอมไพล์ ก่อนที่จะมีค่าในระหว่างการรันไทม์ใดๆ