Metaprogramming หมายถึงวิธีต่างๆที่โปรแกรมมีความรู้ในตัวเองหรือสามารถจัดการเองได้
ในภาษาเช่น C # การสะท้อนกลับเป็นรูปแบบหนึ่งของการเขียนโปรแกรมเนื่องจากโปรแกรมสามารถตรวจสอบข้อมูลเกี่ยวกับตัวมันเองได้ ตัวอย่างเช่นส่งคืนรายการคุณสมบัติทั้งหมดของวัตถุ
ในภาษาเช่น ActionScript คุณสามารถประเมินฟังก์ชันที่รันไทม์เพื่อสร้างโปรแกรมใหม่เช่น eval ("x" + i) DoSomething () จะส่งผลต่อวัตถุที่เรียกว่า x1 เมื่อ i คือ 1 และ x2 เมื่อฉันเป็น 2
สุดท้ายรูปแบบอื่น ๆ ของการเขียนโปรแกรมเมตาคือเมื่อโปรแกรมสามารถเปลี่ยนตัวเองในรูปแบบที่ไม่สำคัญ LISP เป็นที่รู้จักกันดีในเรื่องนี้และเป็นสิ่งที่ Paul Graham ให้การสนับสนุนเมื่อประมาณทศวรรษที่แล้ว ฉันจะต้องค้นหาบทความเฉพาะของเขา แต่แนวคิดก็คือโปรแกรมจะเปลี่ยนส่วนอื่นของโปรแกรมตามสถานะของโปรแกรม สิ่งนี้ช่วยให้มีความยืดหยุ่นในการตัดสินใจในรันไทม์ซึ่งเป็นเรื่องยากมากในภาษายอดนิยมในปัจจุบัน
นอกจากนี้ยังเป็นที่น่าสังเกตว่าย้อนกลับไปในสมัยที่ดีของการเขียนโปรแกรมในแอสเซมบลีแบบตรงโปรแกรมที่เปลี่ยนแปลงตัวเองเมื่อรันไทม์เป็นสิ่งที่จำเป็นและเป็นเรื่องธรรมดามาก
จากเรียงความของ Paul Graham "What Made Lisp Different" :
หลายภาษามีสิ่งที่เรียกว่ามาโคร แต่มาโคร Lisp มีลักษณะเฉพาะ และเชื่อหรือไม่ว่าสิ่งที่พวกเขาทำนั้นเกี่ยวข้องกับวงเล็บ นักออกแบบของ Lisp ไม่ได้ใส่วงเล็บทั้งหมดในภาษาเพื่อให้แตกต่างกัน สำหรับโปรแกรมเมอร์ Blub รหัส Lisp ดูแปลก ๆ แต่วงเล็บเหล่านั้นมีเหตุผล สิ่งเหล่านี้เป็นหลักฐานภายนอกของความแตกต่างพื้นฐานระหว่าง Lisp กับภาษาอื่น ๆ
รหัส Lisp สร้างขึ้นจากวัตถุข้อมูล Lisp และไม่ใช่ในแง่เล็กน้อยที่ซอร์สไฟล์มีอักขระและสตริงเป็นหนึ่งในประเภทข้อมูลที่ภาษาสนับสนุน รหัสเสียงกระเพื่อมหลังจากที่ตัววิเคราะห์อ่านถูกสร้างขึ้นจากโครงสร้างข้อมูลที่คุณสามารถสำรวจได้
ถ้าคุณเข้าใจวิธีการทำงานของคอมไพเลอร์สิ่งที่เกิดขึ้นจริงนั้นไม่มากนักที่ Lisp มีไวยากรณ์แปลก ๆ เนื่องจาก Lisp ไม่มีไวยากรณ์ คุณเขียนโปรแกรมในโครงสร้างการแยกวิเคราะห์ที่สร้างขึ้นภายในคอมไพลเลอร์เมื่อมีการแยกวิเคราะห์ภาษาอื่น แต่แผนผังการแยกวิเคราะห์เหล่านี้สามารถเข้าถึงโปรแกรมของคุณได้อย่างเต็มที่ คุณสามารถเขียนโปรแกรมที่จัดการกับมันได้ ใน Lisp โปรแกรมเหล่านี้เรียกว่ามาโคร พวกโปรแกรมที่เขียนโปรแกรม
โปรแกรมที่เขียนโปรแกรม? เมื่อไหร่ที่คุณอยากจะทำ? ไม่บ่อยนักถ้าคุณคิดใน Cobol ตลอดเวลาถ้าคุณคิดใน Lisp ที่นี่จะสะดวกถ้าฉันสามารถยกตัวอย่างมาโครที่มีประสิทธิภาพและพูดตรงนั้น! แล้วไงล่ะ? แต่ถ้าฉันทำมันก็ดูเหมือนจะเป็นการพูดพล่อยๆสำหรับคนที่ไม่รู้จัก Lisp ที่นี่ไม่มีที่จะอธิบายทุกสิ่งที่คุณจำเป็นต้องรู้เพื่อให้เข้าใจว่ามันหมายถึงอะไร ในAnsi Common Lispฉันพยายามเคลื่อนย้ายสิ่งต่างๆให้เร็วที่สุดเท่าที่จะทำได้และถึงอย่างนั้นฉันก็ไม่ได้ไปที่มาโครจนถึงหน้า 160
แต่ฉันคิดว่าฉันสามารถโต้แย้งที่อาจทำให้เชื่อได้ ซอร์สโค้ดของตัวแก้ไข Viaweb น่าจะเป็นมาโครประมาณ 20-25% มาโครนั้นเขียนยากกว่าฟังก์ชัน Lisp ทั่วไปและถือว่าเป็นรูปแบบที่ไม่ดีที่จะใช้เมื่อไม่จำเป็น ดังนั้นทุกมาโครในโค้ดนั้นจะมีอยู่เพราะมันต้องมี หมายความว่าอย่างน้อย 20-25% ของโค้ดในโปรแกรมนี้กำลังทำสิ่งที่คุณไม่สามารถทำได้ในภาษาอื่น อย่างไรก็ตามโปรแกรมเมอร์ของ Blub อาจสงสัยเกี่ยวกับการอ้างสิทธิ์ของฉันเกี่ยวกับพลังลึกลับของ Lisp สิ่งนี้ควรทำให้เขาสงสัย เราไม่ได้เขียนโค้ดนี้เพื่อความสนุกของเราเอง เราเป็นสตาร์ทอัพเล็ก ๆ เขียนโปรแกรมให้หนักที่สุดเท่าที่จะทำได้เพื่อวางอุปสรรคทางเทคนิคระหว่างเรากับคู่แข่งของเรา
บุคคลที่น่าสงสัยอาจเริ่มสงสัยว่ามีความสัมพันธ์ที่นี่หรือไม่ โค้ดส่วนใหญ่ของเรากำลังทำสิ่งที่ยากมากที่จะทำในภาษาอื่น ๆ ซอฟต์แวร์ที่ได้มาทำในสิ่งที่ซอฟต์แวร์ของคู่แข่งไม่สามารถทำได้ อาจจะมีการเชื่อมต่อบางอย่าง ขอแนะนำให้ติดตามกระทู้นั้น อาจจะมีมากกว่าที่ชายชราคนนั้นกำลังนั่งอยู่บนไม้ค้ำยันของเขามากกว่าที่จะเห็น