Meta-การเขียนโปรแกรม


10

ฉันเพิ่งเริ่มต้นการเดินทางในฐานะนักพัฒนา C ++ และฉันเพิ่งค้นคว้าหัวข้อที่เรียกว่าการเขียนโปรแกรมเมตา จนถึงตอนนี้ฉันได้รับข้อมูลจำนวนมากในหัวข้อและมีคำถามสองสามข้อ

  1. การใช้ Reflection ใน c ++: เป็นไปได้ไหม? ตามการสะท้อนความเข้าใจของฉันเป็นเทคนิคการเขียนโปรแกรมเมตาซึ่งมีความสามารถในการจัดการสถานะของโปรแกรมและการจัดการของมันอาจเป็นการวิปัสสนาหรือการแนะนำตัว

  2. อะไรคือความแตกต่างระหว่างสถาปัตยกรรมสะท้อนแสงและสถาปัตยกรรมระดับเมตาดาต้า สถาปัตยกรรมการเขียนโปรแกรมเมตาอยู่ในประเภทใด

  3. Meta-programming มาในสองระดับ: ระดับเมตาและระดับพื้นฐาน ในความเข้าใจของฉันโปรแกรมวัตถุหรือระบบภายใต้การตรวจสอบคือระดับฐานและโปรแกรมเมตาที่กำลังทำงานเหนือระบบภายใต้การตรวจสอบคือระดับเมตา ฉันถูกไหม?

ยังช่วยฉันด้วยการให้แนวทางเกี่ยวกับการทำงานกับ metaprogramming แม่แบบใน C ++
คุณช่วยแนะนำฉันตัวอย่างที่ใช้การได้บางอย่างที่ฉันสามารถหาเพื่อลงมือปฏิบัติได้จริงในเทคนิคการเขียนโปรแกรมนี้หรือไม่?


2
คำถามนี้อาจเป็นของโปรแกรมเมอร์มากกว่าใน stackoverflow อดีตถูกทางทฤษฎีมากขึ้นและในทางปฏิบัติมากขึ้นในภายหลัง บางส่วนสามารถตอบได้อย่างง่ายดายจากมุมมองที่ใช้งานได้จริงC ++ ไม่มีการสะท้อนแต่ส่วนอื่น ๆ ไม่เกี่ยวข้องกับรหัส (เช่นความแตกต่างระหว่างสถาปัตยกรรมสะท้อนแสงและสถาปัตยกรรมโลหะเช่นโลหะ)
David Rodríguez - dribeas

คำตอบ SO นี้กล่าวถึงสาเหตุที่ C ++ ไม่มีภาพสะท้อน: stackoverflow.com/q/359237/120163และเทคนิค C ++ บางอย่างที่อ่อนแอสำหรับการจำลองมันไม่ดี
Ira Baxter

หากคุณสนใจโปรแกรม metaprogramming มาก ๆ ฉันขอแนะนำให้คุณดูภาษา D ซึ่งชัดเจนกว่า C ++ ในจุดนี้
deadalnix

คำตอบ:


10

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

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

ตัวอย่างอื่น ๆ ของ metaprogramming ได้แก่ ตัวสร้างโค้ดไบนารีที่แก้ไขตัวเอง (แม้ว่าสิ่งเหล่านี้จะไม่เป็นที่นิยมอีกต่อไปในปัจจุบันเมื่อสองทศวรรษก่อน) แมโคร C; เราสามารถยืนยันได้ว่าเทคนิคการเขียนโปรแกรมการทำแกงกะหรี่และการทำหน้าที่คล้าย ๆ กันนั้นก็เป็นวิธีการเขียนโปรแกรมแบบเดียวกันด้วยเช่นกัน


+1 ฉันชอบคำตอบของคุณและฉันต้องการถามเกี่ยวกับการใช้คอมไพเลอร์เป็นบริการเช่นใน C # หรือใช้เครื่องมือการเขียนสคริปต์เช่นใน Java เพื่อรันโค้ดที่สร้างขึ้นในเวลาทำงาน นี่เป็นรูปแบบหนึ่งของการเปรียบเทียบโปรแกรมด้วยหรือไม่
M.Sameer

ดังนั้นใครก็ตามที่สร้าง Python interpreter ใน C คือ metaprogramming สิ่งที่เกี่ยวกับการใช้ ORM ที่แมปภาษาเชิงวัตถุกับ SQL กรอบงานเว็บทุกตัวอย่างของ metaprogramming หรือไม่
kojiro

1
  1. ไม่มันไม่ใช่ โปรแกรม C ++ จะถูกคอมไพล์ไปยังรหัสเครื่องและข้อมูลทั้งหมดเกี่ยวกับคลาสเป็นต้นจะหายไป (เว้นแต่ใช้ C ++ / CLI สำหรับสภาพแวดล้อม. NET แต่นั่นไม่ใช่ C ++ บริสุทธิ์)

2-3 ฉันไม่รู้ - รอคำตอบอื่นที่ช่วยได้ :-)

การเขียนโปรแกรม Meta โดยใช้เทมเพลต C ++ นั้นมีประสิทธิภาพมาก แต่ก็ซับซ้อนเช่นกัน การขยายเทมเพลตต้องการสไตล์การทำงานของการเขียนโปรแกรมมากกว่าการเขียนโปรแกรมที่จำเป็นที่ C ++ ใช้ หากคุณไม่เคยมีประสบการณ์เกี่ยวกับการเขียนโปรแกรมฟังก์ชั่นฉันขอแนะนำให้คุณอ้อมและเรียนรู้พื้นฐานเสียงกระเพื่อม, haskell หรือแบบแผน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.