Metaprogramowanie

10

Właśnie rozpocząłem swoją przygodę jako programista C ++, a ostatnio badam temat zwany metaprogramowaniem. Do tej pory przejrzałem wiele informacji na ten temat i mam kilka pytań.

  1. Zastosowanie Refleksji w c ++: Czy to możliwe? Zgodnie z moim rozumieniem refleksja jest techniką metaprogramowania, która ma zdolność manipulowania stanem programu, a jej manipulacją może być introspekcja lub introcesja.

  2. Jaka jest różnica między architekturą refleksyjną a architekturą meta-poziomową? W jakiej kategorii mieści się architektura metaprogramowania?

  3. Metaprogramowanie ma dwa poziomy: poziom meta i poziom podstawowy. W moim rozumieniu program obiektowy lub badany system to poziom podstawowy, a program meta, który będzie działał w badanym systemie, to poziom meta. Mam rację?

Pomóż mi również, udzielając wskazówek dotyczących pracy nad metaprogramowaniem szablonów w C ++.
Czy możesz zasugerować mi kilka praktycznych przykładów, których mogę szukać, aby poznać tę technikę programowania?

ChrisF
źródło
2
To pytanie może należeć bardziej do programistów niż do stackoverflow. Te pierwsze są bardziej teoretyczne, a później bardziej praktyczne. Na niektóre części można łatwo odpowiedzieć z praktycznego punktu widzenia C ++ nie ma refleksji , ale inne nie są związane z kodem (na przykład różnica między architekturami refleksyjnymi i metalevel)
David Rodríguez - dribeas
Ta odpowiedź SO wyjaśnia, dlaczego C ++ nie ma odbicia: stackoverflow.com/q/359237/120163 i niektóre słabe techniki C ++ do złej symulacji.
Ira Baxter,
Jeśli jesteś bardzo zainteresowany metaprogramowaniem, sugeruję, abyś spojrzał na język D, który jest w tej kwestii bardziej przejrzysty niż C ++.
deadalnix,

Odpowiedzi:

10

Metaprogramowanie oznacza po prostu, że masz środki do pisania kodu, który zapisuje inny kod (w szerokim znaczeniu). C ++ robi to za pośrednictwem mechanizmu szablonów, który jest w zasadzie bezpiecznym językiem makr. Jest całkowicie możliwe, aby zastosować krok rozwinięcia szablonu, a wynik będzie prawidłowym kodem C ++ bez szablonów.

Refleksja to zdolność języka programowania i / lub środowiska wykonawczego do sprawdzania (i często modyfikowania) własnych elementów języka w czasie wykonywania. Zazwyczaj języki odblaskowe oferują struktury danych, które reprezentują elementy języka, takie jak klasy, metody, zmienne, parametry itp., A także procedury lub klasy do ich sprawdzania, modyfikowania i tworzenia. Możliwość modyfikacji sprawia, że ​​odbicie jest rodzajem metaprogramowania, ponieważ pozwala pisać kod, który generuje inny kod.

Inne przykłady metaprogramowania to generatory kodu, samomodyfikujące się pliki binarne (choć dziś nie są one tak popularne jak dwie dekady temu), makra C; można argumentować, że curry i podobne techniki programowania funkcjonalnego są również rodzajem metaprogramowania.

tdammers
źródło
+1 Naprawdę podoba mi się twoja odpowiedź i chcę zapytać o użycie kompilatora jako usługi jak w C # lub użycie silnika skryptowego jak w Javie do wykonania kodu zbudowanego w czasie wykonywania. Czy to też nie jest forma metaprogramowania?
M.Sameer
Czy ktoś, kto buduje interpreter języka Python w C, jest metaprogramowaniem? Co z implementacją ORM, która odwzorowuje język obiektowy na SQL? Czy każda platforma internetowa jest przykładem metaprogramowania?
kojiro
1
  1. Nie, nie jest. Programy C ++ są kompilowane do kodu maszynowego, a wszystkie informacje o klasach itp. Są tracone (chyba że używa się C ++ / CLI dla środowiska .NET, ale to nie jest czysty C ++).

2-3. Nie wiem - poczekaj na kolejną odpowiedź, która pomoże w tym :-)

Programowanie meta przy użyciu szablonów C ++ jest bardzo wydajne, ale także złożone. Rozszerzenie szablonu wymaga funkcjonalnego stylu programowania, a nie programowania imperatywnego używanego przez C ++. Jeśli nie masz wcześniejszego doświadczenia z programowaniem funkcjonalnym, poleciłbym ci objazd i nauczenie się podstawowych zasad lisp, haskell lub schematu.

Anders Abel
źródło