Metaprogramowanie

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

Metaprogramowanie – technika umożliwiająca programom tworzenie lub modyfikację kodu innych programów (lub ich samych). Program będący w stanie modyfikować lub generować kod innego programu nazywa się metaprogramem.

Wykorzystanie zasad metaprogramowania pozwala na przykład na dynamiczną modyfikację programu podczas jego kompilacji.

Metaprogramy pisze się w metajęzykach. Jeśli język jest jednocześnie swoim metajęzykiem, to taką cechę nazywamy refleksyjnością (ang. reflexivity).

Metaprogramowanie może polegać nie tylko na generowaniu kodu, ale również na modyfikacjach w czasie wykonania programu. Takie możliwości dają języki Javascript, Lisp, Perl, PHP, Prolog, Python, Ruby, Groovy, Smalltalk oraz Tcl.

Przykłady[edytuj | edytuj kod]

Przykładem prostego metaprogramu jest ten skrypt w bashu:

#!/bin/bash
# metaprogram
echo '#!/bin/bash' >program
for ((I=1; I<=992; I++)) do
    echo "echo $I" >>program
done
chmod +x program

Program ten generuje 993 linie, wypisujące liczby od 1 do 992. Nie jest to zbyt efektywny sposób na wypisanie liczb 1-992, ale ilustruje jak w kilka minut można stworzyć program o długości 1000 linii.

Dość analogiczny program w języku python wersji 3.0:

from os import system
clay = open( "adam.py", "w" )
clay.write( "print( \"Madam, i'm Adam.\" )" )
clay.close()
system("python3.0 adam.py")

Jeśli umieścimy powyższy kod w pliku i uruchomimy go to program wygeneruje plik/program adam.py i uruchomi go, a ten wypisze "Madam, i'm Adam.". Python posiada kilka funkcji ułatwiających metaprogramowanie np. exec() czy execFile().

Poniżej analogiczny kod w scheme:

(define adam "adam.scm") 
(define clay 
	(open-output-file adam))
 
(display "(display " clay)
(write "Madam, i'm Adam." clay)
(display ")" clay)
 
(close-output-port clay)
 
(load adam)

Zobacz też[edytuj | edytuj kod]