2010-06-19 2 views
2

ОК, для тех, кто никогда не сталкивался со сроком, является «самовоспроизводящейся» компьютерной программой. Чтобы быть более конкретным, тот, который - после исполнения - создает копию своего исходного кода в качестве единственного выхода.Функции языка полезны для написания quines (программы самопроверки)?

Конечно, quines может быть разработан на многих языках программирования (но не для всех); но некоторые языки, очевидно, более подходят для производства quines, чем другие (чтобы четко понять несколько субъективно звучащие «более подходящие», посмотрите на Haskell example vs. C example in the Wiki page - и я даю более объективное определение ниже).

Вопрос, который у меня есть, составляет с точки зрения языка программирования, какие языковые возможности (теоретические или синтаксические сахара) делают язык более подходящим/полезным для написания quines?

Мое определение «более подходящее» - «quines легче писать» и «короче/читабельнее/меньше запутано». Но вы можете добавить еще несколько критериев, которые по крайней мере объективны.

Обратите внимание, что этот вопрос явно исключает вырожденные случаи, такие как язык, который предназначен для размещения примитива print_a_quine.

+0

От взгляда на всевозможные примеры функциональные языки, по-видимому, имеют четкое преимущество (см. Примеры Haskell, Lisp или Scheme). Я не совсем уверен, почему это так, поэтому я хотел бы услышать экспертизу сообщества. – DVK

ответ

3

Я не совсем уверен, так исправьте меня, если кто-то из вас знает лучше. Я согласен с обоими другими ответами, идя дальше, объясняя, что Куайн заключается в следующем:

У г

, где Y представляет собой Y fixed-point combinator (или любой другой фиксированной точкой комбинатор), что означает, в lambda calculus:

Y г = г (Y г)

сейчас, совершенно очевидно, что нам нужен код, чтобы быть данные, g- функция, которая будет печатать свои аргументы.

Итак, для обобщения нам необходимо построить такие функции quines, функцию печати, комбинатор с фиксированной запятой и стратегию оценки по имени.

Самый маленький язык, который удовлетворяет этим условиям, - это AFAIK Zot из семейства Iota and Jot.

+0

Quine - это программа, которая может * вывести * себя. Но Y определяется в лямбда-исчислении, что не позволяет проверять функции, а тем более выводить их. Вместо этого вы должны рассмотреть вторую теорему рекурсии Клин (которая также может быть переведена на лямбда-исчисление). – Blaisorblade

3

Языки, такие как Io Programming Language и другие, позволяют обрабатывать код как данные. В системах древовидной ходьбы это обычно позволяет разработчику языка выставлять абстрактное синтаксическое дерево как гражданина первого класса. В случае с Ио это то, что он делает. Будучи объектно ориентированным, AST моделируется вокруг объектов Message, и создается специальный сторожевой сигнал для представления текущего исполняемого сообщения; этот страж называется thisMessage. thisMessage - это полное сообщение, как и любое другое, и отвечает на сообщение print, которое выводит его на экран. В результате, самый короткий Куайн я когда-либо был в состоянии произвести на любом языке, пришел из Ио и выглядит следующим образом:

thisMessage print 

Во всяком случае, я просто не мог не поделиться этим с вами по этому вопросу предмет. Вышеизложенное, безусловно, делает написание quines легким, но не делать этого таким образом, конечно, не исключает возможности легкого создания quine.

2

Я не уверен, что это полезный ответ с практической точки зрения, но есть теория полезности . В частности, фиксированные точки и Kleene's recursion theorem могут использоваться для написания quines. По-видимому, теория может быть использована для написания quine в LISP (как показывает страница на Википедии).