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

Из Википедије, слободне енциклопедије
Иди на навигацију Иди на претрагу

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

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

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

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

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

Приступи[уреди]

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

  • Употреба зависних врста омогућава доказивање да генерисан код никада није исправан.[4]

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

  • C "X Macros"
  • C++ шаблон

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

  • MetaML
  • MetaOCaml

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

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

IBM/360 асемблер[уреди]

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

Примери[уреди]

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

#!/bin/sh
# метапрограм
echo '#!/bin/sh' >програм
за I у $(seq 992)
ради
        echo "echo $I" >> програм
извршено
chmod +x програм

Ова скрипта (или програм) генерише нову 993-линију програма која исписује бројеве 1-992. Ово је само илустрација како да користите код да пише више кода; то није најефикаснији начин да одштампате списак бројева. Ипак, програмер може да пише и извршава овај метапрограм за мање од једног минута, и да ће да се генерише тачно 1000 линија кода у том временском периоду.

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

Не укључују сви метапрограми генеративно програмирање. Ако су програми модификовани у току рада или ако је постепена компилација на располагању као у 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. 

Литература[уреди]

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