Metaprogrammeerimine on selliste arvutiprogrammide kirjutamine, mis manipuleerivad andmetena teisi programme (või iseennast), või mis teevad osa tööst, mida harilikult tehtaks programmi jooksmise ajal, juba kompileerimise ajal.
Keelt, milles metaprogramm on kirjutatud, kutsutakse metakeeleks. Keelt, milles kirjutatud programme manipuleeritakse, nimetatakse objektkeeleks. Programmeerimiskeele võimet olla iseenda metakeel nimetatakse refleksiooniks.
Refleksioon on väärtuslik metaprogrammeerimise tööriist. Samuti tuleb kasuks, kui programmeerimiskeel ise on esmajärguline andmetüüp (nagu näiteks keeltes Lisp, Forth, Rebol).