Можно ли написать код для написания кода?

StackOverflow https://stackoverflow.com/questions/250868

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Начните с просмотра quines , затем макроассемблеров и затем lex & amp; yacc и flex & amp; зубр . Затем рассмотрите самоизменяющийся код .

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

#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.

Другие советы

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

  

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

     

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

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

Подумайте об этом: теория вычислимости .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Что касается искусственного интеллекта, ознакомьтесь с эволюционными алгоритмами .

  

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

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

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

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

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

Посмотрите цикл Лангтома . Это простейший пример самовоспроизводящейся «программы».

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

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

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

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

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

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

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

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

Lisp lisp lisp lisp: p

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

(eval '(or true false))
  

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

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

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

См. наш инструментарий реинжиниринга программного обеспечения DMS . Это механизм общего назначения для чтения и изменения программ или генерации программ путем сборки фрагментов.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top