ผลต่างระหว่างรุ่นของ "เมทาโปรแกรมมิง"
Octahedron80 (คุย | ส่วนร่วม) ล เพิ่มหมวดหมู่:แบบอย่างการเขียนโปรแกรม ด้วยสคริปต์จัดให้) |
Octahedron80 (คุย | ส่วนร่วม) จัดรูปแบบ +เก็บกวาดด้วยสจห. |
||
บรรทัด 8: | บรรทัด 8: | ||
ตัวอย่างต่อไปนี้เป็นเมทาโปรแกรมที่เขียนขึ้นใน [[bash]] |
ตัวอย่างต่อไปนี้เป็นเมทาโปรแกรมที่เขียนขึ้นใน [[bash]] |
||
<source lang="bash"> |
<source lang="bash"> |
||
#!/bin/bash |
#!/bin/bash |
||
# metaprogram |
# metaprogram |
||
echo '#!/bin/bash' >program |
echo '#!/bin/bash' >program |
||
บรรทัด 29: | บรรทัด 29: | ||
* [[การเขียนโปรแกรมเชิงภาษา]] (language-oriented programming) |
* [[การเขียนโปรแกรมเชิงภาษา]] (language-oriented programming) |
||
* [[รหัสดัดแปรตัวเอง]] (self-modifying code) |
* [[รหัสดัดแปรตัวเอง]] (self-modifying code) |
||
⚫ | |||
[[de:Metaprogrammierung]] |
[[de:Metaprogrammierung]] |
||
บรรทัด 39: | บรรทัด 41: | ||
[[ru:Метапрограммирование]] |
[[ru:Метапрограммирование]] |
||
[[vi:Lập trình meta]] |
[[vi:Lập trình meta]] |
||
⚫ |
รุ่นแก้ไขเมื่อ 08:25, 1 กรกฎาคม 2551
เมทาโปรแกรมมิง (อังกฤษ: metaprogramming) คือเทคนิคการเขียนโปรแกรมคอมพิวเตอร์ ซึ่งจะทำงานโดยเขียนหรือจัดการโปรแกรมอื่น (หรือโปรแกรมของตัวเอง) เสมือนข้อมูลของโปรแกรม หรือสร้างงานบางส่วนขณะแปลโปรแกรมแล้วเติมเต็มงานที่เหลือขณะโปรแกรมทำงาน ในหลายกรณี เมทาโปรแกรมมิงช่วยให้โปรแกรมเมอร์สามารถประหยัดเวลาในการเขียนรหัสต้นฉบับที่เหมือนๆ กันจำนวนมากแทนที่จะเขียนทั้งหมดเองด้วยมือ อาจเรียกได้ว่าเป็นการทำงานแบบ "โปรแกรมที่เขียนโปรแกรม"
ภาษาที่ใช้เขียน เมทาโปรแกรม (metaprogram) จะถูกเรียกว่าอภิภาษา (metalanguage) และภาษาที่ถูกโปรแกรมจัดการจะเรียกว่าภาษาจุดหมาย (object language) ความสามารถของภาษาที่เป็นอภิภาษาภายในภาษาเดียวกันได้ เรียกว่าสมบัติสะท้อนของภาษาโปรแกรม (reflection/reflexivity) ซึ่งสมบัติสะท้อนเป็นคุณลักษณะหนึ่งของภาษาที่จะนำไปสู่เมทาโปรแกรมมิงได้สะดวกยิ่งขึ้น
เมทาโปรแกรมมิงมักจะมีแนวทางการเขียนหนึ่งในสองทาง ทางแรกคือการเปิดเผยโครงสร้างภายในของเอนจินขณะทำงานไปเป็นรหัสต้นฉบับผ่านทางเอพีไอ ทางที่สองคือการจัดการนิพจน์สตริงที่รวมคำสั่งไปเป็นรหัสต้นฉบับแบบพลวัต
ตัวอย่าง
ตัวอย่างต่อไปนี้เป็นเมทาโปรแกรมที่เขียนขึ้นใน bash
# !/bin/bash
# metaprogram
echo '#!/bin/bash' >program
for ((I=1; I<=992; I++)) do
echo "echo $I" >>program
done
chmod +x program
สคริปต์ (หรือโปรแกรม) ข้างต้นจะสร้างสคริปต์ขึ้นมาใหม่จำนวน 993 บรรทัด เก็บไว้ในแฟ้มชื่อ "program" ซึ่งจะทำงานเป็นการพิมพ์ค่า 1 ถึง 992 ออกมา นี่เป็นเพียงตัวอย่างหนึ่งของการใช้รหัสเพื่อเขียนรหัสจำนวนมาก ไม่ใช่แนวทางที่เหมาะสมที่สุดสำหรับการพิมพ์รายชื่อจำนวน ถึงอย่างไรก็ตาม โปรแกรมเมอร์สามารถเขียนและสั่งให้เมทาโปรแกรมทำงาน และจะได้รหัสต้นฉบับเป็นจำนวนหลายพันบรรทัดภายในไม่กี่นาที
ถ้าหากโปรแกรมสามารถถูกปรับแต่งในขณะทำงานได้ (เช่น ภาษาลิสป์ ภาษาไพทอน ภาษาสมอลล์ทอล์ก ภาษารูบี ภาษาพีเอชพี ภาษาเพิร์ล และจาวาสคริปต์) เทคนิคเมทาโปรแกรมมิงจะสามารถทำงานได้ทันทีโดยไม่ต้องสร้างรหัสต้นฉบับด้วยซ้ำไป แต่ก็ไม่ใช่ว่าทุกภาษาจะทำเช่นนี้ได้
ตัวอย่างหนึ่งของเครื่องมือเมทาโปรแกรมมิงที่เป็นที่รู้จักมากที่สุดก็คือคอมไพเลอร์ (compiler) ซึ่งช่วยให้โปรแกรมเมอร์เขียนโปรแกรมขนาดเล็กได้จากภาษาโปรแกรมระดับสูง เพื่อเขียนโปรแกรมภาษาเครื่องหรือภาษาแอสเซมบลีที่เทียบเท่ากัน คอมไพเลอร์จึงกลายเป็นเครื่องมือพื้นฐานสำหรับการเขียนโปรแกรม เนื่องจากการเขียนภาษาเครื่องลงไปโดยตรงนั้นไม่มีประสิทธิภาพเมื่อนำมาใช้งานจริง
อีกตัวอย่างหนึ่งของเครื่องมือเมทาโปรแกรมมิงก็คือ lex และ yacc ซึ่งเครื่องมือสองอย่างนี้ใช้สำหรับสร้างตัววิเคราะห์ศัพท์ (lexical analyzer) และตัวแจงส่วนของศัพท์ (lexical parser) สำหรับ yacc นั้นอาจเรียกได้ว่าเป็น "คอมไพเลอร์ของคอมไพเลอร์" คือเครื่องมือที่ใช้สำหรับสร้างเครื่องมือแปลภาษาระดับสูงให้เป็นภาษาเครื่อง
ดูเพิ่ม
- การเขียนโปรแกรมอัตโนมัติ (automatic/generative programming)
- การเขียนโปรแกรมเชิงภาษา (language-oriented programming)
- รหัสดัดแปรตัวเอง (self-modifying code)