2008-10-30 5 views
9

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

ответ

13

Начать с quines, затем в Макро-Ассемблерах, а затем lex & yacc и flex & bison. Затем рассмотрите self-modifying code.

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

#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); 
} 

Теперь, если вы просто ищете вещи программисты не смотрят на противоположную нп-полной.

+0

char * p = "char * p =% c% s% c; main() {printf (p, 34, p, 34);}"; main() {printf (p, 34, p, 34);} – 2008-10-30 17:41:09

+0

Эй, вау! Вы указали переменную в коде? Мы можем это сделать? – Ziggy 2008-11-01 05:14:11

+0

Plase объясните: «Ищите противоположное f np-complete». Конечно, вы имеете в виду это наоборот? – 2008-11-04 22:09:49

8

Несомненно. Вот как работает много вирусов!

+0

К сожалению, я забыл об этом :) – 2008-10-30 16:44:56

+1

Большинство вирусов на самом деле не пишут код, они просто копируют себя или части себя в существующий код. – 2008-10-30 17:50:28

2

Да, возможно создание генераторов кода. Большую часть времени они берут ввод пользователя и выдают действительный код. Но есть и другие возможности.

Модифицирующие программы также возможны. Но они были более распространены в эпоху доз.

1

Существует целый класс таких вещей, которые называются «Генераторы кода». (Хотя, компилятор также соответствует описанию, как вы его установили). И они описывают две области этих зверей.

Большинство кода генерирует, принимает какой-либо пользовательский ввод (большинство принимает схему базы данных) и исходный код продукта, который затем скомпилирован.

Более продвинутые могут выдавать исполняемый код. С .NET существует целое пространство имен (System.CodeDom), предназначенное для создания исполняемого кода. Эти объекты, вы можете взять код C# (или другого языка), скомпилировать его и связать с ним в вашей текущей программе.

3

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

2

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

14

Если вы хотите узнать о пределах вычислимости, читать о halting problem

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

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

+0

Ты просто избил меня. +1 – Eclipse 2008-10-30 16:48:53

+0

К счастью, если проблема ограничена, она разрешима. – 2008-10-30 17:04:34

1

Я делаю это на PHP.

Чтобы сохранить настройки для класса, я сохраняю локальную переменную с именем $data. $ data - это просто словарь/хэш-таблица/ассоциативный массив (в зависимости от того, откуда вы пришли).

При загрузке класса он содержит файл php, который в основном определяет данные. Когда я сохраняю класс, он записывает PHP для каждого значения данных. Это медленный процесс записи (и в настоящее время некоторые проблемы с параллелизмом), но он быстрее, чем свет для чтения. Настолько быстрее (и легче), чем с использованием базы данных.

Что-то вроде этого не будет работать на всех языках. Это работает для меня на PHP, потому что PHP очень много на лету.

2

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

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

3

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

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

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

2

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

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

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

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

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

0

Это один из основных вопросов искусственного интеллекта. Лично я надеюсь, что это невозможно - иначе скоро я уйду с работы !!! :)

1

Всегда можно было написать генераторы кода. С технологией XML использование генераторов кода может быть важным инструментом. Предположим, вы работаете в компании, которая имеет дело с XML-файлами других компаний. Относительно просто написать программу, которая использует синтаксический анализатор XML для анализа нового XML-файла и написать другую программу, которая имеет все функции обратного вызова, настроенные для чтения XML-файлов этого формата. Вам все равно придется редактировать новую программу, чтобы она соответствовала вашим потребностям, но время разработки, когда новый XML-файл (новая структура, новые имена) значительно сокращается с помощью этого типа генератора кода. На мой взгляд, это часть прочности технологии XML.

2

сделать копию исходного кода программы она работает, изменить эту программу и добавить метод класса, который он есть, а затем запустить копию программы и завершить сам

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

2

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

Common Lisp - очень хороший язык, чтобы практиковать это, но есть и другие, где вы можете создать код и запустить его тогда и там. Как правило, это будет через функцию, называемую «eval» или что-то подобное. Perl имеет функцию «eval», и, как правило, для языков сценариев обычно есть возможность.

Существует множество программ, которые пишут другие программы, такие как yacc или bison, но они не имеют того же динамического качества, которое вы, похоже, ищете.

4

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

1

Лиспа лепет лепета лепет: р

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

(eval '(or true false)) 
2

Посмотрите на Langtom's loop. Это самый простой пример самовоспроизводящейся «программы».

1

Было бы неплохо иметь класс, который мог бы сделать копию источника запускаемой программы, изменить эту программу и добавить метод к классу, который он есть, а затем запустить копию программа и завершает свою

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

Тем не менее, есть некоторые очень общие (полезных) случаях написания кода другим кодом. Самым очевидным является любое серверное веб-приложение, которое генерирует HTML/Javascript (ну, HTML это разметка, но она в теории идентична). Также любой скрипт, который изменяет среду терминалов, обычно выводит сценарий оболочки, который вычисляется родительской оболочкой. wxGlade генерирует код для создания графических интерфейсов на основе wx-основы.

1

См. Наш DMS Software Reengineering Toolkit.Это универсальный механизм для чтения и изменения программ или создания программ путем сборки фрагментов.

0

Это называется meta-programming и является прекрасным способом написания полезных программ и интересной темы исследования. Книга Жака Питрата Artificial Beings: the conscience of a conscious machine вас должна заинтересовать. В основном это связано с компьютерными программами, основанными на мета-знаниях.

Другим связанным термином является multi-staged programming (поскольку существует несколько этапов программ, каждый из которых генерирует следующий).

Смежные вопросы