Informácie o predmete

Anotácia

Metaprogramovanie je písanie programov, ktoré pracujú s programami ako s dátami. Tento predmet je venovaný technikám metaprogramovania a ich využitiu pri návrhu a implementácii programov. Študenti sa oboznámia s rôznymi reprezentáciami programov, s možnosťami ich analýzy a generovania. Budeme sa tiež venovať pokročilým vlastnostiam programovacích jazykov, ktoré umožňujú programom analyzovať a upravovať vlastnú štruktúru. Medzi témy predmetu patria reflexia, atribútové programovanie, makrá, generovanie kódu, aspektovo-orientované programovanie.

Z čoho sa učiť?

Snímky z prednášok nie sú študijným materiálom, ale iba pomôckou pre sledovanie prednášky. Preto nemá zmysel sa z nich učiť. Hlavnými zdrojmi pre učenie sa preto sú:

  • záznamy prednášok a vlastné poznámky z nich,
  • témy opísané na stránke predmetu (work in progress),
  • zdroje – odporúčaná literatúra.

Zápočet

  • Zadanie: 3 iterácie po 10 bodov
  • Aktivita – 6 bodov
  • Povinné čítanie – prvé 4 body

Skúška

  • Písomná práca – 10 bodov
  • Povinné čítanie – zvyšných 10 bodov
  • Ústna skúška – 40 bodov (2 náhodné otázky z okruhov)

Písomná práca

Opíšte aspoň štyri návrhy na využitie poznatkov získaných na tomto predmete v praxi. Napríklad vo vašich školských alebo iných projektoch. Opis návrhu by mal obsahovať stručné vysvetlenie projektu a problému, ktorý by bolo možné riešiť pomocou metaprogramovania, a samotného navrhovaného riešenia.

Použitie príkladov uvádzaných na prednáškach a cvičeniach sa neráta. Musí isť o vlastné použitie metaprogramovania, a nie o použitie existujúceho nástroja, ktorý používa metaprogramovanie.

Práca musí byť odovzdaná najneskôr 24 hodín pred termínom skúšky.

Okruhy skúškových otázok

  1. Metaprogramovanie – definícia, typy metaprogramovania, dôvody jeho použitia
  2. Reprezentácie programov a ich vzťah s metaprogramovaním
  3. Reflexia – definícia, prostriedky realizácie reflexie, použitie v jazyku Java
  4. Metadáta kódu – význam a typy metadát v programovom kóde, ich použitie
  5. Anotácie v jazyku Java – definícia a použitie anotačných typov pomocou reflexie
  6. Zásobník volaní – význam zásobníka v programovacích jazykoch a jeho introspekcia
  7. Dynamické proxy v jazyku Java – princíp fungovania a využitie
  8. Realizácia tried v jazyku Java a ich načítavanie (ClassLoader)
  9. Spracovanie anotácií počas prekladu – anotačný procesor
  10. Systémy typov a ich využitie v programovaní a metaprogramovaní
  11. Prostriedky metaprogramovania v dynamických programovacích jazykoch (Python)
  12. Generovanie kódu – typy generátorov a techniky generovania kódu
  13. Makrá a ich použitie v programovacích jazykoch
  14. Význam a využitie metaprogramovania v architektúre softvéru
  15. Vývoj softvéru na základe modelu (MDSD)
  16. Aspektovo orientované programovanie – význam, základné pojmy, realizácia v AspectJ
  17. AspectJ – body spájania a súvisiace bodové prierezy (join points, pointcuts)
  18. AspectJ – odporučenia (advices)

Odporúčaná literatúra

  1. Ira R. Forman, Nate Forman: Java Reflection in Action, Manning 2004, ISBN 9781932394184
  2. Ján Kollár, Jaroslav Porubän, Sergej Chodarev: Modelovanie a generovanie softvérových architektúr, elfa 2012, ISBN 978-80-553-1229-3
  3. Martin Fowler: Domain Specific Languages, Addison-Wesley Professional 2010, ISBN: 978-0-321-71294-3
  4. David Thomas, Andrew Hunt: The Pragmatic Programmer, 20th Anniversary Edition. Person, 2020, ISBN: 978-0-13-595705-9
  5. Ramnivas Laddad. AspectJ in Action, Second Edition, Manning 2009, ISBN 9781933988054
  6. Harold Abelson, Gerald Jay Sussman, Julie Sussman: Structure and Interpretation of Computer Programs. MIT Press, 1996
  7. Luciano Ramalho: Fluent Python. O'Reilly Media, 2015. ISBN: 9781491946008