คำถามติดแท็ก meta-programming

22
โปรแกรมอัตโนมัติ: เขียนโค้ดที่เขียนรหัส [ปิด]
หลังจากอ่านหนังสือThe Pragmatic Programmerหนึ่งในข้อโต้แย้งที่ฉันพบว่าน่าสนใจที่สุดคือ "เขียนโค้ดที่เขียนโค้ด" ฉันพยายามค้นหาคำอธิบายหรือบทความเกี่ยวกับเรื่องนี้ทางอินเทอร์เน็ตและในขณะที่ฉันพบบทความที่ดีเกี่ยวกับเรื่องนี้ฉันยังไม่พบการติดตั้งโค้ดเฉพาะหรือตัวอย่างที่ดี ฉันรู้สึกว่ามันยังไม่เป็นที่ถกเถียงกันทั่วไปอะไรบางอย่างที่ขาดเอกสารหรือมันไม่ได้เป็นที่ยอมรับของคนจำนวนมากและฉันต้องการทราบเพิ่มเติมเกี่ยวกับเรื่องนี้ คุณคิดยังไงกับเรื่องนี้? เป็นสิ่งที่จะเพิ่มประสิทธิภาพการทำงานของคุณหรือไม่ มีแหล่งข้อมูลที่ดีในเรื่องอะไรบ้างในหนังสือบล็อกบล๊อคสไลด์ ฯลฯ ตัวอย่างโค้ดบางส่วนจะช่วยให้ฉันเข้าใจการใช้งานได้ดีขึ้น นี่คือหน้า wikiของหัวเรื่องด้วยเทคนิคการเขียนโปรแกรมที่เกี่ยวข้องเช่น Meta Programming, Generative Programming และ Code Generation

10
มันโอเคที่จะใช้การเขียนโปรแกรมเมตาแม้ว่าเพื่อนร่วมงานของฉันจะไม่เข้าใจหรือไม่?
ฉันใช้การเขียนโปรแกรมเมตาจำนวนมากเพื่อหลีกเลี่ยงงานซ้ำ ๆ และสร้าง abstractions ที่ปลอดภัยต่อการใช้งาน ฉันเพิ่งย้ายไปทำงานใหม่ที่ฉันทำงานในทีมที่ใหญ่กว่าและสิ่งนี้ทำให้เพื่อนร่วมงานของฉันกังวลเพราะพวกเขาไม่เข้าใจ ฉันพยายามยกระดับความสามารถของภาษาอย่างเต็มที่ แต่เพื่อนร่วมงานของฉันบางคน (ไม่ใช่ทั้งหมด) เข้าใจว่าเป็นความเสี่ยง (บางคนยินดีต้อนรับวิธีการ) ฉันยอมรับว่ามันเป็นปัญหาในการเขียนโค้ดที่ไม่มีใครในทีมสามารถเข้าใจได้ ในทางกลับกันเราเป็นนักพัฒนา C ++ มืออาชีพและฉันคิดว่าเราควรจะมีมาตรฐานที่สูงกว่าการเขียน C ด้วยคลาส คำถามของฉันคือใครถูกต้องฉันควรทำอย่างไร การชี้แจง: การ พยายามยกระดับศักยภาพของภาษาอย่างเต็มที่ไม่ได้หมายความว่าฉันจะใช้ TMP ในทุกปัญหา C ++ เป็นกล่องเครื่องมือและสำหรับฉันความสามารถ C ++ นั้นเกี่ยวกับความสามารถในการใช้เครื่องมือทั้งหมดจากกล่องและเกี่ยวกับการเลือกเครื่องมือที่เหมาะสมสำหรับงานเฉพาะ

3
ฉันต้องคิดถึงรหัสเครื่องที่คอมไพล์เมื่อฉันเขียนรหัสหรือไม่?
ตัวอย่างเช่นฉันได้รับรหัสต่อไปนี้: auto z = [](int x) -> int { if (x > 0) { switch (x) { case 2: return 5; case 3: return 6; default: return 1; } } return 0; }; และต่อมาฉันเรียกสิ่งนี้หลายครั้ง ในรหัส asm ฉันเห็นสายภายนอกด้วยแลมบ์ดา .... บางสิ่งบางอย่าง ... มันกลายเป็นเรื่องง่ายที่จะอ่านและฉันคิดว่ามันอาจทำให้ประสิทธิภาพ ดังนั้นฉันอาจชนะในการเขียนโปรแกรม meta แต่ฉันเสียในการดีบัก asm และประสิทธิภาพหรือไม่ ฉันควรหลีกเลี่ยงฟีเจอร์ภาษาที่ทันสมัยมาโครและด้านการเขียนโปรแกรมเมตาอื่น ๆ เพื่อให้แน่ใจในประสิทธิภาพและการแก้ไขข้อบกพร่องอย่างง่ายหรือไม่?

