Можно ли написать код для написания кода? - PullRequest
9 голосов
/ 30 октября 2008

Я слышал, что есть некоторые вещи, которые нельзя делать программисту, но я не знаю, что это такое. Недавно мне пришло в голову одно: было бы неплохо иметь класс, который мог бы сделать копию исходного кода программы, которую он запускает, изменить эту программу и добавить метод к классу, в котором она находится, а затем запустить копия программы и прекращается сама. Можно ли для кода писать код?

Ответы [ 23 ]

14 голосов
/ 30 октября 2008

Если вы хотите узнать о границах вычислимости, прочитайте о проблеме остановки

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

Алан Тьюринг доказал в 1936 году, что общий алгоритм решения проблемы остановки для всех возможные пары ввода программы не могут существовать

13 голосов
/ 30 октября 2008

Начните с просмотра quines , затем Macro-Assemblers и затем lex & yacc и flex & bison . Затем рассмотрим самоизменяющийся код .

Вот квинна (отформатированная, используйте вывод в качестве нового ввода):

#include<stdio.h>

main()
{
  char *a = "main(){char *a = %c%s%c; int b = '%c'; printf(a,b,a,b,b);}";
  int b = '"';
  printf(a,b,a,b,b);
}

Теперь, если вы просто ищете вещи, которые программисты не могут сделать, посмотрите на противоположность np-complete.

8 голосов
/ 30 октября 2008

Конечно, это так. Вот так много вирусов работает!

4 голосов
/ 30 октября 2008
4 голосов
/ 30 октября 2008

Да, именно это и делает большинство макросов Lisp (только для одного примера).

3 голосов
/ 30 октября 2008

Если вы посмотрите на функциональное программирование, которое имеет много возможностей для написания кода, который генерирует дополнительный код, то, как язык, подобный Lisp, не делает различий между кодом и данными, является значительной частью его силы.

Rails генерирует различные стандартные модели и классы контроллеров из схемы базы данных при создании нового приложения. Совершенно стандартно делать подобные вещи с динамическими языками - у меня есть несколько кусочков PHP, которые генерируют php-файлы, просто потому, что это было самое простое решение проблемы, с которой я сталкивался в то время.

Так что это возможно. Что касается вопроса, который вы задаете, хотя, возможно, он немного расплывчат, какую среду и язык вы используете? Что вы ожидаете от кода и почему его нужно добавить? Конкретный пример может дать более релевантные ответы.

3 голосов
/ 30 октября 2008

Да, конечно, хотя, может быть, не в контексте, который вы имеете в виду, чтобы проверить эту запись на t4.

2 голосов
/ 30 октября 2008

Конечно можно! Фактически, если вы используете динамический язык, класс может изменить себя (или другой класс), пока программа еще работает. Он может даже создавать новые классы, которых раньше не было. Это называется метапрограммированием, и оно позволяет вашему коду стать очень гибким.

2 голосов
/ 30 октября 2008

Вы путаете / путаете два значения слова «написать». Одним из значений является физическая запись байтов на носитель, а другим - разработка программного обеспечения. Конечно, вы можете сделать так, чтобы программа делала первое, если она была предназначена для этого.

Единственный способ для программы сделать что-то, что программист явно не намеревался сделать, - вести себя как живое существо: мутировать (включать в себя кусочки среды) и реплицировать разных мутантов с различной скоростью ( избегать полного вымирания, если мутация терминальная).

2 голосов
/ 30 октября 2008

Конечно, это так. Я написал эффект для Paint.NET *, который дает вам редактор и позволяет писать графический эффект «на лету». Когда вы останавливаете ввод, он компилирует его в dll, загружает и выполняет. Теперь в редакторе вам нужно только написать реальную функцию рендеринга, все остальное, что необходимо для создания dll, записывается редактором и отправляется компилятору C #.

Вы можете скачать его бесплатно здесь: http://www.boltbait.com/pdn/codelab/

На самом деле, есть даже опция, чтобы увидеть весь код, который был написан для вас, прежде чем он будет отправлен компилятору. Файл справки (ссылка выше) рассказывает все об этом.

Исходный код также доступен для загрузки с этой страницы.

* Paint.NET - бесплатный графический редактор, который вы можете скачать здесь: http://getpaint.net

...