Metaprogramowanie to proces pisania programów komputerowych, które z kolei piszą inne programy. Proces metaprogramowania zapewnia większą elastyczność programistom komputerowym, ponieważ praca zwykle wykonywana w czasie wykonywania jest przydzielana do czasu kompilacji. Proces ten uwalnia czas programisty na skupienie się na innych zadaniach, ponieważ skraca czas potrzebny na ręczne napisanie kodu programu. Ponowna kompilacja jest niepotrzebna, ponieważ metaprogramowanie pozwala programom radzić sobie z nowymi sytuacjami z większą wydajnością. „Metajęzyk” to termin nadany językowi komputerowemu używanemu przez metaprogram.
Język obiektowy to język komputerowy tych programów, które są pisane w procesie metaprogramowania. Refleksyjność to termin nadany metajęzykowi, który również może prowadzić do metaprogramowania. Metaprogramowanie działa na różne sposoby. Jednym ze sposobów jest umożliwienie kodowi programowania dostępu do wnętrza silnika wykonawczego przez interfejs programowania aplikacji.
Innym sposobem, w jaki działa metaprogramowanie, jest umożliwienie programom pisania innych programów w dynamicznym procesie wykonywania. W takim przypadku w tym procesie używane są wyrażenia tekstowe. Chociaż ten sam język może być używany w tych dwóch procesach, nie jest niczym niezwykłym, że języki faworyzują jeden proces nad drugim.
Metaprogramowanie działa również poprzez omijanie języka. Pozwala na zmianę języków poprzez systemy transformacji programów. Ta procedura daje metaprogramowaniu swobodę używania języków, nawet jeśli język nie zawiera żadnych cech metaprogramowania.
Do metaprogramowania nie jest potrzebny kod źródłowy. Można to zrobić za pomocą kompilacji przyrostowej lub programów zmieniających się w czasie wykonywania. Język komputerowy Lisp jest preferowanym językiem w procesie metaprogramowania. Wynika to z prostoty tego typu języka komputerowego oraz jego mocy.
Metaprogramowanie wykorzystujące język Lisp działa, umożliwiając ocenę kodu w okresie definiowania programu, w przeciwieństwie do okresu wykonawczego. Ten proces sprawia, że język metaprogramowania i język programowania hosta są takie same. Kiedy to nastąpi, te procedury Lisp mogą zostać ponownie wykorzystane w procesie metaprogramowania.
Inne języki wykorzystywały ten właśnie proces z integracją interpretera programu. Ten interpreter pracuje z danymi w programie. Języki programowania specyficzne dla domeny w metaprogramowaniu to kolejna forma, która tworzy parsery i analizatory leksykalne. Dzięki temu użytkownik może używać wyrażeń regularnych do definiowania języka.