4
มีข้อเสียในการใช้ AggressiveInlining ในคุณสมบัติง่าย ๆ ?
ฉันพนันได้เลยว่าฉันจะตอบว่าตัวเองถ้าฉันรู้เพิ่มเติมเกี่ยวกับเครื่องมือในการวิเคราะห์พฤติกรรมของ C # / JIT แต่เนื่องจากฉันไม่ได้โปรดอดทนกับฉันถาม ฉันมีรหัสง่าย ๆ เช่นนี้: private SqlMetaData[] meta; [MethodImpl(MethodImplOptions.AggressiveInlining)] private SqlMetaData[] Meta { get { return this.meta; } } อย่างที่คุณเห็นฉันใส่ AggressiveInlining เพราะฉันรู้สึกว่ามันควรจะถูกแทรก ฉันคิด. ไม่มีการรับประกันว่า JIT จะเป็นแบบอินไลน์ ฉันผิดหรือเปล่า? การทำสิ่งนี้อาจส่งผลกระทบต่อประสิทธิภาพ / ความเสถียร / อะไรหรือไม่?

5
การฝึกลิงถือเป็นการฝึกเขียนโปรแกรมที่ดีหรือไม่?
ฉันได้รับความประทับใจแล้วการจับลิงนั้นเป็นประเภทแฮ็คที่รวดเร็วและสกปรกมากกว่าการฝึกเขียนโปรแกรมมาตรฐานที่ดี ในขณะที่ฉันใช้เป็นครั้งคราวเพื่อแก้ไขปัญหาเล็กน้อยกับ libs ของบุคคลที่สามฉันคิดว่าเป็นการแก้ไขชั่วคราวและฉันจะส่งปะที่เหมาะสมให้กับโครงการของบุคคลที่สาม แต่ผมเคยเห็นเทคนิคนี้มาใช้เป็น "วิธีปกติ" ในโครงการหลักเช่นใน Gevent ของโมดูลgevent.monkey การฝึกลิงกลายเป็นกระแสหลักปกติการฝึกเขียนโปรแกรมที่ยอมรับได้หรือไม่? ดูเพิ่มเติม: "Monkeypatching เพื่อมนุษย์"โดย Jeff Atwood

1
สิ่งที่เป็นปัญหาในทางปฏิบัติเป็นผลมาจากการขาดแมโครที่ถูกสุขอนามัยใน Clojure?
ฉันเคยได้ยินมาโคร Clojure นั้นเขียนได้ง่ายกว่า แต่ไม่น่าเชื่อถือเท่ากับแมโครที่ถูกสุขอนามัยของ Racket คำถามของฉันมี 2 ส่วน: วิธีการที่ไม่gensymแตกต่างจากแมโครที่ถูกสุขอนามัย? มาโคร Racket ให้อะไรที่ Clojure ทำไม่ได้? (ไม่ว่าจะเป็นความปลอดภัยการประกอบหรืออะไรก็ได้)

2
IOC เวลารวบรวม
มีใครเริ่มโครงการที่จะทำ IOC ในเวลารวบรวม (อาจจะใช้ Roslyn หรือ Linq MethodInfo ปล่อย)? ประสบการณ์ของฉันกับคอนเทนเนอร์ของ IOC นั้นยอดเยี่ยมมากโดยมีปัญหาเล็ก ๆ น้อย ๆ คอนเทนเนอร์ IOC จำนวนมากเริ่มทำงานช้าลงเนื่องจากตรรกะการแก้ปัญหาส่วนใหญ่เกิดขึ้นที่นี่ บ่อยครั้งที่ยากที่จะตรวจสอบให้แน่ใจว่าการแก้ปัญหาเป็นไปได้เนื่องจากการรวบรวมไม่ทำให้แน่ใจได้ว่าตัวสร้างสามารถเรียกได้อีกต่อไป บ่อยครั้งที่คอนเทนเนอร์ของ IOC เพิ่มโอเวอร์เฮดขนาดเล็กให้กับรันไทม์ (บางอันไม่ได้เล็กแม้แต่บางอันที่เริ่มทำงานเร็วขึ้นอย่างรวดเร็ว) สำหรับฉันแล้วดูเหมือนว่าทางออกที่ดีที่สุดคือการเพิ่มขั้นตอนการคอมไพล์ให้กับ build chain ที่เพิ่มคลาส Factory แทน IOC มีใครทำแบบนี้มาก่อนหรือไม่ ถ้าไม่ทำไมล่ะ

