Metaprogramovanie / Úvod, reflexia

Sergej Chodarev

Metaprogramovanie 1

Úvod, reflexia

Sergej Chodarev

Metaprogramovanie

Metaprogramovanie je vytváranie programov, ktoré manipulujú programami ako dátami — analyzujú, generujú alebo transformujú iné programy alebo seba.

One person’s data is another person’s program.

— Guy L. Steele, Jr.

Príklady


meta-

μετά

Tento predmet

Hodnotenie

Z čoho sa učiť?

Metaprogramovanie

Metaprogramovanie je vytváranie programov, ktoré manipulujú programami ako dátami — analyzujú, generujú alebo transformujú iné programy alebo seba.

Čo je to program?

Computer Program

computer program, detailed plan or procedure for solving a problem with a computer; more specifically, an unambiguous, ordered sequence of computational instructions necessary to achieve such a solution. The distinction between computer programs and equipment is often made by referring to the former as software and the latter as hardware.

Encyclopædia Britannica

Aký tvár má program?

ENIAC
Manchester University SSEM 'Baby' replica

Ako vyzerá program?

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}
ELF file layout
Linux process segment layout

Reprezentácia programov

Typy metaprogramovania

  1. compile time
  2. link time
  3. load time
  4. run time
  1. Manipulácia s iným programom
  2. Samomanipulácia

"Magic" is just a word programmers use for poetry in code that they don't appreciate at first glance. I love magic and learning how it works! We're supposed to be the wizards of the computer.

— DHH (@dhh) February 8, 2025

Prečo používať metaprogramovanie?

Modularita

Metalingvistická abstrakcia

Reflexia

Reflexia

Reflexia (reflection) — schopnosť spusteného programu skúmať svoju štruktúru, stav a okolie a na základe toho meniť svoje správanie.

Introspekcia (introspection) — sebapozorovanie.

Príklad


public class ReflectiveHelloWorld {
    public void printHello() {
        System.out.println("Hello from " +
                           this.getClass().getName());
    }
}

Príklad

Majme objekt o ktorom vieme, že má definovanú metódu void setColor(Color color), nevieme však jeho konkrétny typ.

Ako zavolať túto metódu?

    public static void setObjectColor(Object obj, Color color) {
      Class cls = obj.getClass();
      try {
        Method method = cls.getMethod("setColor", Color.class);
        method.invoke(obj, color);
      } catch (NoSuchMethodException ex) { ... }
        catch (IllegalAccessException ex) { ... }
        catch (InvocationTargetException ex) { ... }
    }
  

Metaobjekty

Získanie metaobjektov

Reflection API

Class<T>

Prístup k dátovým členom

Field

Prístup k metódam

Method

Vytvorenie objektu

Demo

Čo s private?

AcessibleObject

Zdrojové kódy

https://git.kpi.fei.tuke.sk/meta/examples/json