ScholarGate
ผู้ช่วย

เมทาโปรแกรมมิงและแมโคร

เมทาโปรแกรมมิงพิจารณาโปรแกรมเป็นข้อมูลที่โปรแกรมอื่นสามารถสร้าง ตรวจสอบ หรือแปลงได้ โดยมีแมโครที่ให้การสร้างนามธรรมทางวากยสัมพันธ์ที่ควบคุมได้ในระหว่างการคอมไพล์

ค้นหาหัวข้อด้วย PaperMindเร็ว ๆ นี้Find papers & topics
Tools & resources
ดาวน์โหลดสไลด์
Learn & explore
วิดีโอเร็ว ๆ นี้

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

อะไรที่ทำให้ระบบแมโครถูกสุขลักษณะ?
ระบบแมโครแบบถูกสุขลักษณะรับประกันว่าตัวระบุที่ถูกนำเข้ามาโดยแมโครจะไม่จับหรือบังตัวระบุในตำแหน่งที่เรียกใช้โดยไม่ตั้งใจ และในทางกลับกัน โดยการเปลี่ยนชื่อตัวแปรที่ถูกผูกมัดอย่างเป็นระบบในระหว่างการขยาย
เมทาโปรแกรมมิงแตกต่างจากฟังก์ชันทั่วไปอย่างไร?
ฟังก์ชันทั่วไปทำงานกับค่าในระหว่างการรันไทม์ ในขณะที่เมทาโปรแกรมมิงทำงานกับการแสดงโปรแกรม โดยสร้างหรือแปลงโค้ด ซึ่งมักจะเกิดขึ้นในระหว่างการคอมไพล์ ก่อนที่จะมีค่าในระหว่างการรันไทม์ใดๆ

Methods for this concept

Related concepts