4
การเขียนโปรแกรมเมตาพบได้บ่อยแค่ไหน? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา คุณเคยเห็นเมตาโปรแกรมมิ่งมาใช้บ่อยแค่ไหนในโครงการ ในมหาวิทยาลัยฉันไม่เคยเห็นสิ่งนี้ถูกนำไปใช้ แต่ฉันได้เห็นสิ่งนี้ในงานก่อนหน้าของฉัน (เมื่อฉันเห็นมัน แต่มันเป็นเรื่องธรรมดาอย่างไร มันใช้ตลอดเวลาหรือแค่บางครั้ง?

3
C ++: Metaprogramming ด้วย API คอมไพเลอร์มากกว่าด้วยคุณสมบัติ C ++
สิ่งนี้เริ่มต้นจากคำถาม SO แต่ฉันรู้ว่ามันค่อนข้างแปลกใหม่และตามคำอธิบายที่แท้จริงบนเว็บไซต์มันอาจจะเหมาะกว่าสำหรับ programmers.se เนื่องจากคำถามมีน้ำหนักเชิงแนวคิดจำนวนมาก ฉันได้เรียนรู้เสียงดังกังวาน LibToolingและเป็นเครื่องมือที่มีประสิทธิภาพมากที่สามารถเปิดเผย "nitty gritty" ทั้งหมดของรหัสด้วยวิธีที่เป็นมิตรกล่าวคือในทางที่เป็นความหมายและไม่ต้องเดาด้วยเช่นกัน ถ้าเสียงดังกราวสามารถรวบรวมรหัสของคุณแล้วเสียงดังกราวเป็นบางอย่างเกี่ยวกับความหมายของตัวละครทุกตัวเดียวภายในรหัสว่า ตอนนี้ให้ฉันถอยกลับสักครู่ มีปัญหาในทางปฏิบัติมากมายที่เกิดขึ้นเมื่อมีคนเข้าร่วมในเทมเพลต metaprogramming เทมเพลต C ++ (และโดยเฉพาะอย่างยิ่งเมื่อมีการใช้เทมเพลตเกินกว่าเทมเพลตเข้าไปในอาณาเขตของมาโครที่ชาญฉลาด ตามจริงแล้วสำหรับโปรแกรมเมอร์หลาย ๆ คนรวมถึงตัวเองการใช้งานเทมเพลตทั่วไปจำนวนมากก็ค่อนข้างน่ากลัวเช่นกัน ผมคิดว่าเป็นตัวอย่างที่ดีจะเป็นสตริงเวลารวบรวม นี่เป็นคำถามที่มีอายุเกินหนึ่งปีแล้ว แต่เป็นที่ชัดเจนว่า C ++ ณ ตอนนี้ไม่ได้ทำให้เป็นเรื่องง่ายสำหรับมนุษย์ปุถุชน ในขณะที่ดูตัวเลือกเหล่านี้ยังไม่เพียงพอที่จะทำให้เกิดอาการคลื่นไส้สำหรับฉัน แต่ก็ทำให้ฉันไม่มั่นใจเกี่ยวกับความสามารถในการสร้างรหัสเครื่องจักรที่มีประสิทธิภาพและมีประสิทธิภาพสูงสุดเพื่อให้เหมาะกับแอปพลิเคชันแฟนซีที่ฉันมีสำหรับซอฟต์แวร์ของฉัน ฉันหมายความว่าเรามาเจอกันคนอื่น ๆ สตริงนั้นค่อนข้างเรียบง่ายและเรียบง่าย พวกเราบางคนแค่ต้องการวิธีที่สะดวกในการปล่อยรหัสเครื่องที่มีสตริง "อบใน" อย่างมีนัยสำคัญมากกว่าที่เราจะได้รับเมื่อทำการเข้ารหัสในลักษณะที่ตรงไปตรงมา ในรหัส C ++ ของเรา ป้อน clang และ LibTooling ซึ่งแสดงแผนผังต้นไม้นามธรรม (AST) ของซอร์สโค้ดและอนุญาตให้แอปพลิเคชัน C ++ แบบกำหนดเองอย่างง่าย …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.