Да Вы должны.
Преимущества (что касается любого внешнего ключа):
, я не могу думать ни о каких реальных недостатках.
Quines бесполезны в практическом смысле, но они являются отличным упражнением, которое поможет вам узнать больше о языке.
Вот очень краткий пример на python:
a='a=%r;print a%%a';print a%a
Я не могу представить никаких данных, чтобы сказать, что написание пары куин расширило мой кругозор или сделало меня лучшим программистом. Но это весело, по крайней мере, первые пару раз. Во всяком случае, вы спросили, как его написать. Я могу указать вам на некоторые хорошо написанные ссылки:
У Крейга Каплана есть аккуратная статья, в которой описывается, как на самом деле производить quines:
Вы также можете найти интересное чтение Дэвида Мадора «Куинз (самовоспроизводящиеся программы)» .
Наконец, если вы хотите увидеть реализации, посетите страницу Quine , где вы можете найти quine на разных языках и другие связанные материалы.
Quine - это компьютерная программа, которая производит копию своего собственного исходного кода в качестве единственного вывода.
Я еще не видел практического применения для одного, но уверен, что есть один где-то там.
print (lambda s:s+`s`+')')("print (lambda s:s+`s`+')')(")
#include <stdio.h>
int main(int argc, char** argv)
{
/* This macro B will expand to its argument, followed by a printf
command that prints the macro invocation as a literal string */
#define B(x) x; printf(" B(" #x ")\n");
/* This macro A will expand to a printf command that prints the
macro invocation, followed by the macro argument itself. */
#define A(x) printf(" A(" #x ")\n"); x;
/* Now we call B on the text of the program
up to this point. It will execute the command, and then cause
itself to be printed. */
B(printf("#include <stdio.h>\n\nint main(int argc, char** argv)\n{\n/*
This macro B will expand to its argument, followed by a printf\n
command that prints the macro invocation as a literal string
*/\n#define B(x) x; printf(\" B(\" #x \")\\n\");\n\n/* This macro
A will expand to a printf command that prints the\n
macro invocation, followed by the macro argument itself. */\n#define A(x)
printf(\" A(\" #x \")\\n\"); x;\n\n/* Now we call B on the text
of the program\n up to this point. It will execute the command,
and then cause\n itself to be printed. */\n"))
A(printf("/* Lastly, we call A on a command to print the remainder
of the program;\n it will cause itself to be printed, and then
execute the command. */\n}\n"))
/* Lastly, we call A on a command to print the remainder of the program;
it will cause itself to be printed, and then execute the command. */
}
Как минимум, quines - это программы, которые производят собственный исходный код в качестве вывода. Они являются необходимым шагом в построении доказательства Гёделя о неполноте .
Является ли это практическим использованием, я не могу комментировать
.Для чего используются колючки? Упражнения по программированию и вирусы.
Вирусу нужно как-то размножаться - и один из способов - превратить его в кайну. Предположим, что гипотетическая антивирусная программа будет отмечать любой процесс, который считывает собственный двоичный файл в память (чтобы передать его предполагаемой жертве); способ обойти это, чтобы он выводил сам.
Имейте в виду, что quine в машинном коде не требует компиляции.
Вот один в Python (это некрасиво; я просто написал это, чтобы попробовать). Тогда даже не знал, что это называлось quine.
def e(s): print s[:42]+s[42:].replace('#','"'); print 'e("""'+s+'""")'
e("""def e(s): print s[:42]+s[42:].replace('#','"'); print 'e(###'+s+'###)'""")
Да, и отвечу на ваш другой вопрос: Quines совершенно бесполезны.
Это мой любимый пример C
char*p="char*p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}
Две вещи, которые я извлек из него:
Как объясняли другие, quines - это программы, которые воспроизводят точные копии самих себя.
Что касается приложений, если вы думаете, что ДНК кодирует логику интерпретировать и воспроизводить себя - ответ довольно прост, без концепции quines мы бы не стали ' быть здесь, и мы никогда не сможем создать искусственную (самовоспроизводящуюся) жизнь.
Это интересный квин на с++: http://npcomplete.weebly.com/1/post/2010/02/self-reproducing-c-program-quine.html
Куины предназначены для развлечения. Они не имеют практического применения, насколько я знаю.