Метапрограмирање

С Википедије, слободне енциклопедије

Метапрограмирање је писање рачунарских програма са могућношћу да се третирају програми као њихови подаци. То значи да програм буде дизајниран за читање, генерисање, анализу или трансформацију других програма, па чак и да се измени док ради.[1][2] У неким случајевима, ово омогућава програмерима да се смањи број линија кода да изразе решење (самим тим смањује време потребно за развој)  или даје програмима већу флексибилност да ефикасно управљају новим ситуацијама без рекомпајлирања.

Језик у којем  је метапрограм написан се зове метајезик. Језик програма који се манипулише се зове објектни језик. Способност програмског језика да буде свој метајезик зове се рефлексија или рефлексивност

Рефлексија је вредна карактеристика језика како би се олакшало метапрограмирањег. Имајући програмски језик сам  као прве класе типа података (као у Lisp, Пролог, СНОБОЛ, РЕБОЛ, или Io) је такође веома корисно; ово је познато као хомоиконичност.  Генеричко програмирање позива метапрограмски објекат у језику, на тим језицима који га подржавају.

Метапрограмирање обично ради у једном од три начина. Први начин је да разоткрије унутрашњост рун-тиме мотора у коду програмирања кроз апликациони програмски интерфејс (АПИ). Други приступ је динамичан извршењу израза који садржи програмске команде, често састављене од жица, али могу бити и од других метода које користе аргументе или контекст.[3] Тако, "програми могу писати програме." Иако оба приступа могу да се користе на истом језику, већина језика имају тенденцију да се ослоне ка једној или другој.

Трећи начин је да иступи из језика у потпуности. Општи циљ програм трансформације система, као што су преводиоци, који прихватају описе језика и могу да обављају произвољне трансформације на тим језицима, су директни имплементатори општег метапрограмирања. Ово омогућава да се метапрограмирање примењује у готово сваком циљном језику без обзира да ли је циљани језик  било ког метапрограмирања његова способност.

Приступи[уреди | уреди извор]

У статички типизираном функционалном језику[уреди | уреди извор]

Шаблон метапрограмирања[уреди | уреди извор]

  • C препроцесорски макрои (#define)
  • C++ шаблони (функционалности попут template и constexpr)

Приређено метапрограмирање[уреди | уреди извор]

  • MetaML
  • MetaOCaml

Макро системи[уреди | уреди извор]

  • Шема хигијенских макроа
  • MacroML
  • Template Haskell

IBM/360 асемблер[уреди | уреди извор]

IBM / 360 и деривати имали су моћне макро објекте који су се често користили за генерисање комплетних програма или делове програма (за различите оперативне системе на пример). Макрои су опремљени са ЦИЦС системом за обраду трансакција који има макроа који генерише COBOL изјаве као корак унапред за прераду.

Примери[уреди | уреди извор]

Једноставан пример метапрограма је Јуникс љуска скрипта, која је пример генеративног програмирања:

#!/bin/sh
# метапрограм
echo '#!/bin/sh' >program
for I in $(seq 992)
do
        echo "echo $I" >> program
done
chmod +x program

Ова скрипта генерише нов програм који садржи 993 линије која исписују бројеве од 1 до 992, и представља једноставан генератор кода. Зависно од сложености програмског језика или окружења, генератор кода може бити више или мање интегрисан у процес компилације програма.

Квајн је посебна врста метапрограма који производи сопствени изворни код као свој излаз.

Не укључују сви метапрограми генеративно програмирање. Ако су програми модификовани у току рада или ако је постепена компилација на располагању као у C#, Форт, Фринк, Груви, Јаваскрипт, Lisp, Луа, Перл, PHP, Пајтон, REBOL, Руби, Smalltalk, и Tcl), а затим технике могу бити од користи за обављање метапрограмирања без стварног генерисања изворног кода.

Lisp је вероватно суштински језик са објектима метапрограмирања, како због свог историјског првенства и због једноставности и моћи њеног метапрограмирања. У Lisp метапрограмирању је под знацима навода оператер (обично зарез) уводи код који се оцењује у програму време дефиниције него време извршавања; погледајте само-евалуацију облика и цитирање у Lisp-у. Метапрограмски језик је идентичан домаћин у програмском језику, а постојеће Lisp рутине могу директно користити за метапрограмирање, по жељи.

Овај приступ је имплементиран у другим језицима који су укључени од стране тумача у програму, који ради директно са подацима програма. Постоје имплементације ове врсте за неке уобичајене језике на високом нивоу, као што су RemObjects’ Скриптни Паскал за Објектни Паскал.

Један стил метапрограмирања је да запосли обласно специфичан језик (DSLs). Прилично уобичајен пример коришћења DSLs укључује генеративно метапрограмирање: lex и yacc, два алата који се користе за производњу лексичких анализатора и рашчлањивање, нека корисник опише језик помоћу регуларних израза и контекстно слободне граматике, и уградити сложене алгоритме потребне за ефикасно анализирање језика.

Имплементација[уреди | уреди извор]

Види још[уреди | уреди извор]

Референце[уреди | уреди извор]

  1. ^ Course on Program Analysis and Transformation.
  2. ^ Czarnecki, Krzysztof; Eisenecker, Ulrich W. (2000). Generative Programming. ISBN 978-0-201-30977-5. 
  3. ^ for example, instance_eval in Ruby takes a string or an anonymous function.
  4. ^ Chlipala, Adam (2010). „Ur: statically-typed metaprogramming with type-level record computation” (PDF). ACM SIGPLAN Notices. PLDI '10. 45 (6): 122—133. doi:10.1145/1809028.1806612. Приступљено 29. 8. 2012. 

Литература[уреди | уреди извор]

Спољашње везе[уреди | уреди извор]