Метапрограмиране: Разлика между версии

Изтрито е съдържание Добавено е съдържание
Kikuzmanov (беседа | приноси)
Редакция без резюме
Ред 12:
Метапрограмирането обикновено работи по един от следните три начина. Първият начин представлява излагане на съставните части на рънтайм енджина на програмния код, чрез използване на [[Приложно-програмен интерфейс|приложно-програмни интерфейси]]. Вторият подход представлява динамично изпълнение на изрази, които съдържат в себе си програмни команди, често съставени от [[Низ|низове]], или от други методи, използващи аргументи или контекст<ref>например, instance_eval in [[Ruby]] takes a string or an anonymous function. {{cite web |url=http://www.ruby-doc.org/core-1.9.3/BasicObject.html#method-i-instance_eval |title=Rdoc for Class: BasicObject (Ruby 1.9.3) - instance_eval |accessdate=30 December 2011}}</ref>. По този начин, „програмите могат да пишат програми.“ Въпреки, че и двата подхода могат да се използват в един и същ [[Език за програмиране|програмен език]], при повечето езици се наблюдава тенденцията да клонят или към единия, или към другия.
Третият подход e излизане изцяло извън рамките на програмния език. Системите за трансформиране на програми с общо предназначение, каквито са например [[Компилатор|компилаторите]], представляват директни имплементации на метапрограмирането. Това дава възможност метапрограмирането да бъде прилагано на почти всеки програмен език, без значение дали този език притежава свои собствени метапрограмни способности.
 
== '''Пример:''' ==
'''Прост пример за metapragraming:  .'''
 
'''#!/bin/sh'''
 
'''# metaprogram'''
 
'''echo '#!/bin/sh' >program'''
 
'''for I in $(seq 992)'''
 
'''do'''      
 
'''echo "echo $I" >> program'''
 
'''done chmod +x program'''
 
Този код (или програма) генерира  програма на 993-реда, която принтирa  числата от 1 до 992. Това е само пример който показва как  да се използва код за писането на повече код: това не в най-ефективния начин да принтиращ списък от числа. Въпреки  това , програмист  може да напише такава  програма за по-малко от минута, която ще бъде на 100 реда.   [[Quine (computing)|Quine]]  е специален вид  метапрограма  която произвежда свой собствен изходен код. Не всичкото метапрограмиране включва генеративно програмиране(generative programmin).Ако програмите   могат да се приспособят с времето или  частично да се компилират (както в C [[C Sharp (programming language)|C#]], [[Forth (programming language)|Forth]], [https://en.wikipedia.org/w/index.php?title=Frink_(programming_language)&action=edit&redlink=1 Frink], [[Groovy (programming language)|Groovy]],[[JavaScript]], [[Lisp (programming language)|Lisp]], [[Lua (programming language)|Lua]], [[Perl]], [[PHP]], [[Python (programming language)|Python]], [[REBOL]], [[Ruby (programming language)|Ruby]], [[Smalltalk]], и [[Tcl]]), тогава технически метапрограмирането може да се изпълни без да се генерира  програмен код. Lisp е може би  най-чистият език с метапрограмирани удобства, както поради  своето   историческо предимство и поради простата и силата на метапраграмирането. В  [[Lisp (programming language)|Lisp]]  метапраграмиране, затварящия цитат оператор (обикновено със  запетая)  въвежда код.