Metaprogramowanie odnosi się do różnych sposobów, w jakie program posiada wiedzę o sobie lub może manipulować sobą.
W językach takich jak C#, refleksja jest formą metaprogramowania, ponieważ program może badać informacje o sobie. Na przykład zwracając listę wszystkich właściwości obiektu.
W językach takich jak ActionScript, możesz oceniać funkcje w czasie wykonywania, aby tworzyć nowe programy, takie jak eval(„x” + i). DoSomething() wpłynie na obiekt o nazwie x1, gdy i wynosi 1 i x2, gdy i wynosi 2.
Wreszcie, inną powszechną formą metaprogramowania jest sytuacja, gdy program może zmienić się w nietrywialny sposób. LISP jest dobrze znany z tego i jest czymś, za czym Paul Graham był orędownikiem około dekady temu. Będę musiał poszukać jakichś jego konkretnych esejów. Ale pomysł polega na tym, że program zmieniłby inną część programu w oparciu o jej stan. Pozwala to na poziom elastyczności w podejmowaniu decyzji w czasie wykonywania, co jest bardzo trudne w większości popularnych obecnie języków.
Warto również zauważyć, że w starych dobrych czasach programowania w prostym asemblerze, programy zmieniające się w czasie wykonywania były konieczne i bardzo powszechne.
Z eseju Paula Grahama „What Made Lisp Different”:
Wiele języków ma coś, co nazywa się makrem. Ale makra Lispa są wyjątkowe. I wierzcie lub nie, to co robią jest związane z nawiasami. Projektanci Lispa nie umieścili tych wszystkich nawiasów w języku tylko po to, by być innym. Dla programisty Bluba, kod Lispa wygląda dziwnie. Ale te nawiasy są tam z jakiegoś powodu. Są one zewnętrznym dowodem fundamentalnej różnicy między Lispem a innymi językami.
Kod Lispa jest tworzony z obiektów danych Lispa. I to nie w tym trywialnym sensie, że pliki źródłowe zawierają znaki, a łańcuchy są jednym z typów danych obsługiwanych przez ten język. Kod Lispa, po odczytaniu go przez parser, składa się ze struktur danych, które można przemierzać.
Jeśli rozumiesz, jak działają kompilatory, to tak naprawdę nie chodzi o to, że Lisp ma dziwną składnię, ale o to, że Lisp nie ma składni. Piszesz programy w drzewach parsowania, które są generowane w kompilatorze, gdy inne języki są parsowane. Ale te drzewa parsowania są w pełni dostępne dla twoich programów. Możesz pisać programy, które nimi manipulują. W Lispie, programy te nazywane są makrami. Są to programy, które piszą programy.
Programy, które piszą programy? Kiedy w ogóle chciałbyś to robić? Niezbyt często, jeśli myślisz w Cobolu. Cały czas, jeśli myślisz w Lispie. Byłoby wygodnie, gdybym mógł podać przykład potężnego makra i powiedzieć: a co powiesz na to? Ale gdybym to zrobił, wyglądałoby to jak bełkot dla kogoś, kto nie zna Lispa; nie ma tu miejsca na wyjaśnienie wszystkiego, co trzeba wiedzieć, aby zrozumieć, co to znaczy. W Ansi Common Lisp starałem się poruszać sprawy tak szybko, jak tylko mogłem, a i tak nie dotarłem do makr aż do strony 160.
Myślę jednak, że mogę podać pewien rodzaj argumentu, który może być przekonujący. Kod źródłowy edytora Viaweb był prawdopodobnie w około 20-25% makrami. Makra są trudniejsze do napisania niż zwykłe funkcje Lisp, a używanie ich, gdy nie są potrzebne, jest uważane za zły styl. Tak więc każde makro w tym kodzie jest tam, ponieważ musi być. Oznacza to, że co najmniej 20-25% kodu w tym programie robi rzeczy, których nie można łatwo zrobić w żadnym innym języku. Jakkolwiek sceptyczny programista Blub mógłby być co do moich twierdzeń o tajemniczych mocach Lispa, to powinno go to zaciekawić. Nie pisaliśmy tego kodu dla własnej rozrywki. Byliśmy małym startupem, programującym tak ciężko, jak tylko mogliśmy, aby postawić techniczne bariery między nami a naszą konkurencją.
Podejrzliwa osoba może zacząć się zastanawiać, czy nie ma tu jakiejś korelacji. Duża część naszego kodu robiła rzeczy, które są bardzo trudne do zrobienia w innych językach. Powstałe w ten sposób oprogramowanie robiło rzeczy, których nie potrafiło zrobić oprogramowanie naszej konkurencji. Może istniał jakiś rodzaj powiązania. Zachęcam do śledzenia tego wątku. Może być coś więcej w tym starym człowieku poruszającym się o kulach, niż widać na pierwszy rzut oka.